想在 ESP32-S3 上搞一套完整的本地 RAG 流程
我最近在复盘一个思路:如果把知识库和 LLM 全部塞进这种只有几 MB 甚至几十 MB Flash 的微控制器里,到底能不能跑通?现在的开源项目里,要么是展示了如何在 ESP32 上跑那种极小规模的 LLM,要么是演示了在 PC 上怎么玩 RAG,但把这两者结合起来,简直是在挑战嵌入式开发的极限。
下一篇
Ollama 居然偷偷上线了一些免费的云端模型? →
按照常规逻辑,RAG 的工作流是:用户提问 → 检索本地知识库 → 喂给 LLM 做上下文 → 输出结果。但在 ESP32-S3 这种没有传统操作系统、内存(RAM)小得可怜的硬件上,这套流程面临几个非常现实的“坑”:
核心难点在哪里
- 向量检索(Retrieval)的存储问题:在 PC 上我们可以随便用 FAISS 或者 Chroma 这种向量数据库,但在微控制器上,你没法运行这些重型服务。你得考虑怎么把 Embedding 向量压缩存储在 Flash 里,并且用极低内存消耗的方式实现相似度计算。
- 内存(RAM)的生死线:ESP32-S3 哪怕带了 PSRAM,容量也跟不上大模型的胃口。跑 LLM 已经是在压榨每一比特的内存了,如果还要分出一块内存来做 Embedding 模型的推理或者检索算法的中间变量,极易触发内存溢出(OOM)。
- 计算能力的断层:检索过程涉及大量的向量点积运算,而 LLM 的推理本身就慢得像蜗牛。如果两者在同一个芯片上抢资源,响应延迟可能会让你怀疑人生。
这种场景下可能的实操路径
如果真的非要硬磕,我觉得不能走传统的“数据库+模型”路线,得走“极致精简版”的嵌入式架构:
1. 预处理阶段(离线完成):在电脑上把知识库(比如某本经书)切片,用小规模的 Embedding 模型转成向量,然后把这些向量序列化成一种极其紧凑的二进制格式,直接烧录到 ESP32 的 Flash 中。
2. 检索阶段(本地执行):不要试图在芯片上跑复杂的向量数据库。直接写一个简单的线性扫描或者基于索引的搜索算法,在 Flash 上寻找最匹配的向量。
3. 推理阶段:检索出来的文本片段(Context)拼接上用户问题,直接喂给那个已经通过量化(Quantization)压榨到极限的本地 LLM。
说实话,这事儿在技术上是有可能的,但要把“可用性”做出来,难度不亚于在指甲盖大小的地方盖一座图书馆。
免费 AI 工具箱 · 全部完全免费