首页/AI/RAG 与向量库速查/相似度阈值与 No-Answer 判定
Embedding 与检索50 条

相似度阈值与 No-Answer 判定

用相似度阈值判断“无相关内容”并触发兜底话术:阈值没有通用常数,需要基于标注样本的分数分布选取,并同时观察误拒(漏答)与误收(答错)的比例。

RAG 与向量库速查AI更新于 2026-10-13

相似度阈值与无答案判定

阈值用来判断“知识库里到底有没有相关内容”:取回结果后看最高分是否低于阈值,低于就进入兜底话术,而不是硬让模型生成。阈值没有通用常数——它取决于 embedding 模型、是否归一化、分数口径(余弦、内积还是重排分),照抄别人博客里的数字通常会让误拒率飙升。正确做法是从标注样本里观察相关与不相关两类问题的分数分布,取一个在误拒(该答没答)与误收(没答案硬答)之间平衡的位置。

基本信息

作用判断是否有相关内容,决定是否走兜底
取值来源标注样本的分数分布,不照搬外部经验值
影响变量embedding 模型、归一化方式、分数口径、是否重排后判定
两类错误误拒(漏答)与误收(答错)
配套动作阈值变更要重跑评测,包含“无答案集”子集

典型使用场景

  • 内部制度问答:库里没有的问题必须明说没有,不能编造条款
  • 服务健康监控:统计低于阈值的查询占比,骤升说明语料或检索链路出了问题
  • 换模型后重新定标:新模型的分数分布不同,旧阈值直接失效
  • 多路召回判定:在融合后的分数上定阈值,而不是在某一路的原始分数上
  • 与重排配合:先按召回分做粗筛,再按重排分做最终无答案判定

阈值判定与兜底

阈值判定与兜底
hits = vector_store.search(q_vec, top_k=10)
best = hits[0].score if hits else 0.0
if best < ANSWER_THRESHOLD:                 # 阈值来自标注样本
    return '知识库中未找到相关内容,建议转人工或换个问法。'
answer = generate(q, build_context(hits))

两类错误的取舍

阈值误拒误收适用
偏高增多:有问题也拒答减少合规、医疗等不能出错的场景
居中平衡平衡多数企业知识库
偏低减少增多:没依据也生成探索性检索、辅助人工判断
阈值算在哪个分数上要写进文档:向量分、融合分、重排分三者分布不同,业务代码与评测脚本必须用同一个口径,否则两处逻辑会打架。

易错点

  • 照搬外部经验值(如 0.8)到自家模型,误拒率飙升且被当成“知识库没内容”
  • 阈值算在向量分上而展示用的是重排分,改动一处后判定与展示不一致
  • 换 embedding 模型或改归一化方式后未重新定阈值,无答案判定整体失效
  • 只在有答案的问题上调阈值,没引入“无答案集”,参数被调成“有问必答”
  • 把阈值判断放在生成之后靠提示词兜底,模型已经看到低相关内容,幻觉照旧发生

数据来源与参考

  • Anthropic, Contextual Retrieval 技术说明(相似度过滤)
  • LlamaIndex 官方文档(SimilarityPostprocessor)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌