个人知识库搭建:从 Markdown 到 RAG 检索#
我写技术博客十年,笔记更是记了无数——但最常发生的场景是:“我记得我记过这个,在哪来着?” 然后翻半小时文件夹。
这篇文章记录我搭建个人知识库的过程:从 Obsidian 本地 Markdown 库,到可语义检索、可 AI 问答的知识库。
一、需求与选型#
- 笔记要能"语义找":搜"怎么处理消息重复",能匹配到写于三年前的"幂等消费"笔记
- 要能 AI 问答:直接问"我的缓存一致性方案是什么",AI 翻笔记回答
- 本地优先:数据在自己手里,不上传私有云
选型(2025 年初的调研结论)#
| 方案 |
类型 |
优点 |
缺点 |
| Obsidian + 官方 Sync |
笔记+同步 |
双链、插件生态 |
检索是关键词,无语义 |
| 自建知识库(Dify/WeKNora 类) |
本地 RAG |
语义检索 + 问答 |
要维护服务 |
| 本地向量库 + RAG 工具链 |
自建 |
完全可控 |
要一点工程 |
| 语雀/Notion AI |
云 |
开箱即用 |
数据在别人那 |
我的结论:笔记本体用 Obsidian(本地 Markdown),检索层自己搭 RAG 流水线——数据永远本地,检索能力可编程扩展。
二、笔记规范:RAG 的前提#
先泼冷水:笔记不规范化,什么 RAG 都救不了你。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 消息幂等方案
---
tags: [消息队列, 幂等, RabbitMQ]
date: 2023-01-15
status: 常用方案
---
## 核心结论
MQ at-least-once 投递下,消费端必须幂等。
方案:唯一键 + INSERT IGNORE / Redis SETNX / 业务状态机。
## 细节
...
## 关联
[[RabbitMQ 削峰]]
|
规范要点:
- 每条笔记一个主题(别写"杂记")
- tags 前置(frontmatter,检索过滤用)
- 结论放最前(AI 摘录友好)
- 双链关联(
[[xxx]],图谱 + 上下文)
三、检索层:本地 RAG#
关键实现点#
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 检索核心(简化)
def ask(query):
# 1. 混合检索:向量 + 关键词
vec_hits = vector_search(query, top=10)
kw_hits = keyword_search(query, top=10) # 标题/标签命中
candidates = merge(vec_hits, kw_hits)
# 2. 重排:相关度排序
ranked = rerank(query, candidates, top=5)
# 3. 拼 Prompt 问答(带来源)
context = "\n\n".join(f"[{h.note}]: {h.content}" for h in ranked)
return llm.chat(f"基于以下笔记回答:\n{context}\n问题:{query}")
|
我的踩坑(和《RAG 工程化》一致):
- 切分按 Markdown 标题,不按固定 token
- 必须带来源(哪篇笔记),AI 回答可追溯
- 混合检索(向量 + 关键词),标题命中权重高
- 增量索引:笔记变更才重建该篇向量
四、落地效果#
| 场景 |
之前 |
之后 |
| 找"幂等方案"笔记 |
关键词搜不到,翻 10 分钟 |
语义检索秒出 |
| 问"我的缓存方案" |
凭记忆回忆 |
AI 翻笔记回答 + 给来源 |
| 写博客查历史方案 |
凭印象写 |
从知识库引用,准确性高 |
五、避坑清单#
个人知识库的核心认知:
- 笔记是原料,规范是前提:RAG 的输入质量决定输出质量
- 本地优先:数据在自己手里,能力可扩展
- 混合检索 + 来源:语义找得到,回答靠得住
- 别过度设计:万级笔记 SQLite-vec + 本地 embedding 就够,别上分布式
知识库不是"记了多少",是"能找回多少"。 有了语义检索 + AI 问答,十年笔记第一次真正属于你。
微信公众号「福清而不淡」
后端架构 · AI 工程 · 云原生的一线实践,扫码关注,不错过更新。
本文已同步发布到公众号,欢迎留言交流。