不要检索,要导航:将企业知识蒸馏为可导航的智能体技能用于问答与检索增强生成 Don't Retrieve, Navigate: Distilling Enterprise Knowledge into Navigable Agent Skills for QA and RAG
把语料离线编译成层次化技能树,让LLM智能体主动浏览导航,取代被动的top-k检索。
前置知识
检索增强生成 (RAG)
RAG 把外部文档语料切成段落、用 embedding 模型索引,查询时取 top-k 相似段落塞进 LLM 上下文作为证据。Lewis 等人 2020 年提出后已成为企业问答、客服、合规等场景的主流范式。其核心假设是:单次检索的 top-k 段落足以回答用户问题,模型只需做『忠实于证据的生成』。
本文的工作起点就是 RAG 的这一范式:要批评它,先得理解它默认的『top-k 黑箱函数』接口是什么样子。
智能体技能 (Agent Skills) 与渐进披露 (Progressive Disclosure)
Anthropic Skills API 把技能定义为文件系统目录:含 SKILL.md 描述和可选脚本。运行时仅预加载元数据(<100 token),agent 选中后才把 SKILL.md 读入上下文,其余资源留盘。progressive disclosure 让技能库无限扩展而不爆窗口。
本文把原本用于程序性知识(教 agent 怎么做事)的 skill 范式,改造为信息性技能(让 agent 浏览一份语料包含什么),是整个框架的载体。
层次化聚类与递归摘要 (Hierarchical Clustering + Recursive Summarization)
RAPTOR 等工作使用的经典套路:先把所有文档/段落 embedding 出来,用 K-Means 或 GMM 在向量空间分组成簇,对每个簇用 LLM 生成概括性摘要,再把摘要向量重新嵌入再做上一层聚类,自底向上反复直到只剩 K 个根簇。每层都把『一组相似内容的浓缩描述』作为上层路由依据。
CORPUS2SKILL 的离线编译流水线就是这条 embed-cluster-summarize 循环的工程化,但产出不是向量索引而是文件系统目录。
K-Means 与软分配 (Soft Assignment)
K-Means 把每个样本硬分配到最近的一个质心所属簇。软分配指:当某样本的 top-1 与 top-2 质心余弦相似度差距低于阈值 τ 时,把它同时挂在次近的簇里作为『二级条目』,用 @see 桩指回主位置。本文用 τ=0.05 实现『跨簇可达性』,让一份讲两件事的文档能在两条路径下都被发现。
软分配是 CORPUS2SKILL 解决『跨主题文档』路由瓶颈的关键工程技巧。
Qwen3 Embedding 与 sentence-transformers
Qwen3-Embedding 是阿里通义 2025 年发布的句向量模型族,包含 0.6B 和 8B 两个规模,输出维度最高 4096。本文用 8B 版做离线语料和簇摘要的嵌入,用 0.6B 版做 dense baseline,是统一比较的合理选择。
理解本文需要知道离线嵌入和在线嵌入的算力差异——一个在 RTX 4090 上跑 20 分钟,一个在每次查询时实时算。
研究动机
传统 RAG 把 LLM 当作『top-k 段落的被动消费者』,存在三个结构性缺陷。第一,盲盒检索:模型只能看到取回的几个段落,看不到语料的全貌,不知道『还有哪些主题存在』、不知道『我以为最好的证据是否落在检索窗口内』,更没办法事先规划一条更彻底的搜索路径。第二,多主题查询的覆盖盲区:企业问答里大量问题横跨多个产品模块(如『如何用 Stripe 退款并同步到 QuickBooks』),top-5 段落几乎不可能同时命中两个主题的权威文档。第三,Agentic RAG 的随机性:ReAct/Toolformer 风格的 agent 虽然能多次检索,但每次查询都是『盲猜搜索词』,没有语料组织结构的引导,论文数据显示 Agentic 基线的 Faithfulnessgrd 只有 0.528、Hallucination 高达 50%,就是因为 agent 在多轮中积累了太多没有忠实于任何单篇证据的内容。RAPTOR/GraphRAG 这类层次化方法虽然做了组织,但仍然通过 embedding 相似度间接消费树,模型始终看不到目录本身。
本文的目标是本文要构造一个框架,使 LLM 在回答知识密集型查询时能『看见』整个语料的组织结构、能在多层次摘要之间主动下钻和回溯、能在不同分支之间横向跳转合成证据,同时把『建好的语料地图』做成可复用的离线产物。具体指标上,要在企业客服基准 WixQA 上同时拿下最优的 F1/BERTScore/Factuality/Context Recall/Context Precision,把 Agentic 基线的幻觉率从 50% 砍到个位数,并把单查询成本控制在可接受范围($0.153)。
与已有工作不同的是,本文抓住了被忽视的『语料导航性 (corpus navigability)』这一设计轴。已有工作要么只看 top-k 段落(BM25/Dense/Hybrid),要么用算法在树/图上固定遍历(RAPTOR/GraphRAG),要么用 agent 反复试错搜索(Agentic RAG),但都没把『语料本身组织成一棵 LLM 能浏览的目录』作为一级接口。CORPUS2SKILL 的独特切入是把 Anthropic 提出的程序性 skill 概念改造成信息性 skill——SKILL.md/INDEX.md 不再教 agent 怎么执行任务,而是充当『这个分支下面有什么』的路由决策点,从而让 progressive disclosure 天然适配 RAG 的层次化需求。
核心方法
CORPUS2SKILL 把『检索』这件事彻底重写为『浏览一个编译好的目录树』。直觉上,你可以把企业知识库想象成一本厚厚的产品手册,传统 RAG 相当于在书末索引里查关键词翻到对应页码,而 CORPUS2SKILL 相当于给你一份目录:你先看章节目录选一章,再看这一章的子目录选一节,再看这一节列出的文章标题挑一篇读,遇到不对的分支还能跳回上一层换个方向——而且目录本身就是用 LLM 写好的『这段内容是讲什么的』摘要,你不需要打开任何一篇文档就能决定往哪走。技术上分两阶段:离线编译阶段把 6,221 篇支持文档递归 K-Means 聚类、每层用 LLM 写摘要、最后物化成文件系统目录树(SKILL.md/INDEX.md);在线服务阶段把目录树通过 Anthropic Skills API 喂给 LLM agent,agent 用两个工具(code_execution 浏览目录、get_document 拉全文)走完『鸟瞰 → 钻取 → 拉文 → 综合』四步。整个体系在服务时不需要任何向量数据库或检索基础设施——LLM 就是唯一的运行时。
最本质的创新是把『语料的组织结构』从检索管线背后的隐藏资产变成了 LLM 直接消费的一级接口。在 RAPTOR 里,层次结构只是把段落分桶,模型依然用 embedding 找桶;在 CORPUS2SKILL 里,目录本身就是 LLM 的输入——SKILL.md 是一段 LLM 写好的、专门给 agent 看的『路线决策文本』,agent 读完后能『推理』该走哪个分支,再决定要不要花 token 打开文档。这与 Agentic RAG 的『盲猜关键词再检索』形成鲜明对比:CORPUS2SKILL 的 agent 拥有鸟瞰视图,能 backtrack(放弃不产出的分支)和 cross-branch synthesis(在多个子组合成证据),后两个能力在传统 RAG 里根本不存在,因为模型从来没见过树长什么样。另一个微妙的关键点是『信息性技能』的复用:同一套 progressive disclosure 接口(description → SKILL.md → INDEX.md → doc)原本是为『教 agent 怎么用工具』设计的,本文把它映射到『教 agent 一个语料里有什么』,几乎零额外基础设施就拿到了『无限扩展的层次化检索』能力。
方法步骤详情
离线编译阶段 (Compile Phase) 共五步。第一步是文档表示:对 .md/.txt/.json 等原始文档做内容哈希得到 doc_id,用 Claude Haiku 4.5 对每篇文档生成 JSON 摘要卡(title、one_line、≤4 个 distinctive phrases,≤250 token 异步并发调用 20 路),把摘要卡和截断的原文拼成一条字符串用 Qwen3-Embedding-8B 嵌入为 4096 维向量。第二步是建树:在当前层用 K-Means(L2 归一化、分支比 p=10、目标簇数 ⌈n/p⌉)分簇,对 top-1 vs top-2 余弦相似度差距 <τ=0.05 的文档做软分配(保留主簇同时在次簇 INDEX.md 加 @see 桩,本文产生 2,068 条二级指针),再用 Claude Sonnet 4.6 对每簇生成 2-3 句路由向摘要。第三步是验证-重分:把同层所有 sibling 摘要一起喂给 LLM,标记『两个簇讲同一件事』(confusable)或『一个簇横跨多主题』(mixed),对中招的簇在 ID 粒度重新分配并重新摘要;每层最多做一次,最多一次额外 Sonnet 调用。第四步是富化:每个非叶簇挑 top-3 离质心最近的文档作为 ## Example documents 露出,再用一个 batched Sonnet 调用对每簇做实体+文档类型抽取,汇总成全局 entity_index.json(本文生成 2,328 个实体映射);对每个 top-level skill 用 entity-Jaccard 计算 Related skills 块,agent 就能横向跳。第五步是物化:每个根簇变成一个 skill 目录,根是 SKILL.md、下面是若干 INDEX.md、再下面是叶子 INDEX.md 列出 doc_id+title+phrases 的文档行;完整文档正文存到单独的 documents.json 通过 get_document 访问。整套 WixQA 6,221 篇文档在 RTX 4090 上 19.5 分钟编完,得到 6 个根 skill、665 个导航文件、3 层深度。 在线服务阶段 (Serve Phase) 四步。Step 1(鸟瞰):skill 名字和一句话描述被预加载到 agent 上下文(约 200 token),agent 一开始就知道语料大致分哪几块;如果查询提到具体实体,agent 还会去 cat entity_index.json | grep -i entity 找出所有提到该实体的 skill。Step 2(候选保持):系统 prompt 强制 agent 在下钻前至少保留 2 个候选 skill,对每个候选先读它的 SKILL.md 看子组列表。Step 3(钻取):对最有希望的分支读 INDEX.md(典型 <2KB),INDEX.md 列出 10-20 行 doc 行,agent 用 grep/topic match 挑出 1-3 个最像的 doc_id。Step 4(拉文 + 综合):调用 get_document 拉这些 doc 的全文,agent 写一句直接答案(事实类 ≤80 词,流程类 ≤150 词)。系统 prompt 强制『每条事实必须能追溯到某篇 get_document 拉来的文档』,且 SKILL.md/INDEX.md 只能用于导航、不能作为引用源——这条硬规则把幻觉率从 Agentic 的 50% 砍到了 4.5%。
技术新颖性
相对 RAPTOR:技术栈相似(都做 recursive abstractive processing),但 RAPTOR 产出一个可被 embedding 检索的向量树,服务时仍是 embedding-similarity 主导,模型看不到目录;CORPUS2SKILL 产出文件系统目录,由 LLM agent 显式浏览。前者是『层次化检索 + 平坦消费』,后者是『层次化消费』。相对 GraphRAG/HiRAG/StructRAG/BookRAG:它们都在 query 时维护图/树结构并依赖图搜索或 embedding 检索,对模型而言仍是黑盒;CORPUS2SKILL 把整个 hierarchy 当文本喂给模型,路径选择完全由 LLM 推理完成。相对 NaviRAG/HCAG:这是两个最相近的『主动导航』工作,但它们依然依赖自定义检索 API,CORPUS2SKILL 退回到标准 code_execution 工具(ls/cat/grep),配合 Anthropic Skills API 的 progressive disclosure 把『导航基础设施』完全外包给 LLM 本身。相对 Toolformer/ReAct/Agentic RAG:后者每次查询都从零开始在向量空间里盲搜,CORPUS2SKILL 把搜索空间从 O(N) 压成 O(p·logp N) 且每次跳转都先看摘要再决定是否拉文,效率与可控性都更高。技术上最隐蔽的新颖点是 verify-and-repartition:单次 LLM 摘要几乎不可能把 K-Means 的错误聚类全部修正,因此本文在每层加一遍『confusable/mixed』审计,把误归并的文档在 ID 级重新分配并重新摘要,这一步让 narrow 树在 6 个根 skill 时就能达到 0.462 F1,否则会掉到 0.382。
实验结果
主实验在 WixQA(6,221 篇支持文档 + 200 道专家题)上做 5 个基线全对比。CORPUS2SKILL 拿下 7 个质量与覆盖率指标中的 6 个第一:Token F1 = 0.456(比 Agentic 0.378 高 21%、比 Dense 0.364 高 25%、比 RAPTOR 0.398 高 15%);BERTScore-F1 = 0.862(领先所有基线 0.019-0.032);Factuality = 0.767(比 Agentic 0.705 高 6 绝对点);Context Recall = 0.708(比 RAPTOR 0.618 高 15%、比 Agentic 0.452 高 56%);Context Precision = 0.829(比 RAPTOR 0.659 高 26%)。唯一没拿第一的是 Faithfulnessgrd = 0.859,比 Dense/RAPTOR 的 0.889-0.909 略低——但这正是单次检索的『天然优势』:一次只喂 5 个段落,几乎没有幻觉空间。CORPUS2SKILL 把 Agentic 那个 50% 的 Hallucination 砍到 4.5%,离 Dense 的 0% 已经很接近,但代价是 Faithfulnessgrd 从 0.889 降到 0.859——可以理解为『为了多读几篇相关文档而多承担一点点忠实性风险』。成本方面:$0.153/query 是 Agentic $0.082 的 1.9 倍、单次检索 0.007 的 22 倍,主要开销是 Skills API 把导航文件按 cache-read 价(0.1× 基础价)重复计费,约 70% 的 prompt token 在连续多轮间被缓存复用。 RAGBench 上的 10 个子集泛化研究给出了更细致的图景:CORPUS2SKILL 在 7 个上赢、2 个打平、3 个输,且胜负不是随机的,跟语料结构强相关。(a) 单领域原子文档型(Emanual、DelucionQA、TechQA、ExpertQA、ClapNQ + WixQA 本身)——这是 CORPUS2SKILL 的甜蜜区,ClapNQ 上 F1 0.468 vs Dense 0.333,提了 13.5 绝对点,Factuality 0.924 vs 0.774 提了 15 点;这些语料每篇文档都讲一个独立功能,K-Means 在第一层就能分出干净的子主题,目录摘要信息量大、路由决策准。(b) 异构/数字表格型(CovidQA、FinQA)——所有方法 F1 差不到 0.02,CORPUS2SKILL 与 flat retrieval 实质打平,因为答案经常需要从表格里抽精确数字,目录结构帮不上忙。(c) 开放域事实型 / 同质表格型(HAGRID、TatQA、CUAD)——CORPUS2SKILL 输了 0.04-0.17 F1:HAGRID 第一层摘要坍缩成『通用知识库文章』这种无意义标签,TatQA 的 SEC 表格反复重复让所有簇摘要都长一样,CUAD 的长合同按条款类型切不开。这种『结构决定胜负』的判据比简单报平均分有意义得多。 消融研究 (Table 3) 进一步分解了贡献来源。(a) 簇结构:把分支比 p 从 10 改成 5(narrow, 5 子/根/深度=5/2/5)几乎不掉点,F1 0.462 vs 默认 0.456、$0.133 vs $0.153;但把 p 改成 20(wide, 20/4/3)会崩——F1 掉到 0.382、Hallucination 飙到 24.5%,因为第一层每个簇要塞几百个混合文档,摘要变成无信息量的『涵盖多主题』,agent 无法用一句话决定走哪。这恰好复现了 TatQA 失败模式。(b) 探索预算:max rounds 设 5/10/20 对 F1 的影响不到 0.005,平均只用 2.4 轮——说明树组织得够好时 agent 不需要反复回溯,扩大预算主要换来 Hallucination 从 6.5% 单调降到 4.5%,即多出来的时间被用来验证而不是搜索。(c) 服务端 LLM:把 Sonnet 4.6 换成 Haiku 4.5,cost 砍 39% 到 $0.093,F1 保留 92%(0.420),Factuality 保留 87%(0.671),Haiku 甚至多读了一篇文档让 CtxR 从 0.708 升到 0.722——这是本文最重要的『鲁棒性证据』:编译好的树是主驱动力,navigator 的智商只要『够用』就行。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| WixQA 企业客服 QA (F1) | Token F1 | 0.456 | Agentic 0.378 / RAPTOR 0.398 / Dense 0.364 | +0.058 / +0.058 / +0.092 绝对点 |
| WixQA 企业客服 QA (Factuality) | LLM-judge Factuality (0-1) | 0.767 | Agentic 0.705 / RAPTOR 0.704 | +0.062 绝对点 |
| WixQA 检索覆盖率 | Context Recall | 0.708 | RAPTOR 0.618 / Agentic 0.452 | +0.090 / +0.256 绝对点 |
| WixQA 检索精度 | Context Precision | 0.829 | RAPTOR 0.659 / Agentic 0.649 | +0.170 / +0.180 绝对点 |
| WixQA 幻觉控制 | Hallucination Rate (Faith<0.6 占比) | 0.045 | Agentic 0.500 / RAPTOR 0.005 | 把 Agentic 的 50% 砍到 4.5%,仅略输单次检索的 0.5% |
| ClapNQ (RAGBench) 泛化 | Token F1 | 0.468 | Dense 0.333 / Agentic 0.308 | +0.135 绝对点(最大单数据集提升) |
| TatQA (RAGBench) 异构表格 | Token F1 | 0.240 | Dense 0.312 / BM25 0.307 | -0.072 绝对点(结构失配) |
| WixQA 单查询成本 | $/query (Anthropic ephemeral cache) | 0.153 | Agentic 0.082 / Dense 0.007 | 1.9× Agentic / 22× Dense;Haiku 4.5 版降至 0.093 |
局限与改进
作者明确承认四点局限。第一是成本:$0.153/query 仍比单次检索贵 13-22 倍,主要源于 Skills API 把导航文件在每轮都按 cache-read 价计费;尽管开启 ephemeral cache 已省下 70% 重复 token,对高 QPS 低价值场景仍不划算。第二是路由错误:失败分析里 45 个低分查询中有 19 个(42%)属于『导航选错分支』,如 PayPal 连接问题被路由到通用支付组而不是 payment-setup 叶;narrow 树(5 子/根/2 深度)能部分缓解但不能根治。第三是编译不支持增量:每次添加文档都得重新跑整条流水线(19.5 分钟 / 6k 篇,100k 篇约 1 小时多一点),对内容高频更新的知识库不友好。第四是语料结构敏感性:当 level-1 簇必须总结数百篇主题混杂的文档时(wide 树 / TatQA 同质表格 / HAGRID 开放域),摘要坍缩成无信息量标签,导航失败——这是结构性问题,不是实现问题。 我自己观察到的额外限制:(i) 实验只对比 Sonnet 4.6 自身做 navigator,没跨厂商测试(GPT-4o/Gemini),若 navigator 换成不支持工具调用的模型就崩;(ii) 评测用了 6,221 篇的 WixQA 单数据集做主实验,200 题是较小的统计样本,ClapNQ 上 0.135 的提升是全篇最大效应但仍需在更大题量上验证显著性;(iii) Context Recall 在 8000 字符截窗下统一评测,对 CORPUS2SKILL 这种『先看摘要再拉全文』的范式其实有一点不公——它能『看到』远多于 5 篇的相关文档,但评测只看 last 5;(iv) Faithfulnessgrd 的『严格忠实』判定对多文档综合题不友好:corpus 导航鼓励跨篇合成,但严格忠实性检查容易把『基于两篇综合出来的话』判为不忠实,这或许解释了为什么 CtxP/CtxR 涨而 Faithfulnessgrd 略降。
独立分析的弱点
独立分析三个我认为作者没充分讨论的弱点。弱点 1:顶级路由是真正的瓶颈,但作者只给了『narrow 树部分缓解』作为对策。改进方向是训练一个轻量级 query→skill 路由器(在 embedding 空间做 6-way 分类或 LLM 一次 tool-free 调用),让 agent 在 SKILL.md 加载之前就知道哪 2 个 skill 值得打开,而不是被动『读完全部 SKILL.md 再比较』——可把首轮 tool call 减半、$0.153 进一步降到 $0.08-0.10。弱点 2:编译产物虽然 16MB、可以放进 git,但对一个动态演化的真实知识库(每天新增 10-50 篇)来说,全量重编译既慢又贵。改进方向是做『增量 K-Means』——只对新增文档做 embedding,把它们各自分配到最近质心并更新 INDEX.md 的 doc 行;如果某个根簇的 centroid 漂移超过阈值,再触发该子树的局部 verify-and-repartition。弱点 3:当前评测只看 last 5 个 get_document 拉到的文档,对 CORPUS2SKILL 不公平,因为它的核心优势之一是『先看几十个 INDEX.md 摘要』再做精准拉文。改进方向是引入『导航信息增益 (NIG)』指标——记录 agent 每读一个 SKILL.md/INDEX.md 后 CtxR 的边际提升,定量刻画『鸟瞰视图』到底值多少 token。
未来方向
作者提出的方向:混合 per-query routing,让 system 先用 CORPUS2SKILL 一次失败回退到 flat retrieval,或对不同语料做策略选择(开放域 → flat,单域 → 导航)。基于成果可延伸的方向:(i) 把 SKILL.md 升级为『条件路由』——即 skill 自己声明『如果查询提到 entity X 则跳到 related_skill Y』,让 agent 不必每次都查 entity_index.json,进一步压低 latency;(ii) 把多模态文档(PDF 截图、表格图片、代码块)也通过统一的视觉 LLM 蒸馏成摘要节点,让 CORPUS2SKILL 自然扩展到多模态 RAG;(iii) 把『导航轨迹』作为监督信号——直接微调一个 navigator LLM(用人类或更强 agent 的成功轨迹做 SFT),把 2.4 轮平均轮次压到 1.5 轮,cost 再降 30%;(iv) 研究 dynamic rebalancing——监控 agent 的 routing error rate,自动触发 verify-and-repartition 而不是固定编译期做一次。
复现评估
代码已开源在 https://github.com/dukesun99/Corpus2Skill,论文附录 A-I 给了完整实现细节(编译 prompt、System prompt、Baseline 超参、评测 prompt)。复现门槛:硬件方面,离线编译需要单卡 RTX 4090(Qwen3-Embedding-8B + Haiku 4.5 摘要 + Sonnet 4.6 簇摘要并发),WixQA 6k 篇 19.5 分钟;在线服务只需 Anthropic API 访问权(用 Claude Sonnet 4.6 / Haiku 4.5)和 Skills API 配额(每请求 ≤8 skills、≤200 文件、≤30MB,本框架在边界内)。数据方面,WixQA 来自 Cohen et al. 2025 (arXiv:2505.08643) 已公开;RAGBench 10 个子集也是公开数据集。难度评估:复现主线结果中等——核心工程在编译流水线的并发控制(async semaphore 20)和 verify-and-repartition 的 prompt 设计;难度较大的部分是用 Skills API 部署,因为这是 Anthropic 较新的产品(2024 年底发布),文档和配额可能变动。值得注意的 fairness 细节:作者特意把 Context Recall 在 8000 字符统一截窗下评测、用 Sonnet 4.6 做 LLM judge,附录 I 列了所有 prompt,复现时直接照搬即可避免评测偏差。
论文图表
对比图:上半部是 Retrieve (RAG) 范式——User Query 走 Embed → VectorDB → Top-k → Docs → LLM Answer 的单管线;下半部是 Navigate 范式——User Query 直接到 LLM Agent,Agent 通过 idx-3/idx-4 等导航调用在 skill A/B/C 树结构里钻取,最后合成 Answer。视觉上把『被动消费段落』和『主动浏览树』形成鲜明对比。
这是全文最核心的一帧直觉图——读者第一眼就要建立『为什么导航是范式跳跃』的认知,看完就能理解后续所有方法设计都是为了实现这个范式跳跃。