name: rag-hybrid-search description: 用于RAG管道的语义和关键词检索相结合的混合搜索。实现BM25 + 稠密向量搜索与融合策略。 allowed-tools: Read, Grep, Write, Edit, Bash, Glob, WebFetch
rag-hybrid-search
实现混合搜索,结合语义向量检索与基于关键词的BM25搜索,以提高RAG管道的准确性和召回率。
概述
混合搜索解决了纯语义或纯关键词搜索的局限性:
- 语义搜索擅长概念相似性,但可能错过精确匹配
- 关键词搜索能找到精确术语,但缺乏语义理解
- 混合搜索结合两者以获得卓越的检索性能
功能
搜索策略
- 稠密向量语义搜索(嵌入)
- 稀疏向量关键词搜索(BM25,TF-IDF)
- 具有可配置权重的混合融合
- 倒数排名融合(RRF)组合
检索配置
- 为稠密搜索配置嵌入模型
- 调整BM25参数(k1,b值)
- 设置检索限制和阈值
- 应用元数据过滤
排名与重排
- 跨搜索类型的分数归一化
- 加权分数融合
- 交叉编码器重排
- MMR(最大边际相关性)多样性
索引管理
- 创建和更新混合索引
- 带进度跟踪的批量索引
- 索引优化和维护
- 多索引联合
使用
使用LangChain的基本混合搜索
from langchain_community.retrievers import BM25Retriever
from langchain_community.vectorstores import Chroma
from langchain.retrievers import EnsembleRetriever
from langchain_openai import OpenAIEmbeddings
# 创建文档
docs = [...] # 您的文档块
# 稠密检索器(语义)
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(docs, embeddings)
dense_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
# 稀疏检索器(BM25)
bm25_retriever = BM25Retriever.from_documents(docs)
bm25_retriever.k = 5
# 混合集成
hybrid_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, dense_retriever],
weights=[0.4, 0.6] # 根据用例调整
)
# 查询
results = hybrid_retriever.invoke("如何配置系统?")
倒数排名融合
def reciprocal_rank_fusion(results_lists: list, k: int = 60) -> list:
"""
使用RRF组合多个排名列表。
k是用于平滑的常数(通常为60)。
"""
fused_scores = {}
for results in results_lists:
for rank, doc in enumerate(results):
doc_id = doc.metadata.get("id", str(doc.page_content[:50]))
if doc_id not in fused_scores:
fused_scores[doc_id] = {"doc": doc, "score": 0}
fused_scores[doc_id]["score"] += 1 / (k + rank + 1)
# 按融合分数排序
sorted_docs = sorted(
fused_scores.values(),
key=lambda x: x["score"],
reverse=True
)
return [item["doc"] for item in sorted_docs]
# 与多个检索器一起使用
semantic_results = dense_retriever.invoke(query)
keyword_results = bm25_retriever.invoke(query)
hybrid_results = reciprocal_rank_fusion([semantic_results, keyword_results])
Pinecone混合搜索
from pinecone import Pinecone
from pinecone_text.sparse import BM25Encoder
# 初始化Pinecone
pc = Pinecone(api_key="your-api-key")
index = pc.Index("hybrid-index")
# 准备稀疏编码器
bm25 = BM25Encoder()
bm25.fit(corpus) # 在您的文档语料库上拟合
def hybrid_query(query: str, alpha: float = 0.5, top_k: int = 10):
"""
使用混合搜索进行查询。
alpha: 稠密向量的权重(稀疏为1-alpha)
"""
# 获取稠密嵌入
dense_embedding = embeddings.embed_query(query)
# 获取稀疏嵌入
sparse_embedding = bm25.encode_queries([query])[0]
# 混合查询
results = index.query(
vector=dense_embedding,
sparse_vector=sparse_embedding,
top_k=top_k,
include_metadata=True
)
return results
Weaviate混合搜索
import weaviate
client = weaviate.Client("http://localhost:8080")
def weaviate_hybrid_search(query: str, alpha: float = 0.5, limit: int = 10):
"""
Weaviate原生混合搜索。
alpha: 0 = 纯BM25,1 = 纯向量
"""
result = (
client.query
.get("Document", ["content", "title", "metadata"])
.with_hybrid(
query=query,
alpha=alpha,
properties=["content", "title"]
)
.with_limit(limit)
.do()
)
return result["data"]["Get"]["Document"]
任务定义
const ragHybridSearchTask = defineTask({
name: 'rag-hybrid-search-setup',
description: '为RAG管道配置混合搜索',
inputs: {
vectorStore: { type: 'string', required: true }, // 'pinecone', 'weaviate', 'chroma', 等
embeddingModel: { type: 'string', default: 'text-embedding-3-small' },
bm25Params: { type: 'object', default: { k1: 1.5, b: 0.75 } },
fusionStrategy: { type: 'string', default: 'rrf' }, // 'rrf', 'weighted', 'custom'
denseWeight: { type: 'number', default: 0.6 },
topK: { type: 'number', default: 10 }
},
outputs: {
retrieverConfigured: { type: 'boolean' },
indexStats: { type: 'object' },
artifacts: { type: 'array' }
},
async run(inputs, taskCtx) {
return {
kind: 'skill',
title: `使用 ${inputs.vectorStore} 配置混合搜索`,
skill: {
name: 'rag-hybrid-search',
context: {
vectorStore: inputs.vectorStore,
embeddingModel: inputs.embeddingModel,
bm25Params: inputs.bm25Params,
fusionStrategy: inputs.fusionStrategy,
denseWeight: inputs.denseWeight,
topK: inputs.topK,
instructions: [
'验证向量存储连接和配置',
'设置稠密嵌入管道',
'配置BM25/稀疏编码',
'实现融合策略',
'使用示例查询测试检索质量',
'记录配置和调优参数'
]
}
},
io: {
inputJsonPath: `tasks/${taskCtx.effectId}/input.json`,
outputJsonPath: `tasks/${taskCtx.effectId}/result.json`
}
};
}
});
适用流程
- rag-pipeline-implementation
- advanced-rag-patterns
- knowledge-base-qa
- vector-database-setup
外部依赖
- 向量数据库(Pinecone,Weaviate,Chroma,Milvus,Qdrant)
- 嵌入提供者(OpenAI,Cohere,Hugging Face)
- BM25编码器(rank_bm25,pinecone-text)
参考资料
- Claude Context (Zilliz) - 混合搜索MCP
- MCP Local RAG - 具有混合搜索的本地优先RAG
- LangChain Anthropic MCP Server
- Pinecone Hybrid Search
- Weaviate Hybrid Search
相关技能
- SK-RAG-001 rag-chunking-strategy
- SK-RAG-004 rag-reranking
- SK-RAG-005 rag-query-transformation
- SK-VDB-001 至 SK-VDB-005(向量数据库集成)
相关代理
- AG-RAG-001 rag-pipeline-architect
- AG-RAG-003 vector-db-specialist
- AG-RAG-004 retrieval-optimizer