用 AI 搭一个个人知识库:从 RAG 到知识图谱
为什么需要个人知识库?
我们每天产生大量信息——笔记、文章、代码片段、对话记录。散落在不同工具里的知识很快变成信息废墟。传统的文件夹分类结构到了几百条笔记后就很难维护:一个知识点该放哪个文件夹?有没有更好的组织方式?
AI 的加入让这个问题有了新解法。两种技术正在改变个人知识管理的方式:RAG(检索增强生成)和知识图谱。前者让你像聊天一样问自己的笔记,后者帮你发现知识点之间隐藏的关联。
RAG:让你的笔记"能对话"
RAG 的核心思路很简单:把文档切碎成小块(chunk),用向量化模型转成向量存到向量数据库里。用户提问时,同样把问题转成向量,在库里搜最相关的几个片段,再把这些片段作为上下文送给大模型,让模型基于你的笔记作答。
一个典型的个人 RAG 系统包含这几个组件:
- 文档解析器——把 PDF、Markdown、网页等格式统一转成纯文本
- 分块引擎——按段落、标题或语义边界把文本切成合理大小的片段(通常 256-1024 token)
- 嵌入模型——把文本块转成向量。推荐开源模型如 BGE-M3、bge-large-zh(中文效果好),或用 OpenAI 的 text-embedding-3-small
- 向量数据库——存储向量并支持近似最近邻搜索。Chroma 和 FAISS 适合单机个人用,Milvus 更适合团队
- LLM 推理——用 GPT-4、Claude 或本地模型(如 Qwen2.5-7B)根据检索结果生成回答
最轻量的方案是Chroma + Ollama。一条命令搭好 Ollama 服务,Python 里几行代码就能完成嵌入和检索:
import chromadb from chromadb.utils import embedding_functions client = chromadb.Client() col = client.create_collection("my_notes") col.add(documents=["文档1内容...", "文档2内容..."], ids=["1", "2"]) results = col.query(query_texts=["什么是RAG?"], n_results=3)RAG 的最大价值在于:你不必重新整理笔记结构,按原来的习惯存放就行,AI 自动帮你找到相关内容。
从 RAG 到知识图谱:关系才是知识的灵魂
RAG 很强大,但它有一个天然局限:它只做"语义匹配",不做"关系推理"。比如你笔记里记了"A 公司投资了 B 公司",又记了"B 公司与 C 大学合作",RAG 可以分别回答这两条信息,但你问"A 公司跟 C 大学有什么关系?"它就答不上了——因为 A 和 C 在两个不同的 chunk 里,没有共同的向量指向。
知识图谱正是为了解决这个问题。它不是按向量相似度找内容,而是把知识变成实体—关系—实体的三元组:
- 实体:人、公司、概念、技术等具体对象
- 关系:投资、合作、提出、属于等连接
- 三元组:(A公司, 投资, B公司) → (B公司, 合作, C大学) → 推理出 (A公司, 间接关联, C大学)
知识图谱相当于给你的笔记加了一层"关系网",让 AI 不仅能找到相关内容,还能沿着关系链做推理。
两者结合:最佳实践
在实践中,RAG 和知识图谱不是二选一,而是互补的。推荐这样的混合架构:
第一层——RAG 做初筛。用户提问后,先通过向量检索拿到最相关的 3-5 个文本片段。这一步保证能找到语义上相关的内容。
第二层——知识图谱做扩展。从检索到的片段中提取命名实体,在图谱里顺藤摸瓜找到扩展节点。比如搜到"Transformer 架构"的片段,图谱里可能关联了"自注意力机制"、"多头注意力"、"位置编码"等概念,把它们也加入上下文。
第三层——LLM 综合回答。把初筛片段 + 图谱扩展信息一起喂给大模型,生成最终回答。
实现上,Neo4j + LangChain是一个成熟的组合。LangChain 的 GraphCypherQAChain 可以自动把自然语言问题转成 Cypher 查询去图数据库里搜:
from langchain_community.graphs import Neo4jGraph from langchain.chains import GraphCypherQAChain graph = Neo4jGraph(url="bolt://localhost:7687", username="neo4j", password="password") chain = GraphCypherQAChain.from_llm(llm=llm, graph=graph) result = chain.invoke("A公司与C大学之间有什么关联?")搭建指南:从零开始
如果你想自己搭一个个人知识库,这里我推荐一个渐进式的路线:
阶段一:纯 RAG(1 小时)。装 Chroma 和 Ollama,把你的笔记丢进去,能搜能问就行。这是最简单的入手方式。
阶段二:RAG + 知识提取(半天)。在 RAG 基础上加一个 LLM 提取步骤——每次写入新笔记时,用 LLM 自动抽取出实体和关系,存到 Neo4j 里。这一步是纯自动化的。
阶段三:全量图谱推理(1-2 天)。把整个知识库都过一遍图谱提取,建立完整的实体关系网络。这时你可以问"公司X的技术栈跟公司Y的有什么重叠?"这样的跨文档推理问题。
阶段四:可观测与改进(持续)。加一个查询分析层,记录哪些问题检索不到答案,分析是 chunk 策略问题、嵌入模型适配问题还是图谱覆盖不全,持续迭代。
一些实战体会
在实际搭建过程中,有几个容易被忽略的点:
- Chunk 策略比模型选择更重要。对中文笔记,按段落分块(256-512 字)通常比按固定 token 数分块效果好得多,因为中文的语义边界更自然
- 图谱提取的质量取决于 LLM。用 Qwen2.5-7B 提取中文实体关系效果不错,但偶尔会抽出"噪声三元组"(明显不合理的关联),需要用规则过滤一下
- 本地部署完全可行。Chroma + Ollama + Neo4j 社区版,16GB 内存的机器就能跑全套。推理用 Qwen2.5-7B 或 DeepSeek-Coder-V2-Lite,速度完全可接受
- 千万不要想着一步到位。先跑通 RAG 再叠加图谱,比一开始就搭完整架构要快得多。80% 的日常查询纯 RAG 就能满足,图谱只在跨文档推理时才真正发光
总结
RAG 让笔记变得"可对话",知识图谱让笔记变得"可推理"。两者结合,个人知识库就从静态的文档仓库升级成了动态的智能体——它能主动建立你还没意识到的关联,帮你发现知识盲区,甚至提示你某个领域的研究趋势。这是一个值得投入的方向,因为知识管理的效率最终决定了学习的速度。
