很多团队搭建知识库时,第一反应是把文档切块、向量化、塞进向量数据库,再让大模型根据相似片段回答问题。这就是 RAG(Retrieval-Augmented Generation,检索增强生成)的基本形态。
RAG 适合解决“我问一句,系统帮我从文档里找几段相关内容”的问题,但工程知识库不只是问答系统。它还要回答这些更复杂的问题:
- 新人应该按什么顺序理解一个系统?
- 某个服务的设计原则、架构约束、代码实现和线上经验之间是什么关系?
- 修改一条规范会影响哪些模板、SDK 和排障手册?
- 架构师、开发者、SRE 需要看的知识层级是否一样?
- Agent 在有限上下文窗口里,应该优先读取哪些内容?
这些问题靠“语义相似度 Top-K”很难稳定解决。原因不是 embedding 不够好,而是工程知识本身需要结构。它既像一棵树,有从原则到实现的抽象层级;又像一张图,有服务依赖、规范约束、故障反馈和跨模块引用。
分层知识库的目标,就是在 RAG 之上增加一层面向 Agent 的 Knowledge Context Layer。它不直接替代向量检索,而是先告诉 Agent:该去哪个层级找、沿着哪些关系扩展、按照什么角色筛选上下文。
RAG 在工程知识库里的三个瓶颈
经典 RAG 的流程很直接:
flowchart LR
A[源文档] --> B[切分 Chunk]
B --> C[Embedding 向量化]
C --> D[(向量数据库)]
E[用户问题] --> F[问题向量化]
F --> D
D --> G[Top-K 相似片段]
G --> H[拼接 Prompt]
H --> I[LLM 生成答案]
这个流程在 FAQ、产品手册、简单规章检索里很好用,因为问题通常能被少量片段直接回答。但工程知识库的内容更复杂,常见瓶颈主要有三个。
每次查询都从零开始
如果一个问题需要综合 5 份设计文档、2 份故障复盘和 1 份代码规范,普通 RAG 每次都要重新召回、拼接、推理。上一次已经整理过的中间结论不会沉淀下来,系统也不会因为被问过多次而自然变聪明。
这种模式的问题在于:检索结果只是临时上下文,不是长期知识资产。回答结束后,综合出来的结构、引用路径、概念关系都丢掉了。
很难把分散信息连成关系
向量检索擅长找到“语义相近”的片段,却不擅长表达“它们之间是什么关系”。
例如,一个系统里有这些信息:
- A 服务调用 B 服务;
- B 服务依赖一张订单表;
- 某次故障是订单表索引失效导致;
- 一条架构原则要求核心链路避免跨域同步调用。
这些内容可能散落在服务说明、数据库设计、故障复盘和架构原则里。普通 RAG 也许能召回其中几段,但它并不知道这些片段共同构成了一条影响链路。
知识粒度容易混在一起
同一个关键词可能出现在不同抽象层次里。比如“单一职责”既可能出现在架构原则里,也可能出现在某个函数重构说明里。向量空间会认为它们语义接近,但用户的问题可能完全不同:
| 用户真正想问 | 需要的知识层级 | 错误召回示例 |
|---|---|---|
| 为什么系统要拆成多个服务 | 架构原则、架构决策 | 返回某个函数的职责划分 |
| 某个接口怎么调用 | 实现文档、SDK 示例 | 返回领域建模原则 |
| 新人该先看什么 | 导航路径、核心概念 | 返回零散代码片段 |
| 一次故障影响哪些服务 | 服务关系、运维经验 | 返回接口字段说明 |
RAG 的默认假设是“相关片段越相似越好”,但工程知识库更需要先判断“问题属于哪个层级”。
主流知识库范式的能力边界
从“平铺文档”走向“结构化知识”,常见做法大致可以分成四类:Naive RAG、LLM Wiki、Graphify 和 GraphRAG。它们分别解决了不同问题,也留下了不同缺口。
Naive RAG:平铺向量检索
Naive RAG 把所有文档切成片段,然后按向量相似度召回。
flowchart LR
A[文档集合] --> B[Chunk]
B --> C[Embedding]
C --> D[(Vector Store)]
E[Query] --> F[Embedding]
F --> D
D --> G[Top-K Chunk]
G --> H[LLM]
它的优点是工程落地简单:不需要设计复杂数据模型,也不需要提前梳理文档关系,只要能切块和向量化,就能跑起来。
它的限制也很明显:
| 能力 | 默认表现 |
|---|---|
| 知识积累 | 每次查询临时推理,结果不沉淀 |
| 关系表达 | 片段之间没有显式边 |
| 层级控制 | 原则、规范、代码、故障记录混在一起 |
| 角色适配 | 不区分架构师、开发者、SRE 的上下文需求 |
| 全局理解 | 很难回答跨文档、跨模块的总结性问题 |
现代 RAG 可以加入 metadata filter、rerank、hybrid search、访问控制、query routing 等机制补齐部分能力,但这意味着系统已经不再是“简单向量库问答”,而是在向结构化检索演进。
LLM Wiki:把知识编译成持续维护的页面
LLM Wiki 的核心思想是:不要让大模型每次问答都重新综合知识,而是让它把读过的资料整理成稳定的 wiki 页面,并持续维护这些页面。
它可以分成三层:
| 层级 | 内容 | 维护方式 |
|---|---|---|
| Raw Sources | 原始资料,例如论文、文章、需求、数据文件 | 人类选择和归档 |
| Wiki | LLM 生成的结构化页面,例如概念页、实体页、综述页 | LLM 维护 |
| Schema | 页面结构、命名规范、索引方式、工作流约定 | 人类和 LLM 共同演进 |
核心操作通常有三类。
Ingest:摄入新资料
当一份新资料进入知识库时,LLM 不只是写一段摘要,而是要完成一组维护动作:
flowchart LR
A[新资料进入] --> B[通读并提取主题]
B --> C[创建摘要页]
C --> D[更新索引页]
D --> E[修订相关概念页]
E --> F[补充交叉引用]
一次摄入可能会改动多个 wiki 页面,因为新资料可能影响已有概念、实体、结论和引用关系。
Query:基于页面回答
查询时,系统先通过索引定位相关页面,再让 LLM 读取页面并生成带引用的回答。高质量回答还可以反向沉淀成新的 wiki 页面,让探索过程变成知识积累过程。
Lint:检查知识库健康度
Wiki 会随着资料增长而出现问题,比如页面孤立、概念重复、引用断裂、旧结论没有更新。Lint 机制负责定期发现这些问题。
flowchart TD
A[Wiki 健康检查] --> B[矛盾声明]
A --> C[过期引用]
A --> D[孤立页面]
A --> E[缺失概念]
A --> F[断裂链接]
LLM Wiki 的价值在于“持续编译”。它把临时推理变成稳定知识工件,适合中等规模、主题相对明确的知识库。它的短板是关系结构通常依赖 wikilink,缺少自动关系推断、社区发现和严格的层级模型。
Graphify:把代码和文档变成知识图谱
Graphify 的思路是把代码库、配置、数据库、文档、设计稿等资源统一映射成一张图。图里有节点,也有边;节点表示函数、类、服务、概念、数据库表等实体,边表示调用、依赖、解释、实现、关联等关系。
典型提取流程可以分成两条管道:
flowchart LR
A[代码仓库] --> B[AST 解析管道]
B --> C[函数/类/模块/导入关系]
D[文档/PDF/图片/视频] --> E[LLM 语义管道]
E --> F[概念节点/语义关系]
C --> G[(知识图谱)]
F --> G
G --> H[graph.json]
G --> I[graph.html]
G --> J[GRAPH_REPORT.md]
AST(Abstract Syntax Tree,抽象语法树)管道适合解析代码结构,LLM 语义管道适合理解非结构化资料。最终产物通常包括:
| 产物 | 用途 |
|---|---|
graph.json |
保存完整图谱数据,供程序查询 |
graph.html |
在浏览器里查看节点、边、过滤和搜索 |
GRAPH_REPORT.md |
输出高连接节点、意外关系、知识缺口等分析结果 |
知识图谱带来的能力和普通文档不同。它可以发现系统里的 God Nodes,也就是连接度很高的关键节点;也可以发现看似不相关模块之间的跨域联系;还可以识别某些服务、表、接口缺少解释文档的知识缺口。
为了降低误导,图谱里的关系最好带置信度:
| 置信度 | 含义 | 示例 |
|---|---|---|
EXTRACTED |
从代码或文档中直接观察到 | A 文件 import B 模块 |
INFERRED |
根据上下文推导出来 | A 服务可能依赖某个领域概念 |
AMBIGUOUS |
信息不足,存在不确定性 | 文档里提到“订单模块”,但无法确定具体服务 |
Graphify 很适合回答“A 和 B 有什么关系”“系统里哪些节点最关键”“哪里缺文档”。但它不适合单独承担所有问答任务,因为图谱是骨架,具体参数、代码示例、操作步骤仍然要回到原始文档或代码。
GraphRAG:用图谱增强检索
GraphRAG 把知识图谱和 RAG 结合起来。它先从文档里提取实体和关系,构建知识图谱,再用社区发现算法把图划分成多个社区,并为每个社区生成摘要。查询时,系统可以根据问题类型选择全局搜索或局部搜索。
flowchart LR
A[源文档] --> B[实体与关系提取]
B --> C[(知识图谱)]
C --> D[社区聚类]
D --> E[分层社区摘要]
F[用户问题] --> G{查询类型}
G -->|全局问题| H[Global Search]
G -->|实体问题| I[Local Search]
H --> E
I --> C
E --> J[LLM 回答]
C --> J
两种查询模式适合不同场景:
| 模式 | 适合问题 | 使用的信息 |
|---|---|---|
| Global Search | 整个系统有哪些设计模式、哪些主题最重要 | 社区摘要 |
| Local Search | 某个服务关联哪些组件、某个概念连接了哪些文档 | 实体邻域 |
GraphRAG 能缓解普通 RAG 的两个典型问题:通过图结构把分散信息连成关系,通过社区摘要支持全局理解。代价也比较高:实体抽取需要大量 LLM 调用,图谱和社区摘要的增量更新较复杂,而且源文档质量会直接影响图谱质量。
四种范式对比
| 维度 | Naive RAG | LLM Wiki | Graphify | GraphRAG |
|---|---|---|---|---|
| 知识表示 | 向量空间里的 chunk | 结构化 wiki 页面 | 节点和边组成的图 | 知识图谱 + 社区摘要 |
| 知识积累 | 弱 | 强 | 强 | 中等,取决于更新机制 |
| 关系表达 | 默认没有 | 依赖 wikilink | 自动提取和推断 | 自动提取和聚类 |
| 层级感知 | 弱 | 按主题组织 | 可按社区组织 | 有社区层级 |
| 角色适配 | 默认没有 | 通常没有 | 通常没有 | 通常没有 |
| 适合场景 | 快速问答、文档搜索 | 中等规模知识沉淀 | 代码和系统关系分析 | 全局理解与局部关联检索 |
| 主要代价 | 粒度混乱、缺少结构 | 维护页面一致性 | 图谱质量和解释成本 | 构建和更新成本高 |
这些方案都在解决知识库结构问题,但它们普遍缺少一个明确设计:把知识按抽象度和稳定性分层,再根据角色选择上下文。
分层知识库:把知识组织成金字塔
工程知识不是同一种东西。有些知识非常稳定,比如设计原则;有些知识变化很快,比如故障排查命令。把它们放在同一个向量空间里统一召回,会导致高层原则和低层细节互相干扰。
更合理的方式是把知识分成 5 层:
flowchart TB
L1["L1 原则<br/>稳定、抽象、长期有效"]
L2["L2 架构<br/>系统结构、技术选型、ADR"]
L3["L3 规范<br/>编码标准、接口约定、流程规则"]
L4["L4 实现<br/>代码模板、SDK、配置、API 示例"]
L5["L5 经验<br/>故障复盘、运维日志、排障 SOP"]
L1 --> L2
L2 --> L3
L3 --> L4
L4 --> L5
这 5 层对应软件工程里常见的抽象层次:
| 层级 | 软件工程内容 | 稳定性 | 类比 |
|---|---|---|---|
| L1 原则 | SOLID、KISS、YAGNI、团队工程原则 | 最高,按年变化 | 宪法 |
| L2 架构 | 架构决策记录、系统拓扑、领域划分 | 较高,按季度变化 | 法律 |
| L3 规范 | 编码规范、接口约定、Lint 规则 | 中等,按月变化 | 规章 |
| L4 实现 | SDK 文档、代码模板、配置示例 | 较低,按周变化 | 手册 |
| L5 经验 | 故障复盘、排障记录、运维命令 | 最低,按天变化 | 判例 |
分层之后,检索不再是“从所有文档里找最像的片段”,而是先判断问题属于哪个层级,再在目标层级里查找内容。
例如:
| 问题 | 优先层级 | 原因 |
|---|---|---|
| 为什么核心链路不能同步调用外部服务 | L1 + L2 | 涉及原则和架构约束 |
| 新接口字段命名应该遵循什么规则 | L3 | 涉及团队规范 |
| Java SDK 怎么初始化客户端 | L4 | 需要实现示例 |
| 某个告警触发后怎么排查 | L5 | 需要运维经验 |
| 新人如何理解订单域 | L1 + L2 + L3 | 需要概念、架构和规范路径 |
层级的作用不是替代搜索,而是先缩小搜索空间。问题一旦被路由到正确层级,后续检索的噪声会小很多。
知识图谱:让五层之间产生关系
分层不能只做成 5 个文件夹。如果文档之间没有关系,系统仍然无法回答“影响面”“约束来源”“经验反馈到哪里”这类问题。
分层知识库需要把每篇文档看成节点,再用有向边表达关系:
flowchart TD
P[L1 原则] -->|governs| A[L2 架构决策]
P -->|defines| S[L3 规范]
A -->|constrains| S
A -->|implements| I[L4 实现]
S -->|implements| I
I -->|validates| E[L5 运行经验]
E -->|feedback| S
E -->|feedback| I
X[任意文档] -.->|cross_ref| Y[相关文档]
常用边类型如下:
| 边类型 | 方向 | 含义 |
|---|---|---|
governs |
L1 → L2 | 原则约束架构决策 |
defines |
L1 → L2/L3 | 原则定义概念边界 |
constrains |
L2 → L3 | 架构对规范提出约束 |
implements |
L2/L3 → L4 | 实现承接架构或规范 |
validates |
L4 → L5 | 实现在线上运行中被验证 |
feedback |
L5 → L3/L4 | 经验反向推动规范或实现改进 |
cross_ref |
任意 → 任意 | 横向引用或补充说明 |
有了这些边,知识库就能支持几类重要能力。
从实现上溯到原则
开发者看到一段代码模板时,可以追溯它为什么这么设计:它实现了哪条规范,规范来自哪个架构约束,架构约束又受哪条原则影响。
从原则下探到实现
架构师提出一条原则后,可以检查它是否已经落到架构决策、编码规范和代码模板里。如果原则只停留在 L1,没有下游文档承接,就说明它还没有变成可执行知识。
让经验形成反馈环
一次故障复盘不应该只归档在 L5。它可能需要修改 L3 的规范,也可能需要更新 L4 的模板或排障脚本。feedback 边能把经验和改进行动连接起来。
角色感知:不同人需要不同上下文
同一个知识库不应该给所有人返回同一种上下文。架构师关心原则和架构约束,开发者更关心规范和实现,SRE 需要实现细节和运行经验,新人则需要一条能逐步理解系统的阅读路径。
可以用角色-层级矩阵描述访问优先级:
| 角色 | 主要层级 | 次要层级 | 典型问题 |
|---|---|---|---|
| 架构师 | L1、L2 | L3、L5 | 架构是否符合原则,故障是否暴露设计问题 |
| 开发者 | L2、L3、L4 | L5 | 按什么规范实现,代码模板怎么用 |
| SRE | L4、L5 | L2、L3 | 告警怎么排查,变更会影响哪些服务 |
| 新人 | L1、L2、L3 | L5 | 系统怎么理解,应该按什么顺序学习 |
| Agent | 按任务动态选择 | 通过图谱扩展 | 在有限上下文内组合最相关知识 |
角色感知还需要配合 context budget。大模型上下文窗口再大,也不能无节制塞文档。更稳妥的方式是为不同角色设置优先层级和预算。
roles:
architect:
context_budget: 12000
priority_order: [L1, L2, L3, L5, L4]
developer:
context_budget: 10000
priority_order: [L3, L4, L2, L5, L1]
sre:
context_budget: 10000
priority_order: [L5, L4, L2, L3, L1]
newcomer:
context_budget: 8000
priority_order: [L1, L2, L3, L5, L4]
系统检索时按照优先顺序逐层填充内容,直到预算用完。这样可以避免一个 SRE 排障问题被大量原则文档占满,也能避免架构讨论被底层代码片段干扰。
分层检索:先路由,再召回,再扩展
分层知识库的检索流程可以拆成 5 步:
flowchart LR
A[用户问题] --> B[识别角色]
B --> C[判断目标层级]
C --> D[层内关键词/索引检索]
D --> E[图谱邻域扩展]
E --> F[按预算裁剪上下文]
F --> G[LLM 生成答案]
它和普通向量检索的核心区别在于:普通向量检索先找相似片段,分层检索先判断“去哪里找”。
| 维度 | 向量检索 | 分层检索 |
|---|---|---|
| 定位方式 | embedding 距离 | 层级路由 + 关键词/索引匹配 |
| 搜索空间 | 全量文档 | 角色可访问层级子集 |
| 粒度控制 | 默认弱 | 先按层过滤 |
| 关联能力 | 默认只返回相似片段 | 通过图谱边补上下游 |
| 网络调用 | 通常需要 embedding 调用 | 可纯本地完成 |
| Token 消耗 | 容易返回 raw chunk | 可优先返回摘要和导航 |
| 冷启动成本 | 较低 | 需要先构建层级和图谱 |
| 代码细节能力 | 强,适合函数级召回 | 中等,需要结合向量检索补深度 |
最实用的组合不是二选一,而是混合:
sequenceDiagram
participant U as 用户
participant P as 分层知识库
participant V as 向量检索
participant L as LLM
U->>P: 提问
P->>P: 识别角色和层级
P->>P: 找到相关文档与图谱邻域
P->>V: 对需要细节的节点做向量检索
V-->>P: 返回代码级片段
P->>L: 组装结构化上下文
L-->>U: 返回答案
分层知识库负责导航和结构,向量检索负责补充函数、配置、行号、参数等细节。这样既保留了 RAG 的精确召回能力,又减少了“所有问题都从全量 chunk 里盲搜”的不稳定性。
分层知识库和其他范式的关系
分层知识库更像一个上层编排层,而不是底层存储方案。它可以建立在 Wiki、Graph、Vector Store 之上。
flowchart TB
A[Agent / LLM 应用] --> B[Knowledge Context Layer]
B --> C[层级路由]
B --> D[角色过滤]
B --> E[图谱扩展]
B --> F[Context Budget 管理]
C --> G[LLM Wiki]
D --> H[知识图谱]
E --> I[GraphRAG]
F --> J[Vector Store]
G --> K[源文档]
H --> K
I --> K
J --> K
它承担的是“让 Agent 知道该读什么”的职责:
- LLM Wiki 负责沉淀可读页面;
- Graphify 负责发现实体和关系;
- GraphRAG 负责全局摘要和局部图谱搜索;
- 向量数据库负责精确片段召回;
- 分层知识库负责层级、角色、路径和预算编排。
知识库会腐烂,必须设计同步机制
知识库最危险的问题不是没内容,而是内容过期。没有文档时,用户至少知道要去问人;过期文档会让用户带着错误信心执行错误操作。
常见腐烂形式有三类:
| 类型 | 表现 | 危害 |
|---|---|---|
| 静默过期 | 接口签名、配置路径、命令参数已经变了,文档没更新 | 很高,容易直接误导操作 |
| 层级漂移 | 当初的架构决策已经变成历史背景,却仍放在 L2 | 中等,会干扰判断 |
| 覆盖盲区 | 新服务上线很久,但没有架构说明、实现参考或排障记录 | 较高,影响新人和排障 |
一个简单判断标准是:新人按知识库操作会踩坑,说明知识已经失效。
不同层级需要不同保鲜周期
分层以后,维护策略也应该分层。原则不需要每天检查,但实现文档和排障 SOP 可能几天就会过期。
| 层级 | 合理审查周期 | 典型过期信号 |
|---|---|---|
| L1 原则 | 年度 | 团队对某条原则理解出现明显分歧 |
| L2 架构 | 季度 | 系统拓扑、依赖关系和文档不一致 |
| L3 规范 | 月度 | Lint 规则、接口约定和文档描述不同 |
| L4 实现 | 周级或天级 | 模板跑不通、SDK 版本过期、配置失效 |
| L5 经验 | 天级 | SOP 中的命令、路径、告警名称不存在 |
这意味着维护系统不能只靠“每月统一检查一次”。更有效的做法是让变更事件触发知识更新。
| 触发事件 | 应更新层级 | 原因 |
|---|---|---|
| 架构评审通过 | L2 | 新的架构决策产生 |
| Lint 规则变更 | L3 | 编码规范发生变化 |
| 依赖大版本升级 | L4 | 示例代码和模板可能失效 |
| 故障复盘完成 | L5 | 新经验需要沉淀 |
| 新服务上线 | L2 + L4 | 需要补服务架构和实现参考 |
| 新人反复提问 | L3 / L5 | 高频问题说明文档有缺口 |
用审计指标代替人工巡检
靠人逐页检查知识库很难持续。更稳定的方式是定义健康指标,让系统自动发现问题。
| 审计维度 | 检查内容 | 健康标准 |
|---|---|---|
| 覆盖率 | 每层是否有条目,核心服务是否被覆盖 | 无空层,核心服务都有文档 |
| 新鲜度 | 条目最后更新时间 | L4/L5 不应长期无人更新 |
| 图谱连通 | 是否存在孤立节点 | 每个条目至少有一条关系边 |
| 层级平衡 | 各层条目数量是否合理 | L1 控制数量,避免某层占比过高 |
| 反向引用 | 下游实现能否追溯到规范和架构 | 关键实现有来源说明 |
| 反馈闭环 | 故障经验是否推动规范或实现更新 | 重大复盘有后续改进边 |
增量同步可以设计成三段式:
flowchart LR
A[Phase 1 审计] --> B[发现覆盖缺口和过期条目]
B --> C[Phase 2 摄入]
C --> D[加载源文档]
D --> E[分块/分类/去重]
E --> F[写入或更新分层知识库]
F --> G[Phase 3 后审计]
G --> H[对比覆盖率和连通性变化]
去重和更新策略可以结合 checksum 与 entry ID:
| 场景 | 动作 |
|---|---|
| 内容不变,层级不变 | skip,跳过 |
| 内容变化,层级不变 | update,保留创建时间并更新内容 |
| 内容相同或相近,但层级改变 | move,删除旧层条目并写入新层 |
| 全新内容 | write,新增条目和关系 |
这套机制的重点不是一次性生成漂亮目录,而是让知识库能随着代码、架构和运维经验持续变化。
检索效果应该怎么评估
分层知识库不能只看主观体验,需要用检索指标评估。常见指标包括:
| 指标 | 含义 |
|---|---|
| Hit@K | 前 K 个结果里是否命中正确文档 |
| MRR | 正确结果排名越靠前,分数越高 |
| Context Precision | 返回上下文里有多少是相关内容 |
| Context Recall | 应该召回的内容里有多少被召回 |
| Faithfulness | 生成答案是否忠于上下文 |
| Answer Relevancy | 答案是否真正回应问题 |
一个工程知识库的评测集应覆盖不同问题类型,而不是只测简单问答:
| 查询类型 | 典型问题 |
|---|---|
| 代码细节 | 函数用法、配置方法、SDK 初始化 |
| 运维排障 | 告警处理、发布回滚、容量规划 |
| 架构概念 | 技术选型、模块边界、通信方式 |
| 跨服务关联 | 依赖关系、数据流、故障影响面 |
| 导航 | 新人阅读路径、知识覆盖度 |
| 服务定位 | 服务职责、技术栈、业务域归属 |
从常见表现看,不同方案的优势并不一样:
| 方案 | 更擅长的问题 | 容易吃亏的问题 |
|---|---|---|
| Naive RAG | 代码细节、明确字段、局部文档问答 | 跨服务关联、导航、全局理解 |
| LLM Wiki | 概念解释、综述、稳定主题学习 | 高频变化的代码细节和运维信息 |
| Knowledge Graph | 依赖关系、影响面、关键节点发现 | 直接参数问答和操作步骤 |
| GraphRAG | 全局主题总结、局部实体扩展 | 构建成本和增量更新 |
| 分层知识库 | 层级定位、角色适配、导航路径 | 函数级深度不如向量检索 |
| 分层知识库 + RAG | 结构化导航 + 代码级细节 | 系统复杂度更高,需要维护索引和图谱 |
在工程实践里,混合检索通常更稳:分层结构负责让系统找对方向,RAG 负责补齐具体细节,知识图谱负责连接上下游关系。
一个可落地的目录结构
分层知识库可以从简单目录开始,不一定一开始就上复杂平台。
knowledge-base/
L1-principles/
engineering-principles.md
reliability-principles.md
L2-architecture/
order-domain-adr.md
service-topology.md
L3-standards/
api-design-standard.md
logging-standard.md
lint-rules.md
L4-implementation/
java-sdk-usage.md
service-template.md
config-examples.md
L5-experience/
incident-2026-05-order-timeout.md
rollback-sop.md
alert-troubleshooting.md
graph/
edges.yaml
nodes.yaml
roles.yaml
index.md
关系边可以用 YAML 描述:
edges:
- from: engineering-principles
to: order-domain-adr
type: governs
- from: order-domain-adr
to: api-design-standard
type: constrains
- from: api-design-standard
to: java-sdk-usage
type: implements
- from: incident-2026-05-order-timeout
to: rollback-sop
type: feedback
索引页负责给人和 Agent 提供入口:
# Knowledge Index
## 新人路径
1. L1-principles/engineering-principles.md
2. L2-architecture/service-topology.md
3. L3-standards/api-design-standard.md
4. L5-experience/alert-troubleshooting.md
## 开发者路径
1. L3-standards/api-design-standard.md
2. L4-implementation/service-template.md
3. L4-implementation/java-sdk-usage.md
## SRE 路径
1. L5-experience/alert-troubleshooting.md
2. L5-experience/rollback-sop.md
3. L2-architecture/service-topology.md
只要有分层、索引、角色和关系边,就已经具备 Knowledge Context Layer 的雏形。后续可以逐步增加自动分类、图谱可视化、向量检索、健康审计和增量同步。
适合和不适合使用分层知识库的场景
分层知识库适合知识复杂、角色多、文档生命周期差异明显的团队。对于只有少量文档的小项目,直接用搜索或简单 RAG 就够了。
| 场景 | 是否适合 | 原因 |
|---|---|---|
| 多服务工程团队 | 适合 | 服务依赖、架构约束、运维经验需要关联 |
| 新人 onboarding 成本高 | 适合 | 可以设计跨层阅读路径 |
| Agent 需要调用内部知识完成任务 | 适合 | 需要稳定上下文编排 |
| 文档经常过期 | 适合 | 分层审计和变更触发能降低腐烂 |
| 只有十几篇静态文档 | 不一定适合 | 结构成本可能大于收益 |
| 只做简单 FAQ | 不一定适合 | Naive RAG 或全文搜索足够 |
| 强依赖函数级代码问答 | 需要混合 RAG | 分层结构不替代代码级召回 |
核心设计原则
分层知识库最重要的不是“五个目录”,而是几条设计原则:
- 先分层,再检索。 先判断问题需要原则、架构、规范、实现还是经验,再进入对应层级召回。
- 用图谱表达关系。 文档之间要有约束、实现、验证、反馈等明确边,不能只靠文件夹隔离。
- 按角色分配上下文。 不同角色有不同优先层级和上下文预算,不能返回同一批材料。
- 把更新绑定到变更事件。 架构评审、规则变更、故障复盘、新服务上线都应该触发知识同步。
- 让 RAG 补细节,不让 RAG 承担全部结构。 向量检索适合找代码级片段,但不适合独自管理知识层级、角色和关系。
最终目标很明确:当用户或 Agent 提出问题时,系统不是返回几段看起来相似的文本,而是在正确层级、正确角色和正确关系路径上组织答案。这样,知识库才不只是文档仓库,而是真正可被 Agent 使用的上下文基础设施。