RAG混合搜索 rag-hybrid-search

RAG混合搜索技能专注于实现和优化检索增强生成(RAG)系统中的混合检索技术。它结合了语义向量搜索(如稠密嵌入)和关键词搜索(如BM25),通过加权融合、倒数排名融合(RRF)等策略,显著提升信息检索的准确性和召回率。该技能涵盖向量数据库集成(Pinecone、Weaviate、Chroma等)、嵌入模型配置、BM25参数调优、索引管理以及跨编码器重排等核心功能,是构建高性能RAG管道、知识库问答系统和高级检索模式的关键技术。关键词:RAG,混合搜索,语义检索,BM25,向量数据库,倒数排名融合,检索增强生成,AI检索优化。

RAG应用 0 次安装 0 次浏览 更新于 2/23/2026

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)

参考资料

相关技能

  • 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