沈毅全栈与 AI

巴黎 • 新加坡 • 上海

RAG Formation · 第 9 课 · 有据的回答生成

上下文组装与证据预算

理解检索结果如何成为模型上下文,以及截断如何删除关键证据。

$ lesson --status
▸ course RAG Formation
▸ lesson 09 / 16
▸ phase 有据的回答生成
▸ status 已完成
● build → measure → learn

独立课程

在这里学习完整课程并检验你的理解。

RAG Formation 的 16 节课程内容已完成。本页包含完整课程内容、本地参考资料和可直接在浏览器中完成的即时练习。

本课的具体收获

你会为一个多跳答案画出证据存活图,并提出一条有边界、站得住脚的上下文预算建议。

观看讲解视频

1 · 核心技能

选择 q30 或 q63,从检索找到的来源开始,一路跟踪到上下文组装,直到最终的提示词预算。

  • 上下文组装:把后端结果转换成回答模型实际读取的文本。在这套系统里,这一步分四路通道运行——摘要、向量、全文和图谱——build_context() 会用最大最小公平算法,在一份以字符计量的预算中为每个有内容的通道分配份额。它会尽可能整条丢弃检索结果,报告哪些证据留了下来,并避免某一路被饿到零而另一路还有富余。摘要、向量和全文的每个结果最多 1,200 个字符;图谱上下文最多 6,000 个字符;合并后的 max_context_chars 默认是 32,000 个字符(可配置范围为 1,000–50,000)。
  • 分块大小与上下文预算:前面关于索引的发现是另一件事:统一索引器对 Qdrant/Meilisearch/摘要使用 500 token 分块,对 LightRAG 使用 1,200 token 分块。这些是建索引时的 token 大小,不是回答模型使用的字符预算。把 500 改成 800 需要重新建索引;它本身不会改变 build_context() 的回答上下文上限。
  • 证据预算:你能负担的上下文上限,由字符数、token 数、延迟或成本决定。
  • 来源存活:格式化和截断完成后,答案真正需要的证据是否仍然保留。描述旧做法的那段代码注释说得很直白:以前是固定顺序拼接,“决定谁能进上下文的是位置,不是相关性”——图谱这一块总是排在最后,所以永远是第一个被挤掉的。
  • 这跟第 5 到 8 课走的不是同一条路:那几课用的 --mode retrieval 调用的是 /api/v1/search,没有任何融合,只是纯拼接。这一课用的 --mode answer 调用的是 /api/v1/qa,才有真正按通道公平分配预算的逻辑。第 8 课学到的“没有融合”,不要搬到这一课来用——它在这里不适用。

主要阅读:Anthropic《上下文检索》

2 · 运行证据闭环

cd demo
python3 eval.py run --mode answer --workspace meridian_demo --category multi_hop --tag lesson-09-context

对每个来源,去看逐题报告里的这几个字段,不要靠猜测已经渲染好的答案:

  • results[].answer.stats.context_chars_by_index——每个通道(summary/vector/fulltext/graph)真正进入提示词的字符数。
  • results[].answer.stats.max_context_chars——配置的合并字符预算;当前 API 默认是 32000,不要把它和建索引时的 chunk size 混为一谈。
  • results[].answer.stats.context_items_included.context_items_dropped——后者只有真被丢弃的内容才会出现;被丢弃的条目会按通道分别列出。
  • results[].answer.stats.context_hard_truncated——正常应该不存在,或者是 false;一旦是 true,说明公平分配的兜底逻辑不得不从字符串中间硬切,而这本该是设计上永远不会发生的情况。
  • results[].answer.sources.source_hit.all——真正存活下来的引用,以及它们是否覆盖了所有预期来源。

如果来源在生成前被截断,模型就永远看不到它——检索阶段找到它并不算完成任务。多跳问题尤其要先看 context_chars_by_index.graph,再看 graph 有没有出现在 context_items_dropped 里——这能告诉你连接两个事实的证据到底有没有活着进入提示词,别急着断定是模型对已有证据推理得不好。

3 · 决策工作表

基线证据一个假设/改动指标回归检查有边界的结论
_________________________

4 · 检索练习

问题:检索找到了你预期的所有来源,但其中一份在生成开始前被截断。实际失败发生在哪里?

企业场景连接

模型从未看到的证据,系统就无法引用。这正是可靠检索如何悄悄变成不完整答案,甚至变成幻觉的地方。

5 · 交付物与下一步

  1. 保存命令输出或汇总报告。
  2. 填写决策工作表。
  3. 写下一个失败案例,以及下一步要检查的内容。

交付物是一张多跳答案的证据存活图,以及一条有边界、可辩护的上下文预算建议。

下一步:第 10 课将讲如何让提示词只依据证据回答。

如果对证据、指标、失败案例或下一步实验有疑问,尽管继续问我。 这门课我就是你的老师。