OpenClaw连接本地知识库:我的RAG实践

我有一个习惯,把读过的书的笔记、工作中的技术总结、各种想法碎片全都存成Markdown文件。几年下来,积累了2000多篇笔记,放在一个本地文件夹里。

问题是,这些笔记我几乎从来不翻——不是因为不重要,而是因为找起来太麻烦。想找某个技术方案,要么搜索关键词碰运气,要么记不清文件名根本不知道从哪找。

几个月前,我把OpenClaw和本地知识库打通了,搭了一套RAG(检索增强生成)系统。现在遇到问题,直接问AI,它会在我的笔记里找答案,回答时还会标注来源是哪篇笔记。用下来感觉像是给自己装了一个"外挂大脑"。

把整个过程记录下来,希望对想做同样事情的人有参考。

技术栈选择

我用的组合是:

  • OpenClaw:主界面和对话层,负责理解问题和生成最终回答
  • Ollama:在本地运行嵌入模型,不需要把笔记内容发到云端
  • Chroma:本地向量数据库,存储和检索文档向量
  • 本地Markdown笔记:数据源,2000多篇,全部在本地

选这个组合主要是考虑隐私。笔记里有不少个人信息和工作内容,不想把原文发到任何云服务。Ollama本地跑模型、Chroma本地存数据,整个链路数据不出机器。

具体步骤

第一步:安装Chroma

pip install chromadb

然后启动本地服务:

chroma run --path ./chroma_data

默认在 localhost:8000 跑起来。

第二步:处理和导入笔记

写了一个Python脚本,遍历笔记目录,把每篇笔记按段落切分(chunk),然后用Ollama的嵌入模型转成向量,存入Chroma。

关键参数:chunk_size=500chunk_overlap=50。为什么选500字而不是更大?后面会提到,这个数字是踩坑之后调出来的。

导入2000篇笔记大概花了40分钟,生成了大约15000个chunk,都存进了Chroma的集合里。

第三步:配置Embedding模型

我用的是 nomic-embed-text,这是Ollama里专门用于文本嵌入的模型,效果比通用模型好不少,特别是在中文上。

通过Ollama拉取:

ollama pull nomic-embed-text

第四步:在OpenClaw里配置RAG Skill

OpenClaw支持自定义Skill,配置一个RAG Skill,让它在回答问题前先去Chroma检索相关内容,把检索结果作为上下文一起发给模型。

配置里需要指定Chroma的地址、集合名称、检索数量(我设的是top 5)。这样每次提问,系统会先做相似度检索,找出最相关的5个chunk,附在提示词里,AI基于这些内容生成回答。

实际效果

现在问一个问题,比如"我之前记录过哪些关于数据库索引优化的内容",2秒以内就能拿到答案,并且会告诉我这个答案来自哪篇笔记(具体到文件名和大概位置)。

2000篇笔记,检索响应时间基本在2秒以内,准确率大概在85%左右。剩下15%的失误主要是两种情况:检索到了相关内容但和问题不够契合,或者问的概念我本来就没记录过。

踩过的坑

坑一:中文分词效果很差

最开始用的是 mxbai-embed-large,一个英文为主的嵌入模型。中文笔记的检索效果非常差,很多明显相关的内容根本找不到。

换成 nomic-embed-text 之后改善明显,它对中英文混合内容的支持更好。如果你的笔记以中文为主,一定要测试几个不同的嵌入模型,不要直接用默认推荐的英文模型。

坑二:chunk太大,检索精度不高

一开始我设的chunk size是1000字,想着保留更多上下文。但实际发现检索结果质量很差,经常返回一个大段落,里面只有一两句话是相关的。

把chunk size调小到500字之后,准确率明显提升。chunk size的选择需要在"上下文完整性"和"检索精度"之间取平衡,500字对我的笔记风格来说是个合适的值,但你可能需要根据自己的文档风格调整。

坑三:笔记更新同步很慢

这是目前还没完美解决的问题。我每天都会新增和修改笔记,但向量库没有自动同步,需要手动重新导入或者增量更新。

目前的做法是写了一个脚本,检测文件修改时间,只重新处理最近7天内修改过的文件,每天定时跑一次。不够优雅,但够用。

几点补充经验

关于模型选择:嵌入模型只影响检索,生成回答的还是OpenClaw背后的大模型。嵌入模型的作用是把文字变成向量,好的嵌入模型能更准确地捕捉语义相似性。

关于检索数量:top 5是我测试下来的合适值。太少(top 3)会漏掉一些有价值的内容;太多(top 10)会引入很多噪音,反而让模型分心。

关于文档质量:垃圾进垃圾出。我发现检索效果好的笔记都是当时认真写的,有清晰的标题和结构;而那些随手记的碎片检索效果很差。这让我开始更认真对待笔记的写法。

整个搭建过程对有一些技术基础的人来说不算难,可能花一个下午就能跑起来。最大的收获不只是检索效率,而是让我重新开始认真写笔记——因为现在知道写下来真的能用到了。

你有没有搭过类似的本地知识库?用的是什么技术方案?特别想知道有没有更好的中文嵌入模型推荐,欢迎评论区交流。

3 个赞

Ollama + Chroma 这个组合我也在用,纯本地运行隐私方面放心多了。不过 embedding 模型选哪个?我用 nomic-embed-text 效果还行

2000 篇笔记检索延迟大概多少?好奇向量检索在这个量级下的性能

这个太实用了。我之前用 Obsidian + 全文搜索,确实很多时候找不到想要的内容,因为你记不住当时用的关键词。语义搜索解决的就是这个问题,「模糊地问,精准地找」。

请问 chunk 分割策略用的什么?Markdown 按标题切还是按固定长度切?这个对检索质量影响挺大的

企业里也有类似需求,不过数据量大了之后 Chroma 可能扛不住,有人试过 Milvus 或者 Qdrant 吗

收藏了,周末照着搭一个