知识库工程 · 内部工具

做课系统
一个会自己保鲜的
课程知识库

资料丢进去,它整理成结构化的知识库;源文件删掉,它自动回滚派生内容。 每页标着证据等级,所以做课时你知道哪句话能直接讲、哪句要加限定语。 人不写知识库,人只负责选料和提问。

架构层
3层
核心机制
4条
技能
8个
需手动维护的索引
0个
01

它取代的,是「每次都从头拼一遍」

这是整套设计的出发点。绝大多数人用 AI 处理文档的方式是 RAG:上传一批文件,提问,模型现找现拼。它工作,但不积累。

RAG · 每次重新发现

  1. 上传 200 份文件
  2. 提问「客户最在意什么」
  3. 模型检索相关片段,当场拼一个答案
  4. 再问一个需要综合五份文件的问题 —— 从头再拼一遍
  5. 答案留在聊天记录里,下周没人找得到

问题不在检索质量,在没有沉淀。问了 100 次,知识库还是那 200 份文件。

本系统 · 编译一次,持续保鲜

  1. 把 200 份文件丢进原材料目录
  2. 跑一次同步,整理成 400 个互相链接的页面
  3. 提问时读索引定位,不再是全文检索
  4. 好的回答写回库,变成新页面
  5. 源文件删了,派生页面自动回滚

库是持久产物。矛盾已经被标记,交叉引用已经建好,上次的分析还在。

维护知识库最烦的不是读和想,是记账 —— 更新交叉引用、保持摘要新鲜、标记新数据推翻了旧结论。 人在放弃,因为维护成本增长快于价值增长。而模型不会烦,也不会忘记改一处引用。 — Karpathy, llm-wiki(2026)· 本系统的方法论来源

所以这套系统的分工是:人负责选料、判断、提问;模型负责摘录、交叉引用、归档、记账。人不写页面,一页都不写。

02

三层:原材料、知识库、契约

层与层之间的单向性,是整套系统能保持新鲜度的前提。

三阶段知识流水线示意图:左侧只进不改的原材料箱,中间模型正在整理的互联知识页与索引日志,右侧课程产出,下方红色虚线表示删除源后的回滚路径
图 01 · 一次同步的完整路径 左:原材料箱上的锁=只进不改。模型读它,但从不修改它。
中:模型把文件整理成互相链接的页面,同时维护索引本(index.md)和日志卷轴(CHANGELOG.md)。上方四色徽章 A B C D 是每页必带的证据等级。
右:从库里取材产出的大纲、课件、讲师手册。
下方红色虚线:删掉一个源文件后,它派生出来的页面会被回滚归档 —— 这是大多数 RAG 方案根本处理不了的动作。
层目录职责谁写
原材料00-原材料/唯一输入区。不限文件类型。只增不改 —— 要更新就放新版本进去,让系统识别为新文件人
知识库10-知识库/全 Markdown。四个子目录:sources / topics / entities / modules,外加索引与元数据模型
契约_meta/约定.md页面格式、证据分级、溯源规则、写作红线。改它等于改法律,必须登记起因人 + 模型共演化
产出20-课程产出/按课程分目录:需求确认 → 大纲 → 模块详案 → 课件 → 讲师手册模型起草,人审

磁盘上真正有什么 结构

# 原材料目录,永不修改
00-原材料/
  _inbox/             随手丢,同步时再分流
  01-行业资料/  02-客户与需求/  03-课程素材/  04-竞品与参考/

# 知识库,模型全权维护
10-知识库/
  index.md            业务地图 —— 按业务问题分区,不是按文件
  _meta/
    manifest.json     每个源文件的 size + mtime + sha256 + 派生了哪些页
    derivations.jsonl 关系图:哪个源派生了哪页,哪页引用了哪页
    CHANGELOG.md      人读日志,统一前缀可 grep
    矛盾登记.md        两份资料打架时的裁决记录
    约定.md            宪法
  _archive/           因源删除而归档的页,可回溯
  sources/  topics/  entities/  modules/

关键约束:文件系统是唯一真相源。索引、关系图、业务地图全部可以从 Markdown 文件重新算出。这意味着即使元数据全丢了,只要有原材料和页面,库还能重建 —— 只是会丢掉历史。哪些丢了能重建、哪些不能,写在契约第八节。

03

四条机制,各解决一个具体的死法

这四条不是功能列表,是从「知识库怎么烂掉」倒推出来的。

3.1 增量靠指纹,不靠记忆 解决:重复劳动

每个源文件在 manifest.json 里有一条记录。扫描时按指纹算出五类差异,而不是问模型"哪些是新的"。

分类判据动作
NEWmanifest 无,磁盘有整理成页面,登记派生关系
CHANGEDsha256 变了重读、更新页面、刷新派生页
DELETEDmanifest 有,磁盘没了回滚(见 3.2)
MOVEDsha256 相同但路径变了只改引用,不重做内容
UNCHANGEDsize 与 mtime 都没变跳过,连 hash 都不算

为什么不能让模型记:上下文会丢、会话会断、三个人同时用会互相不知道。指纹存在磁盘上,谁跑都是同一个结果。这是整套系统和"直接跟模型聊天"的分界线。

3.2 回滚分三档,而不是一刀切删 解决:误删连带毁掉成果

一个主题页可能综合了 5 份资料。删其中 1 份就把整页删掉,等于把另外 4 份的成果一起扔了。所以按依赖关系分三档:

情形判据处理
独占页来源列表只有这一个移入 _archive/,原位置删除。不物理销毁
共享页来源有多个摘掉该源 → 标 stale → 进重建队列,等用剩余源重合成
级联页引用了被归档的页标 stale,提示人工复核:改写引用还是删掉那句话

回滚的依据是页面 frontmatter 里的 sources: —— 填的是原材料相对路径,一字不差。这个字段写错一个字,回滚就找不到该删的页。所以它是契约里的头号硬约束。

3.3 索引三层,越往下越贵 解决:库大了查不动

层文件回答什么成本
L1index.md我该从哪个方向找(按业务问题分区,不按文件)读一屏
L2*/_index.md这个方向下有哪些页,每页一句话自动生成
L3页面 frontmatter这页具体讲什么、什么等级、来自哪些源读十行

检索遵守「命中即停」:L1 能定位就不翻 L2,L2 能定位就不全文 grep。300 份源、上千个页面时,这套索引仍然不需要向量数据库。

3.4 每页必标证据等级 解决:课上被问倒

做课最大的风险不是没内容,是把 C 级经验当成 A 级数据讲给客户听。学员里总有一个人会问"这个 42% 哪来的"。

A

一手数据,口径明确,能当场调原文核对

国家统计局 · 财报 · 客户书面台账
→ 直接讲,标出处
B

有报告支撑,但样本小、口径不明、或只有一家在做

咨询白皮书 · 行业调研 · 单案例
→ 说「某机构测算」
C

从业者经验、行业共识,说不出具体来源

讲师判断 · 同行说法
→ 说「我们的经验是」,不当结论
D

推断、假设、未验证

模型分析 · 待验证猜想
→ 不上课件

木桶规则:页面的等级取它所有内容里最弱的那一条。topic 页不得高于它来源的最低级 —— 合成不会提高证据强度,只会稀释。

做课配比:讲授内容里 A+B 不低于 60%。低于 40% 就得改定位,别包装成"有数据支撑的课"。这条由 kb.py lint 监控(EVIDENCE_INFLATED),也是这套系统里唯一能自动拦住"吹牛"的地方。

04

两条方向相反的路,不能混

一个仓库根目录下的 AGENTS.md 只在讲这一件事:进来的人(或模型)先判断自己在做哪件事。

维度补料 · 往库里加取材 · 从库里拿
典型说法丢了资料、同步、删了源、整理做一门课、查一下、出大纲、要课件
能否补充原文件没有的不能。只允许搬,不允许造能。可以组合、提炼、编排
出处要求指回原文件的具体段落每个数字标脚注或双链
缺东西时标「待核实」,不许猜明说「库里没有」,不许编
证据等级按原文件性质如实定不得高于所用素材的最低级
做完必须登记派生关系(kb.py mark)把缺口写进补料清单
补料在给库里攒信用,取材在花信用。
补料时随手编一句,三个月后做课就会把它当事实讲给客户。

这个划分来自另一类项目:一个由 AI 维护的公开知识库,用同一个文件名把"改内容"和"用内容回答"拆成两套规则,因为两者的容错空间完全相反。改内容时错一个字会污染整库,回答时保守一点最多是少说一句。

05

八项能力,一个入口

脚本管结构,技能管语义。两者不越界。

命令行 · 90-工具/kb.py

命令做什么谁用
guide自描述入口:这是什么、铁律、当前状态、下一步。新会话第一件事模型
status一行看全库:源数、页数、待处理、陈旧页人 + 模型
scan五类差异,--json 给程序用模型
mark登记"这个源已整理成哪几页"模型
retract源删除后回滚:归档 / 降级 / 级联模型
move源移动:只改引用,不重做内容模型
graph重建关系图和四个目录索引模型
lint结构体检:死链、孤儿、缺字段、等级虚高人 + 模型
check结构 + 内容一起过(聚合器)提交前

两个检查器,各查一件事

把它们分开不是洁癖。结构对了不等于内容能用,而一个查七件事的脚本,改其中一条规则时会牵连其他六条,最后没人敢动。

检查器只管典型问题
kb.py lint结构:链接、字段、来源、等级一致性死链、孤儿页、等级虚高、D 级进课件
check-content.py内容:文风与出处AI 腔、超 60 字长句、带单位的数字没出处

内容检查器有一条设计原则值得单独说:宁可漏,不可误报。词表只收确实反复出现过的毛病,因为一份没人看的检查报告比没有检查更糟 —— 它给你一种"有人在管"的错觉。

八个技能

技能职责
course-factory总入口:诊断、分流、维护编排
kb-sync增量同步编排:五类差异逐个处理
kb-ingest单源精读:一个文件该拆几页、怎么命名、定什么等级
kb-query五级检索路由,外带"把好答案写回库"
kb-lint体检与分派修复
kb-index索引维护、合并拆页、业务地图重组
course-outline澄清需求 → 取材 → 大纲 → 模块详案 → 缺口报告
course-slides大纲 → 授课 PPT + 讲师备注
06

怎么用:从空库到第一门课

日常只有三个动作:丢进去、等一下、拿出来用。

01
确认工具在

cd 做课系统 && python 90-工具/kb.py guide
空库会提示"把资料丢进 00-原材料/"。如果报找不到文件,说明当前目录不对。

02
丢第一批资料

把 PDF、Word、PPT、Excel、录音、截图放进 00-原材料/ 的对应子目录。拿不准放哪就丢 _inbox/,同步时会分流。文件类型不限,读不了的会如实标注。

03
说「同步知识库」

模型会跑 scan 拿到精确差异,逐个整理成页面,每个源登记派生关系,最后重建索引。二十个以上文件时,它会先做三个给你看格式,确认后再批量。

04
抽查两页

打开 topics/_index.md 随便点一页。看三样:有没有一句话结论、数字有没有出处、evidence 标得对不对。这三样决定库里所有内容的质量下限。

05
做课

说「做一门面向银行客户的 3 天 AI 内训课」。它会先问五个问题(学员、业务问题、时长、交付物、验收标准),再检索素材,输出大纲 + 模块详案 + 缺口报告。缺口报告会明说哪几块库里没料、需要补什么。

06
课后回流

课跑完,把学员作品、提问、卡点、讲师复盘丢回 00-原材料/03-课程素材/,再同步一次。这是这套系统的复利来源:下次做同类课,素材厚一倍。

日常三个动作

  • 有新材料 → 丢进去,说「同步」。不用说细节,模型自己扫描。
  • 想问点什么 → 直接问。它会按索引路由,答完还会判断这个答案值不值得写回库。
  • 删了源文件 → 也要说一声「同步」。这是最容易忘的一步,也是唯一会让库慢慢失真的地方。

维护节奏

频率做什么
每次同步后自动跑一次体检,只看有没有新增问题
每周kb.py check 全量过一遍,清空重建队列
每月抽 5 个主题页对比数字,看有没有互相打架;找同一件事拆成好几页的,合并
每季度看业务地图是否还反映真实业务;删掉已经不做的方向

三句话记住这个系统

1. 原材料只进不改。
2. 写完必登记,否则下次白干一遍。
3. 任何"有几个文件是新的""库里有多少页"的判断,问脚本,别问记忆。
07

它能保证什么,不能保证什么

列清楚边界,比多吹两个功能有用。下面四条是目前确实做不到的。

查不出内容矛盾

两份资料写"市场 380 亿"和"210 亿",脚本看不出来。只能靠入库时模型判断 + 每月人工抽查。发现后登记到矛盾登记表,必须裁决,不许两句话并存。

查不出"等级标错"

EVIDENCE_INFLATED 只能发现"标得比来源高"。如果来源本身就标错了 —— 比如把客户口头的"大概 30%"标成 A —— 机器查不出来。只能靠写页面时按三问自检。

不能实时感知文件变化

没有后台监听。文件变了要主动说"同步"。这是有意的:后台自动跑意味着模型可能在你不看的时候改库,风险大于收益。

不是多人协作系统

没有锁、没有并发控制。两个人同时跑同步会打架。约定是"谁在改库谁说一声",或者用 git 分支隔开,冲突时以 manifest 为准。

它真正保证的只有一件事:库里的每个数字都能追到某个原文件的某一段,追不到的地方会被标出来。这在课程开发这个场景里,比多整理出二十个页面值钱得多。

08

设计不是凭空来的

三个来源,各借了一块,都没照抄。

Karpathy · llm-wiki
gist.github.com/karpathy
/442a6bf5

借了骨架:三层架构(原材料 / wiki / 契约)、增量编译而非查询时检索、"好答案要写回库"、索引与日志分离。没借:它的工具链(Obsidian、Marp、qmd)—— 我们要的是给团队做课,不是个人笔记。

lucasastorian · llmwiki
github.com/lucasastorian
/llmwiki

借了两点:① 一个刻意小的自描述入口(对应 kb.py guide),新会话不用读一堆文件就能接手;② 可重建性分级 —— 索引能从文件重建,历史不能,所以备份优先级不一样。没借:MCP 服务、向量索引、Web UI。文件本身就是界面。

eternity4719 · HowToLiveBetter
github.com/eternity4719
/HowToLiveBetter

借了三样:① 证据分级 A/B/C/D 与木桶规则;② 一个检查器只查一件事,且"宁可漏不可误报";③ 每条规则登记起因 —— 没有起因的规则,三个月后会被当官僚条款删掉。没借:它 121KB 的单体规则文件,我们拆成了契约加八个技能。

共同的洞察只有一句:知识库烂掉的原因从来不是内容不够,是没人做记账。交叉引用要更新、摘要要保鲜、新数据推翻了旧结论要标出来 —— 这些事人做不完也做不久。把记账交给机器,把判断留给人,这套东西才转得起来。