再细颗粒度说说我的RAG数据库搭建方法-全部开源,含Github链接


项目已开源至:https://github.com/sgsss998/RAG_Memory_System

核心原理

说人话,这套 RAG 系统最底层的原理就是:

首先,你要先有一个关于自己的数据库,我用的是 Obsidian 的 vault,里面存放了成千上万个 Markdown 格式的文本资料。然后如果你本地修改或者新增 or 删减内容,Obsidian 会通过 GitHub 自动同步到云端。

有了数据库之后,你需要让 AI 记住你的数据,并且依据数据帮你分析。这个时候如何让 AI 记住并且理解你的数据?如果每次你都灌输超长上下文给大模型,大模型没一会儿就撑爆了,变得越来越蠢。

所以这个时候你就要建立一个基于本地的 RAG 检索系统(说白了就是本地向量库,存储着关于你的一切资料),先把你的所有 md 文本通过切片算法转化成向量,储存在一个本地的向量库里,然后大模型每次接收你的提问的时候,就自动把你的提问转化成向量,在向量库里比对有没有相关的数据,有的话就提取出来,作为单次的上下文提示词发给 LLM,然后 LLM 基于上下文来进行推理,回答你的问题。

这样就可以规避长上下文限制的问题,因为每次 LLM 只是依据检索到的一部分相关数据进行回答。

系统架构

整个系统分六层,像盖楼一样一层一层搭起来的:

  1. 用户交互层:你在 MacBook 上用 Claude Code 发问
  2. 代理网关:跑在 8080 端口,负责拦截你的请求,去记忆库里捞东西
  3. 海马体服务:跑在 8000 端口,专门负责从数据库里翻书
  4. 检索引擎:把四种检索方式串成一个流水线(向量 + BM25 + RRF 融合 + Reranker)
  5. 仓库:向量存在 ChromaDB 里,BM25 索引存在 pickle 文件里
  6. 向量化引擎:用 bge-m3 模型把文字变成数字向量

混合检索引擎

那个「检索引擎」是怎么工作的?

  • 向量检索:能理解语义,但对具体的字眼「脸盲」
  • BM25 检索:不懂你在问什么,但字面匹配极其精准
  • RRF 融合:让两个方法分头找,然后把结果拼起来
  • Reranker 精排:请一个「法官」重新打分,捕捉更细粒度的信号

切片策略

怎么切有讲究:

  1. 第一重:按 Markdown 标题切,每个标题下面的内容就是一个天然的语义单元
  2. 第二重:如果某一段还是太长,再用递归的方式微调(段落 → 句号 → 逗号 → 空格 → 强制切分)

权重系统

不删任何数据,但给不同来源的数据打上不同的权重:

  • 「核心文档」目录 → 权重 1.0
  • 「聊天记录」目录 → 权重 0.3

检索的时候,高权重的内容会优先浮上来。

Prompt 设计

最容易被忽略、但最关键的一环。

一开始用的 Prompt:「请基于以下参考资料回答。如果参考资料中没有,请回答不知道。」结果 AI 变成了「复读机」。

后来改成:「你是我的赛博外脑。以下是你唤起的记忆切片,就把它们当做你脑子里自然浮现的信息。该推理推理,该回答回答,别老是把「根据知识库」挂在嘴边。」

那个聪明的、有灵性的 AI,瞬间就回来了。

局限性

它本质上还是一个检索增强工具,不是什么「全知外脑」。

数据永远不等于知识,RAG 能给你数据,但它给不了你「理解」。 没有大纲,碎片就永远只是碎片;没有骨架,血肉就无法站立。


代码我都开源了,地址:https://github.com/sgsss998/RAG_Memory_System

里面有完整的 README,包括安装步骤、配置说明、API 文档。如果你想自己搭一套,按照 README 来就行,基本上就是克隆仓库、装依赖、下模型、建索引、启服务这几步。