如何使用混合搜索构建 Agentic RAG
I’m ready to translate the article for you, but I’ll need the text you’d like translated. Could you please paste the content you want converted to Simplified Chinese? (The source line you provided will stay unchanged.)
检索增强生成(RAG)与混合搜索
RAG,亦称 Hybrid Search,是一种强大的技术,可从语料库中检索相关文档,并将这些片段输入大型语言模型(LLM)以回答用户查询。
传统 RAG 的工作方式
- 使用 向量相似度 来定位语义相似的文档片段。
- 将最相关的片段传递给 LLM,生成响应。
该方法在许多情况下表现良好,因为语义相似度能够捕捉细微的含义。
向量相似度的局限
- 用户提供 特定关键词、ID 或精确短语,必须逐字匹配。
- 纯语义搜索可能会遗漏这些精确匹配,导致答案不完整或不准确。
引入关键词(混合)搜索
混合搜索结合了:
- 关键词搜索(精确匹配)
- 向量相似度(语义匹配)
通过同时利用这两种方法,即使在需要精确术语的情况下,也能检索到最相关的片段。
您将学习的内容
- 为什么 在关键词密集的场景下混合搜索能提升 RAG 性能。
- 如何 实现一个 agentic RAG 系统,动态在关键词检索和向量检索之间做决定。
- 实践步骤 与代码片段,构建混合管道。
可视化概览

信息图概括本文的主要内容。图片来源:Gemini.
为什么使用混合搜索?
向量相似度是从语料库中检索相关片段的强大工具,即使输入提示中包含拼写错误或同义词(例如,用 lift 代替 elevator)。然而,它也有显著的局限性:
- 关键词敏感度:向量模型不会对单个词或标识符赋予特殊权重。因此,关键词或 ID 可能会被其他语义相关的词“淹没”,导致纯语义搜索难以呈现最相关的文档。
- 精确匹配:当用户查询包含特定术语——如产品代码、序列号或唯一名称时,仅靠向量相似度往往无法优先返回匹配的文档。
关键词搜索的优势
传统的基于关键词的方法(例如 BM25)在以下方面表现出色:
- 精确词项匹配:如果某个词只出现在一篇文档中,当查询中出现该词时,该文档会获得很高的相关性得分。
- 标识符检索:唯一的 ID 或代码会被直接匹配,确保正确的文档被检出。
混合方法的好处
将向量相似度与关键词搜索相结合,可让你兼得两者优势:
- 更广的覆盖面 – 语义相似度能够捕捉到即使是改写或拼写错误的相关内容。
- 精确检索 – 关键词得分确保不会遗漏精确的词项和标识符。
- 更高的相关性 – 混合得分平衡两种信号,提供既符合上下文又精确匹配用户意图的结果。
结论:当你需要同时处理模糊的语义查询 以及 精确的关键词或标识符查找时,使用混合搜索可以为各种用户输入提供更准确、更有用的结果。
Source: …
如何实现混合搜索
混合搜索将 语义(向量)相似度 与 关键词(BM25)相似度 结合,以提升检索质量。下面是一份简明的分步指南,帮助你构建自己的混合搜索系统。
1. 设置向量检索(语义搜索)
- 将文档编码 为密集向量,使用语言模型(例如 OpenAI embeddings、Sentence‑Transformers 等)。
- 将向量存储 在向量数据库中(如 Pinecone、Weaviate、Milvus 或 TurboPuffer)。
- 查询:将用户查询转换为向量,并使用余弦相似度或内积检索相似度最高的前 k 个文档。
向量索引的细节超出本指南范围;任何标准的向量搜索管道都可使用。
2. 添加关键词检索(BM25)
- 使用 BM25 实现 对同一语料库建立索引(如 Elasticsearch、Apache Lucene、Whoosh,或
rank_bm25Python 库)。 - 查询:对原始文本查询在 BM25 索引上运行,以获取每篇文档的相关性得分。
BM25 被优先推荐,因为它在 TF‑IDF 基础上加入了更稳健的评分公式。如果有充分理由,也可以替换为其他关键词搜索算法。
3. 合并两种得分
混合得分通常是语义得分和关键词得分的加权和:
[ \text{HybridScore}(d) = \alpha \times \text{SemanticScore}(d) + (1-\alpha) \times \text{KeywordScore}(d) ]
| 参数 | 描述 | 常见取值范围 |
|---|---|---|
| α(alpha) | 语义相似度组件的权重 | 0.0 – 1.0(例如 0.6) |
| SemanticScore | 查询向量与文档向量之间的余弦相似度(或内积) | 0 – 1 |
| KeywordScore | BM25 相关性得分(通常已归一化) | 0 – 1 |
选择 α 的技巧
- 领域特定任务(如法律或医学)通常需要更高的关键词权重,因为精确词项匹配至关重要。
- 开放式或对话式查询 通常倾向于更高的语义权重。
- 动态加权:如果你有基于 LLM 的代理,让它根据查询意图实时决定 α(例如 “查找精确短语” → 降低 α)。
4. (可选)使用现成库
如果不想从零构建,已有多个库提供混合搜索工具:
| 库 | 向量存储 | 关键词搜索 | 备注 |
|---|---|---|---|
| TurboPuffer | 内置向量存储 | KeyboardSearch 包(BM25) | 简单 API,支持两种模态的组合 |
| Haystack | 多种后端(FAISS、Milvus 等) | Elasticsearch、OpenSearch | 开箱即用的 HybridRetriever |
| Vespa | 原生向量与 BM25 支持 | — | 可扩展至数十亿文档 |
即使使用库,也建议了解底层原理——自行实现管道有助于微调权重、归一化方式和排序逻辑。
5. 评估与迭代
- 创建测试集,包括查询及已知的相关文档。
- 运行混合管道,计算 Recall@k、NDCG、MRR 等指标。
- 调整 α(或尝试非线性组合),直至在精确率与召回率之间达到期望的平衡。
Summary
- 语义搜索 为您提供上下文相关性;BM25 确保精确的词项匹配。
- 独立实现两者后,使用可配置的权重 (α) 合并它们的得分。
- 您可以 手动构建管道,也可以利用现有工具,如 TurboPuffer、Haystack 或 Vespa。
- 正确的 评估 是找到针对特定使用场景的最佳平衡的关键。
混合搜索并不复杂,一旦两部分就位,您会在检索质量上看到显著提升,而所需的额外工程工作相对较少。祝搜索愉快!
Source: …
Agentic Hybrid Search
实现混合搜索是立即提升检索增强生成(RAG)系统性能的绝佳方式。然而,如果你真的想 最大化 混合搜索 RAG 流水线的收益,应该让它 具备代理性(agentic)。
“代理性” 的含义
典型的 RAG 流程如下:
- 检索相关的文档片段(向量或关键词搜索)。
- 将这些片段输入 LLM。
- 让 LLM 生成答案。
在 具备代理性的 RAG 系统 中,检索步骤被作为 工具 暴露,LLM 可以根据需要调用它。因为检索由 LLM 控制,它可以做出若干重要决策,从而提升答案质量。
为什么代理式方法如此强大
| 能力 | 代理的帮助方式 | 为什么重要 |
|---|---|---|
| 检索前的提示重写 | LLM 可以在将查询发送到向量库之前重写用户查询。 | 查询重写是获取更相关嵌入的成熟技术。 |
| 迭代获取 | LLM 可以先进行一次搜索,检查结果后决定是否请求更多片段。 | 让模型在回答前确认已有足够上下文,降低幻觉。 |
| 动态加权混合组件 | LLM 根据每个查询决定关键词匹配与向量相似度的权重。 | 若用户包含精确关键词,模型可提升关键词搜索权重;否则可更依赖语义相似度。 |
如何将检索做成工具
# Pseudo‑code for an LLM‑driven retrieval tool
def hybrid_search_tool(query: str,
weight_keyword: float = 0.5,
weight_vector: float = 0.5,
top_k: int = 5) -> List[Document]:
"""
• `query` – the (possibly rewritten) search string.
• `weight_keyword` / `weight_vector` – dynamic blend of BM25 and embedding scores.
• `top_k` – number of chunks to return.
Returns a list of the most relevant document chunks.
"""
# 1️⃣ Keyword search (e.g., BM25)
kw_results = bm25_search(query, k=top_k)
# 2️⃣ Vector search (e.g., FAISS / HNSW)
vec_results = embedding_search(query, k=top_k)
# 3️⃣ Combine scores using the supplied weights
combined = blend_results(kw_results, vec_results,
w_kw=weight_keyword, w_vec=weight_vector)
return combined[:top_k]LLM 可以反复调用 hybrid_search_tool,每次调整 query、weight_keyword、weight_vector 和 top_k。
为什么现在可行
前沿 LLM(如 GPT‑4‑Turbo、Claude‑3、Gemini‑1.5)已经足够成熟,能够:
- 判断查询是关键词密集型还是概念密集型。
- 重写提示 以提取最有用的嵌入。
- 推理检索上下文是否足够,并决定是否需要更多信息。
几个月前,赋予 LLM 这种自主权仍然风险较大。如今,模型已足够可靠,这种动态、工具驱动的方式不仅可行,而且值得推荐。
结论
- 实现混合搜索(关键词 + 向量)。
- 将检索暴露为可调用工具,供 LLM 使用。
- 让 LLM 决定
- 如何表述搜索查询,
- 获取多少以及哪些片段,
- 如何在关键词与语义相似度之间加权。
通过将混合检索与具备代理性的 LLM 结合,你可以为 RAG 系统注入强大动力,取得远超静态、仅向量管线的效果。
结论
在本文中,我讨论了如何在您的 RAG 系统中实现混合搜索,以及如何使您的 RAG 流程更真实,以获得显著更好的结果。将这两种技术结合起来可以显著提升信息检索堆栈的性能,并且可以通过像 Claude Code 这样的编码代理轻松实现。我相信 Agentex Systems 代表了信息检索的未来,我鼓励您为您的代理配备混合搜索能力,让它们为您承担繁重的工作。
📚 资源
免费电子书 & 网络研讨会
在社交平台上找到我