个人知识库搭建:从 Markdown 到 RAG 检索

我写技术博客十年,笔记更是记了无数——但最常发生的场景是:“我记得我记过这个,在哪来着?” 然后翻半小时文件夹。

这篇文章记录我搭建个人知识库的过程:从 Obsidian 本地 Markdown 库,到可语义检索、可 AI 问答的知识库。

一、需求与选型

需求

  1. 笔记要能"语义找":搜"怎么处理消息重复",能匹配到写于三年前的"幂等消费"笔记
  2. 要能 AI 问答:直接问"我的缓存一致性方案是什么",AI 翻笔记回答
  3. 本地优先:数据在自己手里,不上传私有云

选型(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 削峰]]

规范要点

  1. 每条笔记一个主题(别写"杂记")
  2. tags 前置(frontmatter,检索过滤用)
  3. 结论放最前(AI 摘录友好)
  4. 双链关联[[xxx]],图谱 + 上下文)

三、检索层:本地 RAG

架构

O b s i d S i f Q a r L n o e i n m t t b e m e - a d v T t d e o M t i c p a e n K r r g / k d + C o h w r n o P m r a o m p t L L M A P I

关键实现点

 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 翻笔记回答 + 给来源
写博客查历史方案 凭印象写 从知识库引用,准确性高

五、避坑清单

+ L / A L I M / t a g S s Q L i t e - v e c

总结

个人知识库的核心认知:

  1. 笔记是原料,规范是前提:RAG 的输入质量决定输出质量
  2. 本地优先:数据在自己手里,能力可扩展
  3. 混合检索 + 来源:语义找得到,回答靠得住
  4. 别过度设计:万级笔记 SQLite-vec + 本地 embedding 就够,别上分布式

知识库不是"记了多少",是"能找回多少"。 有了语义检索 + AI 问答,十年笔记第一次真正属于你。