检索质量评估
检索是否值得引入,不应由“用了向量”决定,而应由真实问题上的来源命中决定。评估的目标不是证明方案先进,而是回答:它有没有把正确资料带到模型面前,代价是否可以接受。
先定义“好”的标准
先写下你要改善的具体现象,例如:
- 用户换个说法就找不到已有资料;
- 正确资料在候选里,但排在很后面;
- 没有资料时仍然编出答案;
- 回答引用的来源与正文对不上。
不同现象对应不同指标。只改善平均延迟、候选数量或“看起来更智能”都不算目标。
建一个小样本集
从真实提问里抽样,覆盖三类:
| 类型 | 例子 | 期望 |
|---|---|---|
| 有明确来源 | “播放器怎么暂停” | 对应主题或章节进入前 k 条 |
| 同义或口语 | “那个放歌的地方怎么关” | 与上一类命中同一来源 |
| 没有资料 | “你们支持哪些支付方式” | 明确说明没有资料,不编造 |
每条样本记录 question、expectedSourceIds 和可选的 mustNotSourceIds。样本不必多,但要来自真实使用,而不是为检索算法量身定做。
指标
| 指标 | 定义 | 用途 |
|---|---|---|
| recall@k | 期望来源是否出现在前 k 条 | 判断召回是否够用 |
| 无答案正确率 | 没有资料时是否明确说不知道 | 防止编造 |
| 引用准确率 | 回答中的引用是否指向真实来源且内容一致 | 防止错误归因 |
| 额外延迟 | 检索与 embedding 增加的耗时 | 判断体验代价 |
| 单次成本 | embedding 调用与索引维护成本 | 判断长期可持续性 |
recall@k 只说明来源有没有被带到,不说明模型是否用了它;引用准确率需要结合回答正文检查。
记录建议
日志字段属于软约定,不是 SDK 强制 schema。建议至少记录:
- 配置标识与索引 revision;
- 检索方式(整篇、章节、关键词、向量、融合);
- 命中的来源 ID、名次与分数;
- 是否降级、降级原因;
- 延迟、embedding 模型 identity、调用结果状态;
- 无答案判定结果。
不要记录完整提示词、密钥或未脱敏的个人资料。问题文本是否需要落盘,按隐私策略决定;需要时可以只记录哈希与长度。
一个最小评测脚本
ts
type Case = { question: string; expectedSourceIds: string[] };
async function evaluate(
cases: Case[],
retrieve: (question: string) => Promise<{ sourceIds: string[] }>,
k: number,
) {
const rows = [];
for (const item of cases) {
const { sourceIds } = await retrieve(item.question);
const top = sourceIds.slice(0, k);
rows.push({
question: item.question,
hit: item.expectedSourceIds.some((id) => top.includes(id)),
top,
});
}
const answered = rows.filter((row) => row.hit).length;
return { recall: answered / rows.length, rows };
}无答案样本单独统计,不要和 recall@k 混在一起。引用准确率需要检查回答正文与来源,不能只看向量分数。
对比实验
一次只改一个变量,并固定其余条件:
- 同一份语料快照与 revision;
- 同一组问题;
- 同一模型与提示词;
- 同一 k 与预算;
- 同一权限范围。
建议至少比较三组:整篇读取、章节读取、混合检索。只看混合检索与关键词的差异,无法说明问题出在切块还是向量。
决策规则
- 期望来源没有进入前 k:先改切块、词表或章节结构,不要先调模型。
- 来源进了前 k,但回答仍错:检查证据是否进入上下文、预算是否截断、模型是否忽略来源。
- 没有资料时仍编造:优先修无答案判定与提示边界,不要靠提高相似度阈值掩盖。
- 检索成本明显上升但来源命中没有提升:停止向量化,把维护成本放回资料结构。
评估结论应写成“在什么样本、什么配置、观察到什么”,而不是“效果更好”。样本或配置变化后,旧结论不能直接沿用。
常见误区
| 误区 | 问题 | 替代做法 |
|---|---|---|
| 用调参时的同一批问题验收 | 结果被过拟合 | 留出未参与调整的样本 |
| 只看 top1 | 正确来源常在前几条 | 看 recall@k,并检查引用 |
| 把融合分数当置信度 | 分数只表示名次 | 用来源命中与回答正文判断 |
| 忽略无答案样本 | 编造不会被发现 | 单独统计无答案正确率 |
| 用延迟或成本代替质量 | 指标方向错误 | 质量与代价分开记录 |
下一步
- 需要搭建检索链:RAG 资料搭建。
- 需要注入失败与延迟做对照:MockGPT 离线验证。
- 需要确认上线前的证据范围:上线前的软性检查。