当前位置:首页 > 文章列表 > 科技周边 > 人工智能 > 向量检索结果如何做可解释验收:相似度阈值、引用片段与空召回处理

向量检索结果如何做可解释验收:相似度阈值、引用片段与空召回处理

来源:17golang原创 2026-08-28 11:55:27 0浏览 收藏

向量检索最容易制造一种错觉:结果带着相似度分数,似乎就已经足够可信。实际接入 RAG 后,真正需要验收的是一条可追溯链——查询拿到了哪些片段、每个片段来自哪个来源、分数是否跨过业务阈值,以及低分或空结果时系统是否会停下来说明“没有足够证据”。

实践要点:
  • 把相似度分数当作筛选信号,不把它直接当成答案正确率。
  • 检索结果至少保留 source_id、片段文本和分数,回答才能回链。
  • 阈值要在标注样本上验收,0.78 只能作为本地实验起点。
  • 低分与空召回进入明确的降级分支,不要硬拼上下文。

先把“命中了什么”记录下来

Qdrant 的搜索接口会返回点的标识、payload 和 score,过滤条件也可以和向量查询一起使用。OpenAI 的知识检索方案同样把引用和评估放在可靠回答的工程链路里。对应用来说,最小可验收结果不是一段字符串,而是一个包含来源、片段和分数的记录。

下面用 Python 做一个与具体 SDK 解耦的收口函数。真实项目可以把 `query_points` 替换成向量数据库客户端调用,但不要丢掉这三个字段:`source_id` 用于回链,`score` 用于阈值判断,`引用片段` 用于人工核对。

向量检索从 query_points 返回 score 和 source_id,再形成带引用片段的证据链
检索验收的重点是把 query_points 的返回值整理成可以回链的证据记录。

初始化一组能复查的检索结果

先准备两条模拟结果:它们来自不同的 `source_id`,并且都保留原始片段。这里不调用模型,目的是先把检索层的验收逻辑固定下来。

from dataclasses import dataclass

@dataclass
class Hit:
    source_id: str
    score: float
    引用片段: str

def query_points() -> list[Hit]:
    return [
        Hit("manual-17", 0.86, "重建索引前先确认 collection 的向量维度"),
        Hit("runbook-03", 0.74, "空召回时返回澄清问题,不拼接无关片段"),
    ]

示例里的 `query_points` 是本地实验函数,不是某个数据库的默认实现;它只模拟“查询点并得到命中列表”。`source_id` 和 `引用片段` 必须来自真实入库记录,不能由生成模型补写。

用 score_threshold 筛掉不够近的片段

阈值不是越高越好。阈值过低会把主题相邻但不能回答问题的文本塞进上下文,过高则容易得到空结果。先把阈值写成显式参数,任何一次验收都能复现。

def retrieve(query: str, score_threshold: float = 0.78) -> list[Hit]:
    hits = query_points()
    accepted = [hit for hit in hits if hit.score >= score_threshold]
    return accepted

hits = retrieve("如何确认向量维度")
for hit in hits:
    print(hit.source_id, hit.score, hit.引用片段)

运行后应只保留 `manual-17` 的 0.86 结果,`runbook-03` 的 0.74 被阈值挡住。这个判断只能说明“分数达到当前筛选线”,不能推出“回答必然正确”;还要检查片段是否真的覆盖问题中的实体和条件。

把引用片段绑定到回答输入

检索通过后,再把证据格式化成模型能看懂、用户也能回查的上下文。格式化函数只接收已验收的 `Hit`,避免把原始未过滤结果混进提示词。

def build_context(hits: list[Hit]) -> str:
    return "\n".join(
        f"[{hit.source_id}] {hit.引用片段}(score={hit.score:.2f})"
        for hit in hits
    )

context = build_context(hits)
print(context)

回答生成后仍应把 `source_id` 传到展示层,至少允许用户点开或检索原文。不要只显示“参考资料 1、2”,那样人工复查时还要重新猜它对应哪条文档。

低分和空召回走独立分支

真正容易出错的是没有可靠片段时仍然让模型自由作答。把空结果处理成一种业务状态,既可以返回澄清问题,也可以转人工或请求用户补充关键词。

def answer_route(query: str) -> dict:
    hits = retrieve(query, score_threshold=0.78)
    if not hits:
        return {
            "status": "needs_clarification",
            "message": "没有找到达到阈值的引用片段",
            "citations": [],
        }
    return {
        "status": "grounded",
        "message": build_context(hits),
        "citations": [hit.source_id for hit in hits],
    }

这里的 `needs_clarification` 不是失败吞掉,而是可观察的结果状态。日志中应同时记录查询文本的脱敏版本、阈值、命中数和返回的 `source_id`。如果调用的是 Qdrant,还应把实际过滤条件与 collection 名称纳入链路日志,方便区分“没有相似内容”和“过滤条件把结果排空”。

向量检索低于 score_threshold 后进入 needs_clarification,不把空结果硬拼给模型
低分命中与真正空召回都应进入可观察的 needs_clarification 状态。

用小样本校准阈值,不要照抄示例数字

准备一组真实问题和人工标注的相关片段,分别记录不同阈值下的命中、误召回和空结果数量。先看业务更怕哪一种错误:客服知识库可能更怕把无关条款带进回答,内部搜索则可能更愿意接受稍低分的候选。

  • 把查询、文档 ID 和相关性标注固定下来,避免每次换样本。
  • 分别测试 0.70、0.78、0.85 等候选线,记录命中率与空召回率。
  • 观察不同主题、不同文档长度的分数分布,不要把单一问题的最高分当默认线。
  • 上线后持续抽查引用片段,发现分数高但答非所问时,回到切片和嵌入模型排查。

阈值只负责第一道筛选。对高风险回答,还可以增加关键词覆盖、文档时效、权限过滤和二次重排,但每增加一个条件,都要能在日志里解释为什么这条片段被接受或排除。

常见问题与边界

score 越高就代表答案越正确吗?

不代表。score 是向量空间中的相似度信号,仍需核对片段是否覆盖问题、来源是否有权限、内容是否过期。

空召回时可以把阈值调低再问一次吗?

可以作为明确的降级策略,但要记录第二次阈值并限制次数。不能静默降低标准后把无关片段当证据。

为什么一定要保存 source_id?

它把生成回答和原始资料连起来,便于用户复查、审计和定位错误。没有来源标识,分数再高也难以解释。

清理实验并保留验收结论

完成实验后删除临时样本,保留阈值、标注集版本、命中日志和几条人工复查记录。一个合格的向量检索链不是“总能返回结果”,而是能明确区分 grounded、低分和 needs_clarification,并让每个 grounded 片段回到真实来源。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go net/http HTTP2Config 怎么控制 HTTP/2:协议启用、并发流与兼容验证Go net/http HTTP2Config 怎么控制 HTTP/2:协议启用、并发流与兼容验证
上一篇
Go net/http HTTP2Config 怎么控制 HTTP/2:协议启用、并发流与兼容验证
Go http.ResponseController 如何设置请求读写截止时间:连接级超时与错误处理
下一篇
Go http.ResponseController 如何设置请求读写截止时间:连接级超时与错误处理
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    5369次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    4877次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    4826次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    5072次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    5032次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码