Skip to content

13. Knowledge Base 与检索

检索(Retrieval)的交付物不是一串相似度分数,而是一份能让读者回到来源、判断范围和发现新鲜度缺口的证据包。

本章目标

完成本章后,读者能够:

  • 区分知识库(Knowledge Base)、索引(Index)、候选片段、证据单元(Evidence Unit)和答案,避免把“搜到”写成“已证实”。
  • 为一个检索任务写出资料范围、来源优先级、新鲜度要求、过滤条件和停止条件,而不是只写一个查询字符串。
  • 用证据卡(Evidence Card)把输出中的主张回链到稳定来源位置、范围、时间和限制。
  • 判断相似度、关键词命中、摘要、URL 可访问性和来源种类各自能说明什么,不能说明什么。
  • 在候选缺失、范围冲突、资料过期、无法定位或引用缺失时,保守地补证、停止或升级。

为什么要学

把文档、网页或笔记塞进 Prompt 的确可能让模型得到更多材料,但这不解决一个关键问题:这段材料能否回答当前问题,是否仍然适用,以及读者能否找到它。检索层若只返回“排名第一的文本”,错误会在后续回答里被放大:旧博客可能覆盖了新文档,缺日期的片段可能被当成当前策略,段落中的“它”可能在切分后不再知道指谁。

例如,虚构任务“当前 API 鉴权方式是什么?”需要的是当前、范围明确、可定位的官方资料。一个高分博客段落即使语言流畅,也可能只描述旧版本、不同区域或不同产品;一段来自官方页面的片段即使来源可信,也可能没有覆盖问题中的“当前”或“鉴权方式”。此时,生成一段听起来确定的答案,比返回“证据不足,需重查官方页”更危险。

Lewis 等人的检索增强生成(Retrieval-Augmented Generation,RAG)论文将预训练的参数化模型与经神经检索器访问的、基于 Wikipedia 的非参数稠密向量索引结合,并把知识溯源和知识更新列为开放问题。REF-045 这个研究背景说明外置可检索资料与模型可以分层;它不保证任何检索结果可归因、可更新或适合当前任务。

前置知识

  • 前置章节: 第 6 章说明模型可见上下文怎样被选择;第 7 章说明长期记忆不是无条件可信的资料;第 10 章说明候选、观察、证据和验证结论必须分开。
  • 技术前提: 能读懂 Markdown 表格、普通对象与相对链接;不要求使用过向量数据库、嵌入模型或搜索引擎。
  • 不要求: 本章不要求配置网页爬虫、上传文件、调用模型、建立索引、部署数据库、存储密钥或访问企业知识库。

注意:第 13 章准备的是证据层。它不授予读取权限(第 12 章),不替人作责任判断(第 14 章),不把观察判为任务成功(第 17 章),也不设计真实生产检索基础设施。

场景引入:一段高分材料还缺什么

设想一个文档助手收到任务:“说明当前 API 的鉴权方式,并给出读者可继续核对的位置。”它从混合资料库中拿到三项候选:

候选表面优势缺口当前能否直接用于答案
无日期博客节选关键词与问题高度相似版本、产品范围和作者维护状态不明不能;先补来源和新鲜度。
官方页面节选来源种类优先,含稳定页面位置还未确认页面是否覆盖问题的具体范围不能;先核对范围。
当前官方页面的定位段落来源、范围、访问时间与主题都可记录仍须把它和输出中的主张逐项回链可以进入证据卡候选。

这个场景没有真的访问任何 API、页面或资料库。它只说明一个审查顺序:候选先通过范围、来源、新鲜度、稳定位置和引用回链检查,才可进入模型上下文。即使通过,也只表示材料适合支持某个受限主张;答案是否满足任务目标仍需要第 17 章的验收。

核心概念

知识库、索引、候选与证据:四层对象回答不同问题

“知识库”常被用来同时指文件夹、向量数据库、搜索结果和模型回答。工程上这会隐藏责任边界。本书建议把它们分开:

对象它回答的问题最低可见信息它不能证明什么
Knowledge Base哪些资料允许被检索?范围、来源种类、所有者、更新责任、敏感性和排除项内容正确、资料当前或调用者有权访问。
Index如何从资料中找候选?索引版本、材料来源与可用过滤字段召回完整、候选相关或来源可引用。
Candidate本次查询找到了什么可能材料?来源标识、片段范围、排序信号与元数据该片段支持回答、内容当前或可公开使用。
Evidence Unit哪段材料可支持哪项受限主张?稳定位置、主题、时间、来源种类、限制与引用关系任务已经完成或整个页面都适用。
Answer面向读者的受限结论主张、Evidence Card、未覆盖范围资料库完整或现实世界已改变。

索引是为了定位候选,不是事实裁判。OpenAI 当前的 Vector stores API 参考把 vector store 用于语义搜索和 file_search,并列出切块策略、查询和文件属性筛选等接口概念。REF-047 这是一个产品范围内的例子:切块和过滤属于明确设计选择;它不规定本书的资料结构,也不代表任何命中都已核验。

Knowledge Base Profile:先写清楚资料边界

本书建议在建立索引之前,为资料集合保留一张 Knowledge Base Profile。它不需要是复杂的数据库 schema;它的目标是让维护者知道“这里面有什么、谁负责、什么不应该被拿来回答”。

字段需要回答的问题教学示例不能替代什么
scope资料服务哪个主题和读者?当前版本的开发者文档模型的全部知识。
source_priority相冲突时优先谁?当前官方文档优先于未核验博客事实自动正确。
owner谁负责更新或下线?文档维护团队访问或执行权限。
freshness_rule哪些任务必须重新核验?“当前、最新、价格、安全策略”页面永不过期。
sensitivity哪些资料不得进入模型上下文?含客户数据的内部附件安全控制已经实现。
exclusions什么材料只可导航、不可引用?无日期转载与未验证摘要它们完全没有价值。

这张 Profile 既不是权限矩阵,也不是索引配置。权限、Sandbox 和凭证由第 12 章处理;Profile 只提供检索前的资料边界。没有它,系统容易把“内部笔记出现了某个词”误当成“可以向外回答”。

Evidence Unit:让片段保留来处、时间和限制

切分能让系统处理较大资料库,也可能让原文失去主体、条件和时间。Anthropic 的 Contextual Retrieval 工程文章描述了一条典型 RAG 路径:将资料切为片段、建立嵌入、按查询找相关片段,再把候选加到 Prompt;该文还讨论了词法匹配对精确术语的补充作用。REF-046 本章不采用其参数、实验结论或供应商组合,只保留一个设计提醒:片段边界会改变可解释性。

本书的 Evidence Unit 是可引用片段的审查包装。它至少应保存:

  • 稳定的来源位置,例如页面 URL、文档锚点、版本或受控文档标识;
  • 原始资料与片段的关系,例如标题、章节、开始/结束范围或定位说明;
  • 该片段能支持的主题和不能支持的主题;
  • 来源种类、访问或核验日期、适用版本/环境,以及已知的时效限制;
  • 与输出主张的回链,而不是只保留一段脱离来处的文本。

如果片段只写“使用 bearer token”,却缺少“哪个 API、哪个版本、怎样配置、资料日期”,它可能是有用的导航线索,却不适合作为“当前鉴权方式”的最终证据。保留这个缺口,比用模型补齐未知的上下文更可审查。

Retrieval Policy:把检索视为带门的请求

检索策略(Retrieval Policy)是本书模型,不是搜索引擎配置。它告诉 Harness 哪些候选可以进入证据评估,哪些候选只能用于导航,哪些情况必须停止。最小策略可包含:

规则问题教学示例失败时的保守动作
任务范围这次要回答哪个受限问题?api_authentication要求澄清,不扩大查询。
来源优先级哪类资料优先?当前官方页、原始论文、受控内部资料、其余导航材料不让低优先级候选直接支撑结论。
新鲜度是否必须在写作当日核验?含“当前”“最新”“价格”“安全”的问题标记 needs_evidence
元数据过滤允许哪个产品、版本、区域或文档类型?只接受目标 API 的开发者文档拒绝范围不匹配候选。
定位要求读者能否回到来源?URL 和页面/章节定位齐全不把材料写成可引用事实。
停止条件何时不再继续生成?官方候选冲突且无法确认日期说明未知范围并升级。

Policy 先于排序。排序可以帮助缩小候选集合,却不能回答“此来源是否允许”“它是否覆盖当前问题”“它是否仍新鲜”。为了避免把复杂检索系统伪装成一个分数函数,本书不提供统一阈值、Top-K、嵌入模型或融合公式。

检索分数、范围与新鲜度:不同信号不能互相代偿

相似度、词法命中、来源种类、时间和引用位置是不能互相代偿的不同维度:

信号有助于回答什么不足以回答什么需要配合什么
语义相似度材料与查询可能在表达含义上接近精确术语、版本、产品范围或事实正确性范围与来源核对。
词法命中特定错误码、字段名或产品名是否出现段落是否回答完整问题语境与片段边界。
来源种类材料是否符合设定的优先级内容是否当前、适用或无冲突日期、范围和主张核对。
新鲜度标记是否已有可追溯的核验动作资料内容已完整覆盖任务主题与引用检查。
稳定位置读者能否回到材料该材料支持哪个结论Evidence Card 中的主张范围。
引用回链输出知道自己依据哪项材料答案已被独立验收第 17 章的验证规则。

因此,最高分候选仍可能被拒绝。反过来,低分但来自当前官方页面的候选也不能因为“官方”而自动通过;它仍须覆盖问题的具体范围。证据工程的目标不是消除不确定性,而是让不确定性停留在可见的位置。

架构图:从候选到带引用输出的证据流水线

下图回答:任务范围、Retrieval Policy 和证据门怎样约束从候选集合到带引用输出的路径?为什么没有通过范围、来源、新鲜度、位置和回链检查的材料只能补证或停止?

Mermaid 源文件位于 chapter-13-retrieval-evidence-pipeline.mmd,已于 2026-07-16 使用 Mermaid CLI 11.16.0 导出并查看 SVGPNG

图只表达本书的证据准备模型,不表示真实搜索、向量化、网页访问、索引、权限、来源可信度、内容正确性或任务验收已经发生。

mermaid
%% 第 13 章:检索到引用输出的证据流水线。
%% 本图只表达本书教学模型,不表示真实搜索、索引、网页访问、权限、来源可信度、内容正确性或任务验收。
flowchart TB
    Task[Task Scope<br/>问题、范围、新鲜度要求]
    Policy[Retrieval Policy<br/>来源优先级、过滤与停止条件]
    Candidates[Candidate Set<br/>可能相关的片段与元数据]
    Gates[Evidence Gates<br/>范围、来源种类、新鲜度<br/>稳定位置与回链]
    Card[Evidence Card<br/>主张范围、来源位置、日期与限制]
    Context[Context Package<br/>受限证据与未知范围]
    Output[Cited Output<br/>带回链的受限主张]

    Task --> Policy
    Policy --> Candidates
    Candidates --> Gates
    Gates -->|通过当前任务的证据门| Card
    Card --> Context
    Context --> Output

    Gates -->|范围不匹配、过期、不可定位或缺回链| NeedsEvidence[needs_evidence<br/>补证或澄清范围]
    NeedsEvidence -. 修订查询或策略后重新评估 .-> Policy
    Gates -->|来源种类不允许或候选不存在| Blocked[blocked<br/>不把候选写成证据]
    Blocked -->|无法补证时说明未知范围| Stop[stop / escalate<br/>保留检索记录与未覆盖范围]

    Output -. 每项主张回链到 .-> Card
    Card -. 不替代任务验收 .-> Evaluation[Evaluation<br/>第 17 章的独立判定]

图示替代描述:任务范围和 Retrieval Policy 产生候选集合。候选必须通过范围、来源种类、新鲜度、稳定位置和引用回链等 Evidence Gates,才能形成带主张范围、来源位置、日期与限制的 Evidence Card;随后这些卡片被装配成受限上下文并输出带回链的主张。门失败时,范围不匹配、过期、不可定位或缺回链转入 needs_evidence 并回到 Policy;候选不存在或来源种类不允许转入 blocked,无法补证时保留未知范围并停止或升级。虚线表示引用回链和“不能替代验收”的约束。

工作流程:把检索变成可审查证据

以下顺序是本书建议,不是某个搜索引擎、向量数据库或 API 的默认算法:

  1. 澄清问题范围: 记录任务想回答的对象、时间、产品/版本、读者和允许结论;出现“当前”时把写作日核验列为前提。
  2. 选择 Knowledge Base Profile: 确认资料集合、来源优先级、敏感边界与更新责任;不把项目外材料默认混入。
  3. 写 Retrieval Policy: 设定可用来源种类、元数据过滤、新鲜度、稳定位置和停止条件;这一步先于查询优化。
  4. 取得候选集合: 候选只记录“可能相关”,保留其来源、片段范围、排序信号和获取条件;不要把排序顺序当成结论。
  5. 执行证据门: 检查候选是否覆盖任务范围、是否符合来源优先级、是否已按要求核验新鲜度、能否稳定定位,以及能否进入输出回链。
  6. 形成 Evidence Card: 为通过的候选写明“支持哪项主张、在什么范围内、来源在哪里、何时访问、有什么限制”。
  7. 装配受限上下文: 把证据与未知范围共同交给模型;不要让模型把缺失条件补成事实。
  8. 输出并回链: 让每项可归因主张能回到 Evidence Card。结果验收、人工责任和新一轮检索分别交给后续章节。

Evidence Card 模板

下表是本书模型。它刻意把“能支持的主张”和“仍然未知”放在同一张卡上:

字段示例性内容作用不表示
claim_scope“目标 API 的当前鉴权入口”防止把局部材料扩展成通用答案页面覆盖所有 API。
source_location官方页 URL 与章节定位允许读者回链页面当前可访问。
source_kindofficial与 Policy 对照绝对正确。
verified_at写作当日复核日期对时间敏感问题保留证据永久新鲜。
evidence_boundary仅支持某个产品与版本范围约束生成其他环境同样适用。
answer_link输出中的引用位置让主张与来源关联任务已通过验收。
unknowns未覆盖区域、冲突或待查项保留诚实的不确定性系统已经失败。

最小示例:评估注入的证据候选

完整实现见 retrieval-evidence-assessment.mjs,测试见 retrieval-evidence-assessment.test.mjs。它不检索任何材料;只判断注入对象是否满足本章教学用的 Retrieval Policy。

js
const result = assessRetrievalEvidence({
  query: { scope: 'api_authentication', requiresFreshness: true },
  candidates: [{
    id: 'official-auth-doc',
    sourceKind: 'official',
    scopes: ['api_authentication'],
    url: 'https://docs.example.invalid/auth',
    freshness: 'verified',
  }],
  policy: { allowedSourceKinds: ['official', 'primary_paper'] },
  selection: {
    candidateIds: ['official-auth-doc'],
    citedCandidateIds: ['official-auth-doc'],
  },
});

运行环境: Node.js 的内置测试运行器;不需要网络、文件、数据库、模型、向量库或外部凭证。

实际验证: 2026-07-16 已运行:

bash
node --test examples/agent/retrieval-evidence-assessment.test.mjs
node examples/agent/retrieval-evidence-assessment.mjs

第一条命令退出码为 0,7 项测试通过、0 项失败;第二条命令退出码为 0,输出 allowed / evidence_selection_allowedofficial-auth-doc。这只说明函数会按注入对象返回预期判断,并不证明示例 URL 存在、来源实际新鲜、官方资料正确或任何答案已验收。红绿记录和完整边界见示例实现记录

逐步增强:从候选检查到真实检索系统

最小示例故意停在 Policy 判断。若真实需求出现,可按一项复杂度一次推进:

  1. 增加结构化 Evidence Card: 当多个主张需要不同材料时,为每个主张保存来源位置、范围和未知项;不要先引入向量数据库。
  2. 增加受控资料读取: 当资料集合已明确、权限已通过第 12 章审查时,记录实际读取范围、失败和敏感数据处理;不能把文件名当作内容证据。
  3. 增加索引与查询实现: 当人工筛选已无法满足规模需求时,为切分、元数据、版本、删除和重建选择具体实现,并用任务集评估召回和误取风险。
  4. 增加独立验收: 当输出会驱动业务或对外发布时,按第 17 章定义主张级核验和失败报告;引用存在不能替代验收。

升级触发条件是明确的规模、时效、合规或可重复性需求,而不是“RAG 是默认架构”。小型、稳定且可人工审阅的资料集可能只需要普通 Markdown 链接与 Evidence Card。

完整工程案例:为“当前 API 鉴权方式”准备证据

这个案例是原创教学设计,不指向任何真实产品。目标是向读者解释一个目标 API 的当前鉴权入口;成功标准是每一句可归因结论都能回到写作日复核的官方页面位置,并且没有把未知环境写成确定配置。

决策点选择原因拒绝或升级条件
查询范围目标 API、当前文档、开发者读者避免把其他 API 或历史迁移文档混入任务未说明产品/版本时先澄清。
来源优先级当前官方开发者文档优先目标是当前接口说明,而不是经验分享官方页面缺日期、范围或定位时不能自动通过。
博客处理仅作导航线索可帮助发现术语或迁移路径不直接支撑“当前方式”结论。
新鲜度写作当日重新访问候选官方页“当前”是时间敏感限定词无法复核时输出待核验范围。
片段选择保留标题、条件和稳定位置防止脱离上下文的鉴权术语被误用只有一句口号或缺目标范围时补证。
输出主张旁附 Evidence Card 回链让读者可自行复查发现冲突或未覆盖环境时停止并说明。

在这个案例中,检索完成不等于“答案可发布”。如果官方页面只覆盖服务端而问题没有说明客户端环境,Evidence Card 应写出未覆盖范围。若不同官方页彼此冲突且无法确认优先级,应保留冲突、停止自动归纳,并转入人类审查,而不是让模型选择看起来更顺的一段。

实现说明

决策选择原因替代方案与边界
检索请求入口明确 query.scope先约束问题,再判断候选自由文本查询可由真实系统产生,但仍需映射到受控范围。
来源种类Policy 的 allowlist让优先级可审查allowlist 不是真实信任或权限系统。
新鲜度注入 freshness: verified 教学标记让时间敏感任务有可测试的门真实页面核验必须在系统外实际进行。
稳定位置非空 URL要求可回链URL 不保证内容、版本或访问权限。
引用回链选中候选必须出现于 citedCandidateIds避免答案引用与证据选择脱节不检查自然语言主张是否被语义支持。
分数示例完全不接收分数分数不应绕过来源与范围门真实检索可用分数排序,但必须保留上述门。

测试与验证

层级验证对象实际命令或方法成功标准实际状态
红灯缺失实现模块node --test examples/agent/retrieval-evidence-assessment.test.mjs因模块缺失失败已实际运行;退出码 1ERR_MODULE_NOT_FOUND
单元纯内存 Policy 判断node --test examples/agent/retrieval-evidence-assessment.test.mjs7 项通过、0 项失败已实际运行;退出码 0
演示注入的官方新鲜候选node examples/agent/retrieval-evidence-assessment.mjs输出 allowedevidence_selection_allowed已实际运行;退出码 0
图示Mermaid 源与导出图Mermaid CLI 渲染、PNG 视觉查看与图文比较流程、拒绝出口和术语清晰一致已实际运行;见 Diagram Review。
真实检索网页、文件、索引、模型或产品 API未实现不可用纯内存输入代替未执行;不在本章范围。

工程实践

  • 让每次检索记录任务范围、Policy 版本、候选标识、拒绝原因和未知项。这样接手者能知道“为什么没有使用某条材料”,而不只是看到最终答案。
  • 对“当前”“最新”“价格”“配额”“安全策略”一类问题,把写作日重新核验当作入口条件,而不是生成后的修辞检查。
  • 将来源位置、片段边界和主张范围一起保存。只保存文本片段会让后续读者无法复核条件。
  • 允许空结果和拒绝结果进入工作流。needs_evidence 不是错误掩盖,而是防止系统把不完整候选升级成事实。
  • 将可检索资料和可进入模型上下文的资料分开。敏感、超范围或未授权材料即使可被索引,也不应自动被装配。

最佳实践

  • 先定义问题范围,再选择检索器。 这样可以检验“搜索不到”究竟是资料缺失、范围不清还是索引能力问题。
  • 把来源优先级写成规则,而非只放在提示词里。 规则能被测试和审查;自然语言偏好很容易被相似度或模型摘要覆盖。
  • 把新鲜度视为主张的一部分。 只要主张包含“当前”,Evidence Card 就应记录核验时点与未覆盖环境。
  • 保留拒绝理由。 候选因过期、范围不匹配或不可定位而被拒绝,是下一轮补证和交接的重要信息。
  • 让引用指向最小支持范围。 整页链接不应掩盖实际只支持其中一个条件的事实。

常见错误

错误表现根因修复方向
把相似度最高当作事实最佳高分旧文被写成当前结论将排序信号误作来源和新鲜度判断在 Policy 中单独检查来源、范围和日期。
把片段脱离原文“它”或“此方式”失去指代对象切分没有保留标题、条件或定位Evidence Unit 保留片段边界与最小语境。
只保存 URL读者能打开页面,却找不到支持结论的位置缺少主张范围与引用回链写 Evidence Card 的位置和 answer_link
把官方来源当万能通过证官方页面被用于错误产品、旧版本或未覆盖环境来源种类替代了范围核对让来源、范围和新鲜度分别过门。
无法检索时继续生成模型用先验补出确定答案没有停止或升级条件返回 needs_evidence、说明未知项或请求人类处理。
用引用代替验收有链接就宣称任务完成混淆证据准备与结果验证把最终接受留给第 17 章。

安全与边界

  • 数据边界: 知识库可能包含内部、客户或受限资料。它被索引不表示可发送给模型、其他 Agent 或外部读者;需要由第 12 章的环境与权限机制决定可见范围。
  • 提示注入边界: 被检索文本是输入材料,不是系统指令。真实系统应区分内容与控制指令,并记录材料来源;本章不实现该隔离。
  • 新鲜度边界: freshness: verified 只是示例里的注入标记;它不读取时钟、不访问页面,也不保证现实资料仍有效。
  • 责任边界: Evidence Card 支持审查和回链,不授予批准、访问、发布或业务决策权。冲突、敏感资料或高风险结论应停在可观察的升级点。
  • 不适用范围: 需要完整权限模型、真实网页抓取、企业数据治理、法律合规、检索基准或生产级 RAG 时,必须另行设计、实现和验证。

章节总结

Knowledge Base 不是一个把所有资料混在一起的容器,检索也不是把高分文本递给模型。可靠的证据层先定义问题和资料边界,再通过来源、范围、新鲜度、稳定位置与回链选择候选;它把能支持的主张和仍然未知的范围一起交给后续步骤。

这套做法不会让答案自动正确,但能阻止 Harness 把候选、分数或摘要伪装成事实。下一章将把这种可见的证据和不确定性带到人类参与点:何时应由人审核、批准、拒绝或接手。

练习

  1. 为“某依赖库是否仍支持一个 API”写一张 Retrieval Policy,说明来源优先级、新鲜度、稳定位置和停止条件。
  2. 给出一个“高分但不应进入答案”的候选,并分别指出它在范围、来源、新鲜度、位置或引用回链上缺少什么。
  3. 为一个内部知识库补充 Knowledge Base Profile,列出允许索引但不允许装配给模型的资料类型,以及升级路径。
  4. 修改纯内存示例,使它额外报告被拒绝的候选原因;说明新增字段仍不能替代真实页面核验的原因。

延伸阅读

参考资料

本章使用的局部研究键、允许用途与外推禁区见第 13 章候选资料。正式引用 REF-045 至 REF-047 已登记到全局 .ai/references.md;本地键仅用于历史追溯。

章节完成检查表

  • [x] Front matter、学习目标、前置知识和章节依赖完整。
  • [x] 正文以原创场景、Evidence Unit、Retrieval Policy 和 Evidence Card 组织,来源事实与本书模型已区分。
  • [x] 每项可归因事实有局部可追溯来源;动态 API 文档已标记写作日重查要求。
  • [x] Mermaid 图有源文件、读图说明、替代描述、SVG/PNG 导出和图示审查记录。
  • [x] 纯内存示例有红绿记录、环境、命令、实际结果和外部系统边界。
  • [x] Technical Review、Fact Check、Language Editing、Diagram Review 和 Final Review 已记录。
  • [ ] 全仓 npm run validate 与状态文件同步由主线程统一执行,尚未由本章工作线程运行。

从同一套 Markdown 书稿生成。