热门搜索:和平精英 原神 街篮2 

您的位置:首页 > > 教程攻略 > ai资讯 >RAG 中的混合搜索:使用组合技术增强信息检索

RAG 中的混合搜索:使用组合技术增强信息检索

来源:互联网 更新时间:2026-05-30 14:03

在RAG(检索器增强生成)系统中,混合搜索并不是什么花哨的新名词,它本质上是将两种截然不同的检索思路——传统的关键字匹配与基于语义的向量搜索——结合起来,以达到更高的准确率和召回率。说白了,就是既看关键词,又看语义,两边的好处都要占。

那么,混合搜索到底是怎么实现的?我们一步步拆开看。

关键部件

稀疏检索

稀疏检索就是我们最熟悉的“关键词匹配”那一套。它依赖TF-IDF、BM25这类算法,根据查询词在文档中间出现的频率和分布来打分。优点是简单直接,对于有明确术语的查询特别高效。在LangChain里要实现BM25检索,可以使用rank_bm25库。下面是一个集成示例:

pip install rank_bm25 langchain

from langchain import VectorstoreRetriever
from rank_bm25 import BM25Okapi
from langchain.document_loaders import SimpleDocumentLoader
from langchain.embeddings import BM25Embeddings

documents = [
    "The quick brown fox jumps over the lazy dog.",
    "Never jump over the lazy dog quickly.",
    "The quick red fox leaps over the lazy dog."
]

# 分词
tokenized_docs = [doc.split(" ") for doc in documents]

bm25 = BM25Okapi(tokenized_docs)

query = "quick fox"
tokenized_query = query.split(" ")
doc_scores = bm25.get_scores(tokenized_query)
top_n = 3
top_docs = bm25.get_top_n(tokenized_query, documents, n=top_n)

print("Top documents:", top_docs)

为了更方便地在LangChain中使用,可以把它封装成自定义检索器:

class BM25Retriever(VectorstoreRetriever):
    def __init__(self, documents):
        self.documents = documents
        tokenized_docs = [doc.split(" ") for doc in documents]
        self.bm25 = BM25Okapi(tokenized_docs)

    def get_relevant_documents(self, query):
        tokenized_query = query.split(" ")
        doc_scores = self.bm25.get_scores(tokenized_query)
        top_docs = self.bm25.get_top_n(tokenized_query, self.documents, n=3)
        return top_docs

retriever = BM25Retriever(documents)
query = "quick fox"
relevant_docs = retriever.get_relevant_documents(query)
print("Relevant documents:", relevant_docs)

密集检索

密集检索则是另一条路子——它把文本变成高维向量(嵌入),然后通过余弦相似度或欧几里得距离来比较查询和文档的语义接近程度。即使查询里没有出现文档中的任何一个词,只要能捕捉到语义上的关联,照样能把相关文档捞出来。这背后依赖BERT、Sentence Transformer等预训练模型。

混合搜索的工作原理

混合搜索的执行流程大致分四步:

  • 索引:

    文档同时建立稀疏索引(倒排索引)和密集索引(向量嵌入)。
  • 查询处理:

    查询既走关键字分词路线,也生成向量嵌入。
  • 检索:

    稀疏检索负责按关键词命中来拿结果,密集检索负责按向量相似度来找语义近似的文档。
  • 分数融合:

    这是混合搜索的核心。将两种检索的分数归一化后,用参数α进行加权组合:
    hybrid_score = (1−α)·sparse_score + α·dense_score
    α通常在0到1之间取值——α=1时就是纯向量搜索,α=0时就是纯关键字搜索。通过调节α,可以在关键词匹配和语义理解之间灵活平衡。

混合搜索的优点

  • 召回率和精确度双双提升:

    单靠关键词可能漏掉同义词表达的文档,单靠语义可能忽略精确术语的匹配。两者互补,能抓到更多真正相关的内容。
  • 处理同义词和上下文:

    密集检索让同义词不再成为检索障碍,文档即使没有出现查询词,也可能因为语义相关而被召回。
  • 效率与鲁棒性:

    稀疏检索速度快,可以快速过滤出候选集;密集检索则在这个候选集上做精细排序。两者配合,既保证了速度,又提高了对不同类型查询的适应能力。

在RAG中的实现

要落地一个混合检索的RAG系统,通常需要以下几个组成部分:

  • 向量数据库:

    FAISS、Milvus、Wea viate、Pinecone等,用来高效存储和搜索密集向量。
  • 预训练模型:

    BERT、RoBERTa或Sentence Transformer,用来生成文本的嵌入。
  • 检索技术:

    密集部分用向量相似度量,稀疏部分用BM25或TF-IDF(可通过scikit-learn、gensim或rank_bm25实现)。
  • RAG框架:

    LangChain等可以将上述组件整合到一起,形成完整的检索-生成流水线。

下面是一段完整的Python示例,展示如何结合BM25和LangChain做一次混合检索风格的测试(这里仅演示稀疏检索部分,密集检索需要额外使用向量存储):

#!pip install rank_bm25 langchain scikit-learn

from rank_bm25 import BM25Okapi
from langchain.vectorstores import SimpleVectorStore
from langchain.retrievers import VectorstoreRetriever

documents = [
    "向量数据库:FAISS、Milvus、Weviate或Pinecone等工具用于高效处理密集向量搜索。",
    "预训练模型:BERT、RoBERTa或Sentence Transformer等模型用于生成密集检索的嵌入。",
    "密集检索技术:利用嵌入和向量相似度量来查找语义相关的文档。",
    "稀疏检索技术:使用传统的关键字匹配和布尔运算符,根据精确的关键字匹配检索文档。",
    "RAG框架:如LangChain等框架可以将这些组件整合到一个有凝聚力的RAG系统中。",
]

tokenized_docs = [doc.split(" ") for doc in documents]
bm25 = BM25Okapi(tokenized_docs)

query = "混合搜索 RAG 优势"
tokenized_query = query.split(" ")
doc_scores = bm25.get_scores(tokenized_query)
top_n = 3
top_docs = bm25.get_top_n(tokenized_query, documents, n=top_n)

print("检索到的相关文档:")
for idx, doc in enumerate(top_docs):
    print(f"{idx + 1}. {doc}")

class BM25Retriever(VectorstoreRetriever):
    def __init__(self, documents):
        self.documents = documents
        tokenized_docs = [doc.split(" ") for doc in documents]
        self.bm25 = BM25Okapi(tokenized_docs)

    def get_relevant_documents(self, query):
        tokenized_query = query.split(" ")
        return self.bm25.get_top_n(tokenized_query, self.documents, n=3)

retriever = BM25Retriever(documents)
query = "混合搜索 RAG 优势"
relevant_docs = retriever.get_relevant_documents(query)

print("通过LangChain集成的BM25检索到的相关文档:")
for idx, doc in enumerate(relevant_docs):
    print(f"{idx + 1}. {doc}")

输出结果:

检索到的相关文档:
1. RAG框架:如LangChain等框架可以将这些组件整合到一个有凝聚力的RAG系统中。
2. 向量数据库:FAISS、Milvus、Weviate或Pinecone等工具用于高效处理密集向量搜索。
3. 稀疏检索技术:使用传统的关键字匹配和布尔运算符,根据精确的关键字匹配检索文档。

通过LangChain集成的BM25检索到的相关文档:
1. RAG框架:如LangChain等框架可以将这些组件整合到一个有凝聚力的RAG系统中。
2. 向量数据库:FAISS、Milvus、Weviate或Pinecone等工具用于高效处理密集向量搜索。
3. 稀疏检索技术:使用传统的关键字匹配和布尔运算符,根据精确的关键字匹配检索文档。

可以看到,通过混合稀疏与密集两种检索技术,RAG系统能大幅提升检索结果的质量和相关性,尤其在面对复杂、多变的查询时,这种组合策略几乎是不可或缺的。它让系统既保留了关键词匹配的精准度,又拥有了语义理解的灵活性——这才是现代信息检索中真正好用的“组合拳”。

AI自动绘画大师
AI自动绘画大师

类型:益智休闲

大小:5.72MB

语言:简体中文

平台:互联网

游戏下载

热门手游

手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc