RAG 如何在 Token 预算内打包证据,证据顺序为什么重要?
先用自己的话答,再看参考说法
60 秒是练习上限,不是必须凑满。原理题讲清因果,设计题讲清约束,项目题只讲真实证据。
别照着背。参考说法只用于对照;直接回答问题,简单题说清楚就收尾。项目题只用自己的经历和数字。
参考内容当前已显示;开始口述后会暂时隐藏。
面试时怎么答
把它描述成预算约束下的“选哪些、放哪里”,而不是按检索分数机械拼接。先去重、覆盖不同子问题并标注来源和冲突,再谈顺序可能受 Lost in the Middle 影响。
对“最佳顺序是什么”不要给绝对答案。说明模型和任务不同,需要做位置扰动实验;高相关证据可以放在更易被利用的位置,但冲突材料不能被静默丢掉。
可以这样答:
RAG 的证据打包是在 Token 预算内同时优化相关性、覆盖度和位置,不是把 Top-K 全部拼进去。先去重并覆盖各子问题,再处理时间、来源和相互冲突的材料;排序时要考虑模型可能忽略中部内容。证据越多不一定越好,噪声与延迟也会增加。具体顺序应通过预算消融和位置扰动验证,并观察证据利用率、忠实度与冲突识别率。
核心回答
上下文打包不是简单地按检索分数把 Chunk 从高到低拼接,而是在 Token 预算下同时优化相关性、问题覆盖、来源质量、多样性、冲突处理和位置效应。一个近似目标可以写成:在 \(\sum \operatorname{cost}(d) \le B\) 的约束下,最大化证据相关性与覆盖收益,并惩罚片段间冗余;其中 \(B\) 还要为系统指令、用户问题和答案预留空间。
顺序重要,是因为长上下文模型通常不能对所有位置同等稳定地利用信息。《Lost in the Middle》在多文档问答和键值检索实验中观察到:相关信息位于开头或结尾时往往表现更好,位于长上下文中部时可能明显退化。但这是一项依赖模型、任务和 Prompt 的实证现象,不应机械推导为“最相关证据永远放最后”。正确做法是对目标模型做位置扰动实验,再决定排序规则。
展开说明
一条稳健的打包链路通常包括:
- 硬过滤:先执行租户、用户、ACL、时间和版本约束,排除不允许进入上下文的内容。
- 选择与去重:按相关性选候选,同时用 MMR、聚类或规则降低语义重复,保证问题的不同子意图都有证据。
- 合并与压缩:合并相邻且同源的片段,必要时做可追溯压缩;不能让摘要丢掉限定词、数值和出处。
- 冲突处理:显式保留来源时间、权威级别和版本,不要把相互矛盾的片段静默融合成一个结论。
- 结构化编排:为每个证据块分配稳定 ID,使用清晰分隔符,将来源元数据与正文分开,便于引用与校验。
- 位置优化:根据目标模型的评测结果放置关键证据,并避免大量低价值片段把核心证据挤到难以利用的位置。
检索分数往往不可跨检索器直接比较,也没有编码 Token 成本、重复度与来源可信度。因此,最终上下文排序应该是独立于初始召回排名的一个优化阶段。
工程实践
记录每个 Chunk 的原始排名、重排分、Token 数、最终位置、来源 ID 和是否被答案引用。离线评测除改变 top_k 外,还应固定证据集合并随机或系统地改变正确证据的位置,测答案正确率和引用准确率,识别模型自身的位置敏感性。对检索到的文本使用“数据而非指令”的边界和分隔格式,防止文档内提示词改变系统行为;压缩或摘要的产物要能回溯原文,涉及数值和合规结论时优先保留原始证据。
常见追问
- 为什么不能把所有召回结果都塞进长上下文? 更多片段会增加成本、延迟、矛盾与噪声,还可能让关键证据处于模型不易利用的位置;上下文窗口容量不等于有效利用能力。
- 最相关证据应该放在开头还是结尾? 没有跨模型通用的固定答案。论文观察到明显的首尾优势,但具体布局应通过目标模型、真实 Prompt 和任务上的位置扰动实验确定。
- 如何在相关性和多样性之间取舍? 先保证关键子问题有直接证据,再惩罚高度相似的重复片段;可以调节 MMR 类目标中的相关性与冗余权重,并用端到端指标选择参数。
- 证据冲突时应该删掉低分文档吗? 不能只看相似度分数。应结合来源权威性、时间和版本判断;无法消解时保留冲突并让答案说明不确定性,而不是制造虚假的一致结论。
一句话复习
上下文打包是在 Token 预算内选择、去重、组织和定位可引用证据,排序规则必须用目标模型的位置敏感性实验来验证。
参考资料
评论与补充
评论会直接显示在这道题下面。可以写自己的答法、继续追问或指出错误,不需要 GitHub 账号,也不会跳转到 Issue;内容会公开,请勿填写个人隐私、公司机密或受保密约束的材料。
正在连接站内评论服务…
正在加载评论…
还没有评论,你可以先写下自己的理解或追问。