沈毅全栈与 AI

巴黎 • 新加坡 • 上海

RAG Formation · 第 8 课 · 检索工程

查询处理与重排序

改进困难查询,同时不靠增大 top-k 来掩盖检索失败。

$ lesson --status
▸ course RAG Formation
▸ lesson 08 / 16
▸ phase 检索工程
▸ status 已完成
● build → measure → learn

独立课程

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

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

本课的具体收获

你会完成一张经得起证伪的检索实验卡:假设、指标、基线、回归检查和终止条件都写清楚。

观看讲解视频

1 · 核心技能

从 q24、q46、q52 或 q63 中选一道,针对可能修复问题的查询归一化,写出一个单一假设——这是你在第 2 节里真正能对这套演示环境实际测试的技巧。重排序和去重放在下面单独介绍,而且比通常更坦诚:它们在这套代码库里都是真实存在的代码,但都没有按名字暗示的方式运行,这个落差本身就值得先弄清楚,再决定要不要在生产环境里信任它们。

  • 查询归一化:把一个用户问题转换成几种可检索的形式——原始问题、其中隐藏的文档编号、展开的缩略词,或翻译后的术语。
  • 重排序:这套代码库里确实有一个真正的重排序服务(aperag/llm/rerank/rerank_service.pyaperag/flow/runners/rerank.py)——它甚至编码了一条有文档记录的兜底策略:图谱结果被认为“质量更好”,应该优先排在前面。但这套演示环境 /api/v1/search 真正走的检索路径(qa_service.pysearch.py)从来没有调用过它。今天的检索只给你一轮粗略的候选结果,仅此而已——之后没有任何重排序步骤。在生产环境里信任重排序之前,值得先核实:这条兜底策略是否符合你自己的优先级,重排序调用会增加多少延迟,如果重排序调用本身失败了,答案会变成什么样?
  • 去重:也比名字暗示的更有限。今天,去重只作用于展示给用户的引用列表,按文件名匹配。真正放进 LLM 提示词上下文里的片段文本从未被去重——同一份文档里两个互相重叠的片段,即使最终屏幕上只显示一条引用,也可能同时占用你的证据预算。

主要阅读:Elasticsearch《学习排序》

2 · 运行证据闭环

cd demo
python3 eval.py run --mode retrieval --workspace meridian_demo --category reference_lookup --tag lesson-08-baseline

写下你预期看到的来源、基线是否真的找到了它、尝试的一个查询变体,以及之后同一个指标如何变化。

提高 top-k 只会用更多噪声掩盖检索失败,并不能告诉你真正哪里出了问题。

3 · 决策工作表

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

4 · 检索练习

问题:q24 中直接出现了准确的程序编号。首先值得测试什么?

企业场景连接

基线已经说明问题:检索并集很高,但多跳答案仍然较弱。一次严格受控的查询实验可以针对这个确切的失败模式,不需要动整条流水线。

5 · 交付物与下一步

  1. 保留命令输出或报告的副本。
  2. 填写决策工作表。
  3. 写下一个失败案例以及下一步要验证的内容。

交付物是一张经得起证伪的检索实验卡:假设、指标、基线、回归检查和终止条件都写清楚。

下一步:第 9 课将讲上下文组装和证据预算。

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