我把775篇收藏塞进4MB向量库:一个比Karpathy Wiki更能"翻箱底"的RAG skill

我把 775 篇收藏的文章塞进一个 4MB 的向量库,然后问它:"我都收藏过哪些关于 loop engineering 的资料?"三秒钟,它把散在六七篇文章里的观点拼成一段答案,每条都带出处。

这不是什么 SaaS 产品,是我自己写的一个 skill,叫 chao-rag-wiki。今天聊聊它,顺便聊聊它背后那个问题:知识库越攒越大,你到底怎么"读"它?

得先从 Karpathy 的一个想法说起。


一、Karpathy 的"LLM Wiki":让 AI 替你维护知识库

起点是 Andrej Karpathy 抛出的一句话:

"The LLM writes and maintains the wiki; the human reads and asks questions."
(LLM 负责写和维护 wiki,人类负责读和提问。)

有人把这句话做成了一个 skill —— karpathy-llm-wiki。玩法是这样:

你有两个目录。raw/ 放原始素材,只读、永不修改——收藏的推文、文章、论文都丢这里。wiki/ 放编译后的知识文章,AI 全权打理。

每往 raw/ 加一篇新素材,AI 就把它"编译"进 wiki:判断这篇属于哪个已有主题,跟某篇是同一个核心论点就合并进去、更新段落,全新概念就新建一篇,顺便检查跟已有内容有没有冲突、有就标出来。最后维护一个 wiki/index.md 全局索引,每篇一行——链接、摘要、更新日期。

你查询的时候("我知道哪些关于 X 的东西?"),AI 先读 index.md 定位到相关文章,打开那几篇,再综合作答。

这个设计很优雅,本质是用 AI 把碎片素材沉淀成结构化的知识资产,而且会随时间复利增长。读起来像一本你自己的、不断长大的百科全书。

但它有个隐含前提:素材得先被"编译"进 wiki,才搜得到。下面这个 skill,想绕开的就是这件事。


二、chao-rag-wiki:不编译,直接检索

我借了 karpathy-llm-wiki 的"raw/ 只读"哲学,但把后半段换成了 RAG(检索增强生成)。

一句话说清区别:karpathy-llm-wiki 是先把书写好再去翻书;chao-rag-wiki 是书原样不动,但给每一页都建了语义索引,随问随搜。

技术栈是这么几块拼的:

1. 向量检索用 turbovec Google Research 的 TurboQuant 算法的 Rust 实现,能把向量压 16 倍还几乎不掉精度——上一篇我专门拆过。我的 775 篇切成 9089 个 chunk(去重后),整个索引才 4.8MB,常驻内存毫无压力。

2. 嵌入默认使用千帆的 bge-large-zh(1024 维),但接口跟 provider 无关。 想换 OpenAI、Voyage 或本地模型都行,只改环境变量,不动代码。key 全走环境变量,绝不硬编码。

3. 混合检索(Hybrid RAG),这是关键。 同时跑两路:稠密向量检索管语义,知道"自我迭代"和"循环"是一回事;BM25 关键词检索管字面,能精确命中 rotate_writer.go 这种代码标识符、人名、专有词。两路结果用 RRF(Reciprocal Rank Fusion,倒数排名融合)合并。语义检索擅长"意思对但用词不同",关键词检索擅长"就要这个词",融合之后两头都不漏。

4. 可选的 LLM 重排(rerank)。 检索快但粗,再拉一个 LLM 当"相关性裁判"给候选打分重排,精度优先时加 --rerank 就行。

5. 建索引时按 chunk 文本哈希去重。 raw/ 里同一段内容存了多份副本的话,只留一份进库,免得副本在结果里挤名额——我这 775 篇就压掉了 706 个重复 chunk。

优缺点摆出来

先说好的:

  • 零编译延迟。新素材丢进 raw/,跑一句增量索引就搜得到,不用 AI 逐篇消化。而且增量索引按内容哈希只处理新增和改动的文件,没变化就几秒退出。

  • 召回更全。它检索的是原始全文的每个片段。哪怕某个话题你压根没想过给它单独建篇文章,只要素材里提过,就搜得到。

  • 混合检索加重排加去重,对中英混排、专有名词、长尾问题都更稳。同一段内容在 raw/ 里有多份副本,建索引时按 chunk 文本哈希自动合并,结果不会被副本占名额——但保留"另见 N 份副本"的来源信息,去重不丢信息。

再说差的,这些恰好是 karpathy-llm-wiki 的强项:

  • 它没有知识沉淀,给你的是原文片段拼盘,不是一篇消化过、把内部矛盾理顺了的文章。karpathy-llm-wiki 那边的 wiki 文章是真正的二次创作,读起来成体系。

  • 它只能精确去重。逐字相同的副本能干净合并,但"同一篇、有细微编辑差异"的近似重复就认不出来了——那得上 MinHash 或 SimHash,复杂得多。

  • 它依赖在线 embedding,查询要联网(或者本地部署的大模型)、有 API 成本(BM25 那一路不用)。

说白了,karpathy-llm-wiki 重"沉淀",chao-rag-wiki 重"召回"。前者像精心整理的笔记本,后者像一个全文搜索引擎。


三、实战对比:两个查询

光说不练假把式。同样两个问题,两个 skill 各跑一遍。

自从 Karpathy的llm-wiki理念提出来之后,我收集资料的时候特意使用Obsidian web clipper进行收集,最近几个月也收集了700多篇资料,也在Hermes中建立了llm-wiki,这次我使用chao-rag-wiki 建立了RAG索引,让我们比较一下这两个skill搜索资料的效果。

查询一:"loop engineering"

chao-rag-wiki(hybrid + rerank)召回了散在多篇原文里的片段:

1
2
3
4
5
6
7
[1] rerank=8.0  PART 2: WHAT LOOP ENGINEERING ACTUALLY IS
articles/...Loops What Every AI Engineer Needs to Know in 2026.md
[2] rerank=7.0 工程化的三个层次
articles/...深度拆解:AI 智能体 Harness 的构造.md
[3] rerank=7.0 Most Developers Do Not Need Agent Loops Yet
[4] rerank=7.0 Agent Harness 拆解:AI Agent 真正的工程底座
[5] rerank=6.0 > I don't talk to an agent anymore, I talk to a loop

它直接定位到讲 loop engineering 五阶段(DISCOVER→PLAN→EXECUTE→VERIFY→ITERATE)的原文段落,连"大多数开发者其实还不需要 loop"这种唱反调的视角也捞了出来——因为那篇文章确实在我素材里。

karpathy-llm-wiki 呢?它在 wiki/index.md 里一搜就命中一篇编译好的文章:

1
2
3
| Loop Engineering: 从提示 Agent 到设计循环 | 2026 年 6 月爆发的 AI 编程
新范式:五个原语(Automations/Worktrees/Skills/Connectors/Sub-agents)
+状态记忆,四条件测试,最小可行 Loop,刹车配置与四种死法 | 2026-06-24 |

打开是一份消化整合过的结构化笔记:核心定义、Boris Cherny 的三阶段演化、五个必需品表格、引用了 8 个来源,读起来一气呵成。

这一局 karpathy-llm-wiki 赢在成品质量。loop engineering 是热门话题,我早让它编译过一篇。chao-rag-wiki 给的是原料,它给的是成菜。

查询二:"grill skill"

这局反过来了。

chao-rag-wiki(hybrid + rerank):

1
2
3
4
5
6
7
8
[1] rerank/score  Mattpocock Skills 系统:AI Agent 的能力单元 › SKILL.md 的文件结构
sources/AI时代的程序员/02 Mattpocock Skills系统.md
[2] Productivity Skills
sources/AI时代的程序员/《AI时代的软件工程》-图书大纲.md
[3] skill_manage 操作分发 (+1 dup copies)
articles/2026-04-12 -Hermes Agent 源码解析.md
[5] Productivity —— grill-me / caveman / handoff...
articles/...mattpocock skills Skills for Real Engineers.md › #1: The Agent Didn't Do What I Want

干净命中 mattpocock 技能库里 grill-megrill-with-docs 的介绍——"写代码前先让 AI 反过来拷问你"。注意第 3 条后面那个 (+1 dup copies):去重把那篇的副本合并成一条、留了来源标记,没让重复内容占掉好几个名额。

karpathy-llm-wiki 呢?我去 wiki/index.md 里搜 "grill"、"mattpocock"、"拷问"……

一条都没有。

不是说我素材里没有 grill 相关内容——有,好几篇正文都提了 /grill-me。问题是这个话题从没被单独编译成一篇 wiki 文章,index.md 里就没它的入口。按 karpathy-wiki "先读 index 再定位文章"的路子,它要么直接漏掉这个查询,要么只能模糊地甩你一篇泛泛的"agent skills 框架"。

这一局 chao-rag-wiki 完胜。它检索全文,根本不在乎你立没立过条目。


四、所以到底用哪个?

两个查询跑下来,结论挺清楚:它俩不是替代关系,是互补关系。

karpathy-llm-wiki chao-rag-wiki
核心机制 AI 编译素材成文章 RAG 全文语义检索
查询方式 读 index → 定位文章 向量+BM25 混合检索+重排
强项 热门话题、成体系的沉淀 全量召回、长尾话题、专有名词
弱项 没编译过的话题会漏 给原料而非成品、只能精确去重
延迟 编译慢、查询快 索引快、查询需联网
想读一篇消化好的总结,问 karpathy-llm-wiki;想确认"我到底收藏过啥"、找长尾、找冷门词,用 chao-rag-wiki

我现在就是这么用的:chao-rag-wiki 当全文搜索引擎兜底召回,karpathy-llm-wiki 当精编笔记本沉淀热点。一个保证不漏,一个保证好读。


五、把它接进 Obsidian:从"看到"到"可搜"

前面讲的都是 skill 本身。可知识库要真转起来,得先解决一个更前面的问题:素材怎么进来?总不能每篇手动复制粘贴。

我这套链路全自动,分三段。

第一段:Web Clipper 抓取,落到 raw/

Obsidian Web Clipper 是官方的浏览器插件,Chrome、Edge、Firefox 都有。看到一篇好文章、一条推文,点一下插件图标,它就把正文提取成干净的 Markdown,存进你的 Obsidian vault。

它能配模板和保存路径,这是关键。我把模板的目标文件夹设成 vault 里的 raw/articles/,文件名用 {{date}} -{{author}}-{{title}},再让它自动带上来源 URL、抓取日期这些 frontmatter。于是浏览中随手一点,文章就躺进了 raw/——正好是两个 skill 都约定"只读、不改"的那个源目录。我那 775 篇,基本就是这么攒的。

第二段:定时任务自动索引

素材进来了,但还没"可搜"。这步交给定时任务——raw/ 每天在长,那就让索引每天自己追上:

1
2
3
4
# crontab:每天凌晨 3:07 增量索引(错峰,别卡整点)
7 3 * * * cd ~/Obsidian-Vault && \
~/.claude/skills/chao-rag-wiki/.venv/bin/python \
~/.claude/skills/chao-rag-wiki/scripts/build_rag.py --raw raw --out .rag --update

前面说了,--update 按内容哈希只处理新增和改动的文件,没变化就几秒退出、零 API 调用,所以天天跑也不浪费。Web Clipper 当天剪的新文章,第二天一早就进了向量库。

karpathy-llm-wiki 那一路同理,挂个任务把当天 raw/ 的新文件编译进 wiki 沉淀下来就行。两条管道并行:chao-rag 让每篇立刻可搜,karpathy-wiki 把值得沉淀的编成文章。

实际上是在我的Mac mini m2上的Hermes中配置了定时任务,每天凌晨调用这个skill进行索引处理。

第三段:随时调用 skill 搜索

闭环这就成了。想找东西,直接在 Claude Code 里调:

  • /chao-rag-wiki 找出关于 X 的资料——全文混合检索,长尾、冷门词都捞得到;
  • /karpathy-llm-wiki 我都知道哪些关于 X 的东西——读编译好的精编文章。

整条链路连起来就是:浏览时点一下 Web Clipper,文章落进 raw/,定时任务自动索引,想搜时一句话调 skill。你只管"看到好东西点一下"和"有问题问一句",中间的剪藏、入库、索引全自动。Karpathy 那句"人类负责读和提问",落地大概就是这个样子。


安装

chao-rag-wiki 已经开源,一行命令装上:

1
npx skills add smallnest/chao-rag-wiki

配好一个 embedding 的 key(默认千帆,也支持 OpenAI、Voyage 或任意 OpenAI 兼容网关),素材丢进 raw/,跑一句 build 就能开问。再按第五节配好 Web Clipper 模板和定时任务,整个知识库就自己转起来了。

最后留个彩蛋:写这篇时,"两个 skill 各跑两个查询、对比结果"那一步,就是 chao-rag-wiki 自己检索出来的。它检索自己被讨论的素材,多少有点自产自销。RAG 的尽头,没准就是让知识库学会自我介绍。