2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家
我用 SQLite 处理一切。
多年来,当别人问我“数据该存在哪里”时,我的默认答案就是它。配置文件、传感器日志、用户数据,甚至模型输出——SQLite 都能搞定。当我开始构建一个需要设备端记忆能力的人工智能机器人时,选择似乎显而易见:嵌入 SQLite,搞定。
三周后,机器人的记忆变成了一堆互不兼容的数据结构,我为每种数据类型都编写了自定义的序列化代码,光是为了存储和读取非文本或数字类型的数据(比如图像嵌入、音频指纹、传感器状态向量),就累积了大约 400 行胶水代码。
这时我才开始质疑:SQLite 真的是解决这个问题的正确工具,还是仅仅因为我熟悉它?
人工智能代理真正需要记住什么
在你实际构建机器人记忆系统之前,有一件事并不明显:人工智能代理记住的不是一行行数据,而是瞬间——即多模态的状态快照。
一个“瞬间”可能包含:
- 来自摄像头的 512 维人脸嵌入向量
- 一个时间戳
- 一段关联的音频片段(4KB PCM 格式)
- 一个置信度分数
- 一个标签(“这是主人”)
在 SQLite 中存储这些内容需要:一个 TEXT 字段用于嵌入向量(以 JSON 或 base64 序列化)、一个 BLOB 字段用于音频、两个 REAL 字段和一个 TEXT 字段。而在读取时,你又得把所有内容反序列化回来。对于单条记录,这没问题;但当你需要在 10,000 条记录中找出与当前画面中最相似的 5 张人脸时,问题就来了:你加载了根本不需要的 BLOB 数据,反序列化出向量后又立刻重新编码用于比对,还得在 Python 中逐行计算相似度。
我让 SQLite 去解决一个它本不该解决的问题。
真正的性能瓶颈
让我分享一下我在实际环境中的测试数据(树莓派 5,8GB 内存):
SQLite 方案:
- 存储一个人脸嵌入向量(512 维 float32 数组):平均约 2.1 毫秒
- 在 1,000 条记录中查找最相似的 5 张人脸:约 340 毫秒(全表扫描 + Python 计算余弦相似度)
- 为比对加载 1,000 个嵌入向量所占用的内存:约 180MB
问题在于:340 毫秒的识别延迟是人能明显感知到的。一个在认出熟人时还要停顿三分之一秒的机器人,会让人觉得它坏了。而且仅嵌入向量就占用了 180MB 内存——虽然在 8GB 内存的设备上目前还能接受,但当记录数达到 10,000 条时又会怎样?
瓶颈并不在于 SQLite 执行 SQL 查询的速度慢,而在于 SQLite 的抽象模型根本不适合向量相似度搜索。
moteDB 登场
在我撞上这堵墙之后,便开始开发 moteDB。它的设计目标非常明确:用 Rust 编写一个嵌入式数据库,原生支持多模态数据,并将向量搜索作为核心操作,专门面向边缘设备和物联网硬件。
与 SQLite 的核心区别在于数据模型。moteDB 不使用表和行,而是存储片段——即带有类型的单元数据,可以是嵌入向量、二进制大对象、标量值或结构化记录。“记忆”则是一组带有时间戳和上下文元数据的片段集合。向量搜索可直接在嵌入片段上进行,无需反序列化。
# Cargo.toml
[dependencies]
motedb = "0.1.6"
use motedb::{Mote, 免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。