什么是召回(Recall)

在 RAG、检索系统、搜索引擎这类场景中,召回(Recall) 是指从全量数据中找出所有与用户问题 "可能相关" 的候选结果的过程 ,它是检索流程的第一步 ,核心目标是 "不漏掉任何潜在相关的内容"

你可以把检索流程拆成两步:

  1. 召回 :大海捞针,把所有沾边的内容都捞出来(追求);
  2. 排序 :去粗取精,把捞出来的内容按相关性高低排好序(追求)。

一、召回的核心特点

  1. 目标是 "高召回率",而非 "高精度" 召回阶段不纠结 "这条内容到底有多相关",只判断 "是否可能相关",所以会返回一个数量较多的候选集。比如用户问 "Spark 宽依赖",召回阶段会把所有包含 "Spark""宽依赖""窄依赖""依赖关系" 的文档片段都找出来,哪怕有些片段只是提了一句 "宽依赖是 Spark 中的概念",也会被纳入候选集。

  2. 速度优先,算法简单 召回要处理全量数据(比如百万级向量),所以必须用高效的算法,常见的召回策略有:

    • 向量召回:基于向量相似度的近似检索(如 Milvus 的 HNSW、IVF 算法),这是 RAG 中最常用的方式;
    • 关键词召回:基于关键词匹配(如 Elasticsearch 的倒排索引);
    • 混合召回:向量 + 关键词结合,兼顾语义和字面匹配。

二、召回率(Recall Rate):衡量召回效果的核心指标

召回率是一个量化指标,公式很简单:

召回率=全量数据中的相关结果总数检索到的相关结果数​×100%

  • 理想情况:召回率 = 100% → 所有相关内容都被找出来了,没有遗漏;
  • 实际情况:召回率不可能 100%(比如数据有噪声、算法有局限),我们需要在 "召回率" 和 "效率" 之间做平衡。

举个例子:全量数据里有 10 条和 "Spark 宽依赖" 相关的文档片段,召回阶段找出了 8 条 → 召回率 = 8/10 = 80%。

三、召回与之前提到的 "粗排、精排" 的关系

你可以把整个检索流程串起来,理解三者的分工:

复制代码
用户提问 → 问题处理(向量化/关键词提取) → 召回(从全量数据捞候选集,比如 200 条) → 粗排(快速过滤,缩到 50 条) → 精排(精准排序,选 Top-5) → 传给大模型
阶段 核心任务 目标 数据量变化
召回 从全量数据捞潜在相关内容 不漏掉相关结果 全量 → 几百条候选集
粗排 对候选集快速筛选 初步去噪 几百条 → 几十条
精排 对筛选后的数据精准排序 选出最相关结果 几十条 → 几条最终结果

四、RAG 中召回的实操关键点

  1. 召回数量(Top-N)的设置

    • 召回数量不能太少(比如只召回 10 条):容易漏掉相关内容,降低召回率;
    • 召回数量不能太多(比如召回 1000 条):会增加后续粗排、精排的计算量,拖慢整体速度;
    • 经验值:海量数据场景下,召回数量设为 最终需要结果数的 20~50 倍(比如最终要 5 条,召回 100~250 条)。
  2. 召回策略的选择

    • 语义相关为主:用向量召回(比如 Milvus 的 HNSW 索引);
    • 字面关键词相关为主:用关键词召回(比如 Elasticsearch);
    • 兼顾语义和字面:用混合召回(比如 Milvus + Elasticsearch 联动)。

五、举个代码例子(Milvus 中的召回操作)

复制代码
from pymilvus import Collection
from langchain_openai import OpenAIEmbeddings

# 1. 加载 Milvus 集合(表)
collection = Collection("tech_docs")
collection.load()

# 2. 问题向量化
embeddings = OpenAIEmbeddings()
query_vector = embeddings.embed_query("Spark 宽依赖和窄依赖的区别")

# 3. 召回:用 HNSW 索引捞 200 条候选集(这一步就是召回)
search_params = {"metric_type": "COSINE", "params": {"nprobe": 10}}
results = collection.search(
    data=[query_vector],
    anns_field="embedding",
    param=search_params,
    limit=200,  # 召回数量 Top-200
    output_fields=["content", "source"]
)

# 4. 后续:把这 200 条传给粗排、精排处理

关键总结

  • 召回的本质 :从全量数据中 "海选" 潜在相关内容,追求 ,不追求
  • 召回率:衡量 "漏没漏相关内容" 的指标,越高越好,但要兼顾效率;
  • 和排序的关系:召回是排序的基础,先召回再排序,才是完整的检索流程。
相关推荐
小白跃升坊7 分钟前
DeepSeek 多模态 API 调用完全指南:从调用到效果,一篇讲透
ai·大语言模型
VIP_CQCRE12 分钟前
用 Ace Data Cloud 快速接入 MiniMax H3:把 AI 视频生成能力变成可调用的生产力
ai·aigc·api·视频生成·acedatacloud
赵大仁40 分钟前
AI 限流 UX 设计:排队、降级、告知与用户预期管理
前端·ai·限流·用户体验·产品设计
秋饼1 小时前
LangChain4j + Java 实现企业级 Text-to-SQL 智能问数系统:从自然语言到安全可控的数据洞察
java·ai·技术分享·后端开发
前沿在线1 小时前
WRC2026丨当机器开始理解人的意图,人机交互走向更多场景
人工智能·ai·大模型
CoderJia程序员甲1 小时前
GitHub 热榜项目 - 周榜(2026-08-22)
ai·大模型·llm·github·ai教程
俊哥V1 小时前
每日 AI 研究简报 · 2026-08-22
人工智能·ai
AI导出鸭PC端2 小时前
文心怎样生成word文档?一键智能排版,AI导出鸭解决格式错乱痛点
人工智能·ai·word·豆包·deepseek·ai导出鸭
liulilittle2 小时前
llmx 学习手册 06 —— CPU 指令集优化(AVX-512 三层演进)
c++·学习·算法·ai·llm
界面开发小八哥2 小时前
界面控件DevExpress XAF v26.1新版亮点——AI Agent Skills
ai·c#·跨平台·devexpress·ui开发·xaf