基于本地的个人RAG数据库实践:效果不尽如人意
折腾了大半个月,我不得不承认一个让我有点沮丧的事实:我花大力气搭建的那套本地 RAG 记忆系统,效果并没有我想象中那么好。
事情的起因
今年一月份的时候,我沉迷于研究各种 AI Agent,特别是那个叫 OpenClaw 的小龙虾,它能直接在电脑上执行 Shell 命令,写代码、改文件、跑脚本,活脱脱一个住在我电脑里的「特工」。
第一次在本地跑通 OpenClaw 的时候,我盯着终端里它自己执行 ls、cat、甚至改了我一个测试文件的那几行输出,心里又兴奋又发毛。我就想,既然有这东西,那我干脆把它部署到家里的 M4 Mini 上,24 小时开机,让它帮我处理各种杂活。
远程办公链路
把 Mac Mini 从箱子里拿出来、接上线、部署 OpenClaw,然后装 Tailscale 实现远程访问。两边都装上、登录同一个账号之后,Air 上直接 ping 通了 Mini 的 Tailscale IP,SSH 上去一次就连上了。
后来在咖啡馆、在地铁上、在任何有网的地方,我都能让 Claude Code 通过这条链路连回家里的 Mini 干活,终端里敲几下,家里的机器就吭哧吭哧开始跑。
RAG 系统搭建
我 Obsidian 里存了几年下来的笔记,几十 GB,里面有我正在开发的 iOS 应用的架构图,有各种技术方案的思考,有微信导出来的聊天记录。这些东西平时躺在硬盘里吃灰,查起来特别费劲。我就想,能不能让 AI 把这些东西都「记住」?
这就是 RAG(Retrieval-Augmented Generation,检索增强生成)的用武之地。
整个系统分六层:
- 向量检索:用 bge-m3 模型把文字变成 1024 维向量
- BM25 检索:字面匹配,弥补向量检索对数字、日期「脸盲」的不足
- Reranker 精排:深度阅读模型,对候选结果重新打分
- 权重系统:给不同来源的数据打上不同的权重
- 可视化控制台:Streamlit 撸的控制台,方便查看和调整
踩过的坑
-
纯向量检索的「脸盲」问题:问「某月14号我们聊了什么」,向量检索把 7 号、21 号的内容也捞出来了。加了 BM25 才解决。
-
Reranker 导致的卡顿:没开 GPU 加速,每次查询要等一分多钟。后来加上
device='mps'把 M4 的 GPU 跑起来,延迟才降到两三秒。 -
过度过滤的代价:一开始用黑名单过滤聊天记录,结果把真正有价值的人名、事件、关系也过滤掉了。后来改成「权重系统」,不删任何数据,但高价值内容会自然浮上来。
最大的坑:Prompt
最让我沮丧的不是技术问题,而是 AI 回答得很「笨」。你问它「老明是谁」,它会翻开聊天记录,找到几条带有「老明」这个名字的消息,然后告诉你「老明的微信号为某某」,但它不敢推理「老明就是你本人」。
我打开网关的代码,发现了当初写进去的那句经典 RAG 式提示词:「请基于以下参考资料回答用户的问题。如果参考资料中没有,请直接回答不知道,不要自己编造。」
正是这句话,像一剂迷药一样把 AI 的脑子给锁死了。
后来我改了 Prompt:
「你是我的赛博外脑。以下是你唤起的深层记忆切片,就把它们当做你脑子里自然浮现的信息。该推理推理,该回答回答,别老是把『根据知识库』挂在嘴边。」
那个聪明的、有灵性的 AI,瞬间就回来了。
核心领悟
数据,永远不等于知识。 RAG 能给你数据,但它给不了你「理解」。
没有大纲,碎片就永远只是碎片;没有骨架,血肉就无法站立。不要试图用一句「严格基于参考资料」去扼杀它的推理能力,你要做的是解放它,让它站在你海量的数据之上,用它本身的智慧去俯瞰你的人生。
RAG 不是万能的,它就是一个增强版的搜索引擎。它能帮你「从自己的数据里捞东西」,但捞出来之后怎么理解、怎么推理、怎么跟你像人一样对话,取决于你有没有用 Prompt 把它绑死。