检索器增强生成(RAG)中的混合搜索结合了不同的搜索技术,以提高从数据库或知识库中检索信息的准确性和效率。通常,混合搜索方法利用传统的基于关键字的搜索(稀疏检索)和语义搜索(密集检索),以充分利用这两种方法的优势。以下是对 RAG 中混合搜索的详细介绍。
关键部件
稀疏检索:稀疏检索通过关键字匹配进行,利用TF-IDF、BM25等技术,根据确切的关键字匹配搜索文档。对于已知确切术语的精确查询,这种方法既快速又有效。
在LangChain中实现BM25检索,你可以使用rank_bm25
库来进行BM25算法的实现。以下是一个简要的示例,展示了如何将BM25检索与LangChain集成。
首先,你需要安装rank_bm25
和langchain
库:
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
假设你有一组文档,你可以将它们加载到LangChain中:
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."``]`` ``# 分词(tokenize)文档``tokenized_docs = [doc.split(" ") for doc in documents]
初始化BM25模型:
bm25 = BM25Okapi(tokenized_docs)``
使用BM25模型进行查询检索:
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)
为了将BM25检索与LangChain集成,可以创建一个自定义的检索器(Retriever):
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`` ``# 使用自定义的BM25检索器``retriever = BM25Retriever(documents)`` ``query = "quick fox"``relevant_docs = retriever.get_relevant_documents(query)``print("Relevant documents:", relevant_docs)
**密集检索:**密集检索利用嵌入(向量表示)来理解查询和文档的上下文和含义,这使得即使查询中不存在确切的关键字,也能检索到相关信息。向量相似度则通过余弦相似度或欧几里得距离等指标来衡量查询和文档向量之间的相似性。
混合搜索的工作原理
索引:文档使用稀疏和密集方法进行索引。稀疏索引涉及传统的倒排索引,而密集索引则通过BERT或句子转换器等模型为文档创建嵌入。
查询处理:查询同时使用基于关键字的技术处理,并转换为用于语义搜索的嵌入。
检索:稀疏检索通过执行基于关键字的搜索,检索与查询词匹配的文档;而密集检索则搜索嵌入与查询嵌入相似的文档,捕获语义含义。
分数融合:结合稀疏和密集结果**混合搜索的关键步骤是将稀疏和密集检索结果融合。通过将两种方法的分数归一化并结合,使用参数alpha(α)加权,决定各算法的权重并影响结果的重新排名。混合评分公式为:hybrid_score = (1−α)⋅sparse_score + α⋅dense_score。
α的取值通常介于0和1之间:
-
α = 1:纯向量搜索
-
α = 0:纯关键字搜索
这种加权组合确保同时考虑关键字相关性和语义上下文,提供一组平衡且全面的结果。
混合搜索的优点
提高召回率和精确度:通过将关键字匹配与语义理解相结合,混合搜索增加了检索到相关文档的可能性,单独使用这两种方法可能会遗漏这些文档。
处理同义词和上下文:密集检索有助于理解同义词和上下文,确保相关文档不会因词汇不匹配而被忽视。
效率:稀疏检索通常更快,可以快速缩小文档集的范围,而密集检索则可以优化此集以确保语义相关性。
鲁棒性:混合搜索对不同类型的查询更具鲁棒性,无论它们是精确的基于关键字的查询,还是更抽象且依赖于上下文的查询。
在RAG中的实现
向量数据库: FAISS、Milvus、Weviate或Pinecone等工具用于高效处理密集向量搜索。
预训练模型: BERT、RoBERTa或Sentence Transformer等模型用于生成密集检索的嵌入。
搜索技术:
-
密集检索技术: 利用嵌入和向量相似度量来查找语义相关的文档。这通常是通过预训练模型将文本转换为高维向量来实现。
-
稀疏检索技术: 使用传统的关键字匹配和布尔运算符,根据精确的关键字匹配检索文档。可通过TF-IDF或BM25等方法实现,这些方法可以使用scikit-learn、gensim或rank_bm25库等工具。
RAG框架: 如LangChain等框架可以将这些组件整合到一个有凝聚力的RAG系统中。
#!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系统中。",``]`` ``# 分词(tokenize)文档``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)`` ``# 使用自定义的BM25检索器``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系统中的混合搜索可以显著提高检索信息的质量和相关性,使其成为处理复杂信息检索任务的强大工具。
这种组合不仅提升了召回率和精确度,还确保了系统的鲁棒性和效率,从而有效应对各种类型的查询。实施混合搜索可以提升RAG系统的性能,使其在不断发展的信息检索环境中成为不可或缺的工具。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。