评估
RAG 出问题,先分清是 没检索到 还是 检索到了却胡编。本课只用课堂上能跑的检查:hit@k、忠实度启发式、「只根据上下文回答」。这不是论文指标,也代替不了人工抽查。
准备 20–50 条 你自己写的问答,答案必须依赖语料里的虚构事实(订单号 KH-8842、时限「7 日」)。网上能搜到的常识测不出检索。
检索:hit@k
每条问题标一个(或几个)应当出现的块 id。检索返回列表后,看 gold id 是否落在前 k 名。
hit@k 低:先改切块、嵌入模型、k、过滤,不要先换更大的聊天模型。hit@k 高但用户仍抱怨:问题在生成侧。
Recall@k(多个 gold 块时算召回)同一套列表就能算;教学阶段 hit@k 足够。
忠实度(faithfulness)
忠实度问的是:回答里的断言能否被上下文支持。与「好不好听」无关。课堂上两层:
1. 数字 / 代号抽查(无模型)
回答里出现的数字和订单号,必须在 context 里出现过。编造 8 日 或 KH-0001 会被抓住。
这拦不住「把 7 日说成一周」这类改写,但能挡住最常见的幻觉数字。
2. 短裁判提示词(可选,调用任意 LLM)
不要用「是否有用」当分数。有用但不忠实,对客服场景仍是事故。
「只根据上下文回答」
这是提示词约束,也是测试用例:
把 expect_unknown=True 的题目放进回归集:模型最爱在这里「帮忙」编一段。
建议工作流
- 固定切块与嵌入模型,跑 hit@4。
- 人工看 10 次完整问答(含应拒绝的题)。
- 数字抽查脚本跑全部回答。
- 再动 rerank 或混合检索,每次只改一个旋钮。
LangSmith、LlamaIndex evaluators、Dify 检索测试是同一思想的产品化,见 LangChain RAG、LlamaIndex、Dify 知识库。本课不绑定其中任何一个。