资讯详情

RAG从入门到实战(十):检索后的上下文优化——压缩、去重、父块扩展与引用

📅 2026/11/3 10:37:53 | 华诺云谱 👁 阅读
RAG从入门到实战(十):检索后的上下文优化——压缩、去重、父块扩展与引用
RAG从入门到实战十检索后的上下文优化——压缩、去重、父块扩展与引用文章目录RAG从入门到实战十检索后的上下文优化——压缩、去重、父块扩展与引用前言一、上下文优化在 RAG 中的位置二、为什么不能简单拼接 Top-K三、去重减少重复片段3.1 按稳定 ID 去重3.2 文本近重复去重3.3 合并相邻片段四、Small-to-Big小块检索扩大上下文4.1 什么是父子块4.2 扩展时要注意什么4.3 实践命中子块后查找父块五、相关片段提取让模型看到关键证据5.1 抽取式与生成式5.2 保留条件和引用位置六、上下文压缩与 Token 预算七、引用让答案可追溯7.1 代码示例构造带来源的上下文八、证据冲突和缺失怎么办8.1 证据冲突8.2 证据缺失九、如何评估上下文质量十、总结前言检索和重排序完成后系统已经拿到一批候选片段。下一步并不是把所有结果直接拼进提示词多个结果可能来自同一段原文内容大量重复。一个片段可能只包含结论缺少前提条件。检索到的文档过长直接传给模型会增加成本。模型生成了引用但引用片段未必支持对应结论。本篇讨论如何把候选结果组织成适合生成的证据上下文。示例中的制度、片段和引用均为虚构。一、上下文优化在 RAG 中的位置用户问题 → 检索 → 融合 / 重排序 → 候选片段 ↓ 权限与版本校验 → 去重 / 扩展 / 提取 ↓ 预算控制与引用标记 ↓ 大模型生成 → 答案核验这些步骤并不是固定顺序。例如可以先合并相邻块再去重也可以先对小块排序再扩展父块。应结合实际效果和权限模型选择。上下文优化不是替代检索或评估。如果正确证据没有被召回、原文过期或存在错误仅靠压缩与拼接无法可靠补救。二、为什么不能简单拼接 Top-K假设问题是工作满一年后年假能休几天需要提前多久申请候选结果包含A员工入职满一年后每年可申请 5 天带薪年假。 B员工入职满一年后可申请每年 5 天带薪年假。 C年假申请需提前三个工作日提交并经直属主管审批。 D差旅报销需在出差后 30 天内提交。A 和 B 高度重复C 包含问题的另一个必要条件D 与问题无关。若只把 A、B 拼在一起虽然看上去都很相关仍无法完整回答问题。上下文优化应关注相关性、覆盖度、可追溯性、权限、时效和长度预算而不仅是片段数量。三、去重减少重复片段3.1 按稳定 ID 去重同一片段可能被稠密检索、关键词检索和多个查询同时召回。先按稳定的chunk_id合并可以避免相同记录重复进入上下文。注意稳定 ID 应反映文档和版本等必要信息不能把不同租户或不同版本中碰巧相同的 ID 当成同一条。合并前应确认每条记录的授权和来源。3.2 文本近重复去重按 ID 去重无法发现重叠切分产生的近重复段落。可以使用文本规范化、字符相似度、向量相似度等方法检测但需要谨慎句子中一个“不”或一个数字的差异可能决定相反结论。不同版本中相似内容可能适用不同时间范围。表面重复的片段可能分别包含不同条件或来源。因此不建议只凭相似度高就无条件丢弃可以保留来源集合对差异部分做检查并用业务数据评估。3.3 合并相邻片段如果多个片段来自同一份文档的相邻位置可以按原始顺序合并并保留原始片段 ID 和页码范围。这有助于减少重复重叠内容但前提是解析器提供可信的位置映射不要把来自不同版本的相邻片段拼在一起。四、Small-to-Big小块检索扩大上下文4.1 什么是父子块索引阶段将文档切成较小的子块同时保留它们所属的父块或章节父块年假制度章节 ├─ 子块 1享受年假的资格与天数 ├─ 子块 2申请时间和审批流程 └─ 子块 3特殊情况在线阶段用小块检索命中后可扩展到父块或相邻片段补足条件和上下文。这类思路常称父子检索或 Small-to-Big。4.2 扩展时要注意什么父块可能过长扩大后未必适合全部送入模型。多个命中子块可能属于同一父块需要合并去重。父块与子块必须属于同一版本并能追溯原文位置。扩展出的每段内容都必须经过权限检查子块可见不意味着父块其他内容也可见。相邻文段可能属于另一个主题扩大范围需要评估噪声。对权限粒度细于父块的系统可以选择只扩展到已授权的相邻片段不能把整个父块无条件返回。4.3 实践命中子块后查找父块下面聚焦“子块到父块”的映射与去重不调用模型或向量数据库。示例中的子块视为已经按相关性排序并完成权限过滤的检索结果parent_by_id模拟独立的父块存储。父块也必须再次经过授权判断不能因为子块有权限就自动放行。fromcollections.abcimportCallable,Mapping,Sequencefromdataclassesimportdataclassdataclass(frozenTrue)classChild:content:strparent_id:strversion:strdataclass(frozenTrue)classParent:parent_id:strversion:strcontent:strdefexpand_parents(children:Sequence[Child],parent_by_id:Mapping[str,Parent],can_access_parent:Callable[[Parent],bool],*,limit:int2,)-list[Parent]:iflimit0:raiseValueError(limit 不能为负数)iflimit0:return[]result,seen[],set()forchildinchildren:parentparent_by_id.get(child.parent_id)ifparentisNoneorparent.parent_idinseen:continueifparent.version!child.versionornotcan_access_parent(parent):continueseen.add(parent.parent_id)result.append(parent)iflen(result)limit:breakreturnresultif__name____main__:parents{leave:Parent(leave,v1,入职满一年可享年假申请需提前三个工作日提交。),travel:Parent(travel,v1,出差结束后30天内提交报销申请。),}children[Child(年假申请需提前三个工作日,leave,v1),Child(入职满一年可享年假,leave,v1),Child(报销期限为30天,travel,v1),]# 仅用于演示真实应用必须调用可信的授权服务。selectedexpand_parents(children,parents,lambdaparent:parent.parent_idleave)print([(parent.parent_id,parent.content)forparentinselected])两个子块都指向leave因此父块只返回一次travel因模拟授权失败不会返回。父块顺序继承第一次有效命中的子块顺序。真实系统需要将子块 ID、父块 ID、文档版本和可信授权范围一起管理在检索、父块查询和引用预览各阶段执行权限控制上面的内存演示不是生产级权限实现。五、相关片段提取让模型看到关键证据检索到的候选可能很长只有其中几句直接相关。可以提取与问题有关的原句或段落再把这些片段及来源放入上下文。5.1 抽取式与生成式方式思路主要风险抽取式从原文中选择原句、段落或位置范围漏掉前提条件、上下文或否定词生成式用模型概括原文内容可能改写错误、遗漏限定条件或编造事实对需要准确引用的场景抽取原文并保留位置通常更容易核查。生成式摘要可以作为辅助但不能替代原始证据高风险场景还应增加人工或自动审核。5.2 保留条件和引用位置例如原句员工入职满一年后每年可申请 5 天带薪年假。只抽出“每年可申请 5 天带薪年假”就丢失了资格条件。提取时应保留条件、例外、数字、日期和否定词并保留原文定位信息。六、上下文压缩与 Token 预算压缩的目的不是单纯缩短文字而是在预算内保留回答所需证据。一个简化的预算关系模型可用输入预算 上下文窗口 - 系统指令与工具描述 - 对话历史与用户问题 - 预留的输出空间如模型限制与接口计费方式适用 - 安全余量不同模型和接口对输入、输出及上下文窗口的计算方式可能不同以对应文档和实际 tokenizer 为准。字符数不是可靠的 Token 数。可考虑去掉确实无关或重复的内容。对长片段抽取含关键条件的原文。限制单篇文档占据的预算避免一份文档淹没其他必要来源。为标题、来源标记、系统提示和用户问题留出空间。如果预算不足以容纳所有必要证据应继续检索、调整策略或明确说明不足而不是悄悄丢弃关键条件后自信回答。七、引用让答案可追溯一种简单方式是在上下文中为每份证据标记来源[来源 S1] 员工手册2026 版休假制度 / 年假资格 员工入职满一年后每年可申请 5 天带薪年假。 [来源 S2] 员工手册2026 版休假制度 / 年假申请 年假申请需提前三个工作日提交并经直属主管审批。生成答案时要求模型在相关陈述后标记S1、S2。展示层可以把这些编号关联到有权限访问的来源页面或片段。但“有引用”不等于“引用正确”引用的片段可能不支持该结论。一条结论可能需要多个来源共同支持。片段可能来自过期或错误文档。模型可能编造不存在的引用编号。应检查引用编号是否存在、用户是否有权访问、证据是否支持对应陈述并保留文档版本。引用链接也可能包含敏感信息不应直接暴露内部路径或未授权资源。7.1 代码示例构造带来源的上下文下面的示例只展示按 ID 去重、长度预算和来源映射不实现检索、语义压缩或权限系统。authorized必须来自可信服务端的权限判断而不是用户输入这里仅用布尔值模拟结果。defbuild_context(hits,max_chars):示例按输入顺序装入完整片段长度单位是字符不是 Token。ifmax_chars0:raiseValueError(max_chars 不能为负数)seenset()blocks[]sources{}forhitinhits:ifnothit.get(authorized,False):continuekey(hit[document_id],hit[version],hit[chunk_id])ifkeyinseen:continue# 不把未装入上下文的片段标记为已选来源。numberlen(blocks)1labelfS{number}blockf[{label}]{hit[title]}{hit[version]}\n{hit[text]}candidate\n\n.join([*blocks,block])iflen(candidate)max_chars:continueseen.add(key)blocks.append(block)sources[label]{document_id:hit[document_id],version:hit[version],chunk_id:hit[chunk_id],}return\n\n.join(blocks),sourcesif__name____main__:hits[{document_id:policy,version:2026,chunk_id:c1,title:年假制度,text:员工入职满一年后每年可申请5天带薪年假。,authorized:True},{document_id:policy,version:2026,chunk_id:c1,title:年假制度,text:员工入职满一年后每年可申请5天带薪年假。,authorized:True},{document_id:policy,version:2026,chunk_id:c2,title:年假制度,text:申请需提前三个工作日提交。,authorized:True},{document_id:private,version:2026,chunk_id:x,title:未授权文件,text:不应进入上下文。,authorized:False},]context,sourcesbuild_context(hits,max_chars300)print(context)print(sources)预期上下文包含S1和S2不会包含重复的c1或未授权内容。示例按输入顺序装入完整片段较长片段可能被跳过但后续短片段仍可能进入因此它不是“证据完整性保证”。真实系统需要在生成前判断所有必要证据是否覆盖避免因为预算跳过关键片段后继续自信作答。还应使用与目标模型一致的 Token 计数和可靠的权限服务。八、证据冲突和缺失怎么办8.1 证据冲突例如两份制度对同一问题给出不同天数。先检查文档版本和生效时间是否不同。适用部门、产品或人员范围是否不同。一份是否明确替代另一份。检索或解析是否错把不同段落拼在一起。若无法确定哪份适用应说明冲突并提供对应来源不要简单选择分数最高的片段当作唯一真相。8.2 证据缺失如果找不到必要条件可以扩大检索、补充查询或请用户澄清超过预设成本和重试限制后应明确说明资料不足。下一篇会进一步讨论自适应检索与纠错。九、如何评估上下文质量在相同检索结果和问题集上比较不同上下文构建策略评估点观察问题覆盖所有必要条件和证据是否保留相关性是否塞入大量无关或重复片段追溯引用是否能定位到正确的原文和版本忠实性压缩或提取是否改变原意、遗漏否定词权限扩展和展示是否泄露未授权内容成本上下文 Token、延迟与模型调用成本是否可接受可设计对照实验原始 Top-K、去重后、父块扩展后、抽取压缩后比较答案质量和来源支持情况。特别关注表格、跨页条件、相反结论、长文末尾信息和冲突版本。十、总结检索后的上下文优化要解决三个核心问题删掉什么重复和无关内容可以减少但不能误删条件。补充什么必要时扩展相邻片段或父块同时重新验证权限和版本。如何追溯保留原文、稳定来源和引用映射并核对引用是否真正支持结论。下一篇将介绍自适应检索和纠错如何检查证据、有限重试并在信息不足时拒答。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑