
大模型之深入了解Retrievers解析器 原创
前言
在上一章【大模型之深入探索RAG流程】中,我们对RAG流程中 文档读取(LOAD)
-> 文档切分(SPLIT)
-> 向量化(EMBED)
-> 存储(STORE)
进行了深入了解,本章将接着深入了解 解析(Retrieval)
的使用
解析器简介
简介:在 RAG(Retrieval-Augmented Generation)流程中,Retrieval(检索)是关键环节,其主要目标是从大量文档或知识库中提取与用户查询相关的信息。
目的:
- 信息获取:根据用户的查询,从外部知识库中获取相关文档或片段,以增强生成模型的上下文信息。
- 提高准确性:通过提供具体的、相关的信息,帮助生成模型(如语言模型)产生更准确和上下文相关的回答。
流程
- 用户查询:用户输入一个查询或问题。
- 检索器:使用检索算法(如 BM25、TF-IDF 或基于嵌入的检索)搜索知识库,找到与查询最相关的文档。
- 文档评分:对检索到的文档进行评分,通常依据相关性得分来排序。
- 返回结果:将最相关的文档或片段返回给生成模型。
解析器的基础使用
创建知识库
第一步:启动Chroma数据库
第二步:使用RAG基础流程:Load->Split->EMBED->STORE创建一个知识库
说明:
- 向量化说明:由于Qwen和百度千帆的向量接口限制较多,对于向量化西游记这本书来说,经常会遇到超出限制等问题,所以此处我将向量化接口换为HuggingFaceEmbeddings(),该接口可能会存在被Ban的风险,请自行更换向量化接口。
- 测试文档:西游记下载地址请见夸克网盘:西游记
创建解析器
第三步:创建一个解析器
创建chain链
创建chain链有两种方法:一种是管道符连接,一种是使用 create_retrieval_chain 。本章我们两种方法都做尝试,以便对比代码的写法。
方式一:传统的管道符构建chain
运行结果:
方式二:使用create_retrieval_chain构建
说明:
- 上述的prompt可以在smith.langchain.com上查询
langchain-ai/retrieval-qa-chat
得到。
运行结果:
通过对比,可以看到使用 create_retrieval_chain
创建chain时,可以减少format_docs()步骤以及使用管道符部分的代码量,简化调用步骤。
以上调用即为完整的解析器使用流程,其中第三步中 retriever = chroma_db.as_retriever()
可以有多种方式构建解析器。本章内容,我们着重对此深入研究。
解析器的不同类型
除了上面基础的向量存储检索器之外,Langchain 还提供了多种高级检索类型,包括多查询检索器(MultiQueryRetriever)、结合检索器(EnsembleRetriever)等。
多查询检索器 MultiQueryRetriever
简介: MultiQueryRetriever
是一种检索算法,它通过使用大型语言模型(LLM)生成多个查询,从而自动化提示调优过程。
功能: 它为给定的用户输入查询生成多个不同视角的查询。对于每个查询,它检索一组相关文档,并通过所有查询的唯一联合来获得更大的一组潜在相关文档。这种方法提高了检索的准确性和多样性。
使用场景: 当用户的问题复杂并且需要多条不同的信息来回答时,MultiQueryRetriever
特别有用。它可以在需要关于多个主题的信息时提供更全面的结果
使用方法: 第一步:构建知识库(此处复用上面的知识库,详细内容不再赘述)
第二步:使用MultiQueryRetriever
运行结果:
第三步:使用 create_retrieval_chain 进行完整查询
运行结果:
通过以上实践,可以看到:
1、MultiQueryRetriever会借助大模型生成新的多个查询 queries;
2、MultiQueryRetriever会通过这些 queries 检索出相关的文档;
3、最后,通过 combine_docs_chain 将检索出的文档交给大模型得到最终答案。
结合检索器 EnsembleRetriever
简介: EnsembleRetriever是一种结合多个检索器结果的算法,通过重新排序来提高检索效果。
功能: 该算法从多个检索器中获取文档,并将它们组合在一起,以提高文本相似性匹配和信息检索的准确性。通过结合多种补充的向量搜索算法,EnsembleRetriever提供了最先进的文本相似性匹配和信息检索能力。
使用场景: 当需要结合多种检索方法以获得更高的检索准确性时,EnsembleRetriever是理想的选择。这种方法适用于需要从大量文档集合中进行信息检索的应用场景
使用方法 第一步:安装依赖包
第二步:准备知识数据
第三步:创建组合检索器
第四步:进行查询
运行结果:
说明:
- BM25Retriever 是一种基于经典信息检索模型 BM25 的检索器。它的优点:
简单易用,适合处理短文本和关键词检索。
对于传统的文本匹配任务表现良好。
- FAISS(Facebook AI Similarity Search)是一个高效的相似性搜索库,专门用于处理大规模向量数据。它的优点:
- 适合处理复杂的语义检索任务,尤其是在向量空间中。
- 能够处理大规模数据集,检索速度快。
- 将 BM25Retriever 和 FAISS 组合在一起:
- 互补性:BM25 更适合处理基于关键词的检索,能够有效地从文本中找到相关文档;FAISS 则擅长处理语义相似性,通过向量化表示捕捉文本的深层含义。
- 提高检索:通过组合两种方法,可以充分利用 BM25 的词频特性和 FAISS 的向量相似性,从而提高整体检索的准确性和全面性。
长上下文重排序 LongContextReorder
简介: LongContextReorder是一种用于处理长上下文信息的技术,旨在提高模型在长文本中的信息提取和理解能力。它通过重新排序文档,以使最相关的信息更易于被模型捕捉。
功能: 信息重排序: LongContextReorder从多个检索器中获取文档,并对它们进行重新排序,使得最相关的文档位于上下文窗口的开头和结尾。这有助于模型更好地关注整个上下文中的关键内容。 上下文优化: 通过优化上下文的排列,模型能够更有效地利用长文本中的信息,从而提高回答的准确性和相关性。
使用场景: 这种技术特别适合需要在长文本中提取关键信息的应用场景,比如法律文书分析、学术论文阅读和长篇故事理解等。
使用方法:
第一步:启动 Chroma 数据库
说明:
- 此处是避免与前面的代码产生数据污染,所以最好关闭之前的chroma数据库,重新启动一个新的。
第二步:准备数据
第三步:创建Retriever并查询相关信息
运行结果:
第四步:使用LongContextReorder进行重排序
运行结果:
对比上面的结果,可以看到,通过使用 LongContextReorder,可以将文档重新排序,将与西游相关的信息排在前面,有助于提高模型的理解能力。
ElasticSearchBM25Retriever
简介: ElasticSearchBM25Retriever使用BM25算法,这是信息检索中的一种经典方法,广泛应用于ElasticSearch等搜索引擎中。
功能: BM25是一种基于概率模型的检索算法,能够根据文档和查询之间的词频和逆文档频率,计算文档的相关性得分。
使用场景: ElasticSearchBM25Retriever适用于需要高效文本搜索的场景,尤其是在需要处理大量非结构化文本数据时。它在搜索引擎优化和文本挖掘中非常有用。
使用方法:
第一步:安装必要的库
第二步:安装Elasticsearch并启动服务
- 1. 启动Elasticsearch的Docker容器,确保 Elasticsearch 服务正在运行。
- 2. 在浏览器中访问 http://localhost:9200 可以得到如下内容。
说明:Elasticsearch 的安装方法较长,由于不是本章的主线内容,所以我将这方面内容放在附录部分。
第三步:准备数据并创建索引
运行结果:
说明: http://elastic:mytest@localhost:9200
中:
-
elastic
是用户名 -
mytest
是密码
第四步:使用 retriever
进行查询
运行结果:
附录
ElasticSearch的Docker安装教程
由于在系统环境中安装ElasticSearch非常繁琐,需要安装(JDK等)基础环境,所以我们使用Docker来安装ElasticSearch。
安装Docker
Docker的安装教程比较多且详细,所以本文不再赘述,详情请查看: 10分钟学会Docker的安装和使用
创建网络
运行结果:
拉取镜像
运行结果:
创建挂载点目录
运行结果:
启动容器
命令行中输入命令启动Docker容器
运行结果:
使用 docker ps
可以看到Docker容器已经启动。
修改elasticsearch的密码
第一步:进入es容器
第二步:命令行输入重置密码命令
根据提示重置密码,例如:mytest
第三步:使用浏览器访问http://localhost:9200/ 使用用户名 elastic
和重置的密码 mytest
,验证可以登录。
内容小结
- RAG系统在进行Load->Split->Embedding->Store->Query流程时,需要使用
Retriever
进行文档检索。 - Retriever进行文档检索时,有两种方法构建Chain链:一种是传统的管道符构建,另一种是使用
create_retrieval_chain
。 - 使用Retriever时,除了基础的向量存储检索器之外,还可以使用多查询检索器(
MultiQueryRetriever
)、结合检索器(EnsembleRetriever
)等。 -
MultiQueryRetriever
是一种检索算法,它通过使用大型语言模型(LLM)生成多个查询,从而自动化提示调优过程。 -
MultiQueryRetriever
的工作流程如下:
1.MultiQueryRetriever
会借助大模型生成新的多个查询 queries;
2.MultiQueryRetriever
会通过这些 queries
检索出相关的文档;
3.最后,通过 combine_docs_chain
将检索出的文档交给大模型得到最终答案。
-
EnsembleRetriever
是一种结合多个检索器结果的算法,通过重新排序来提高检索效果。 BM25Retriever
是一种基于经典信息检索模型 BM25 的检索器。FAISS(Facebook AI Similarity Search)
是一个高效的相似性搜索库,专门用于处理大规模向量数据。EnsembleRetriever
可以将BM25Retriever
和FAISS
组合使用,从而提高整体检索的准确性和全面性。LongContextReorder
是一种用于处理长上下文信息的技术,旨在提高模型在长文本中的信息提取和理解能力。ElasticSearchBM25Retriever
可以与开源搜索引擎ElasticSearch
进行交互,以实现向量搜索。
本文转载自公众号一起AI技术 作者:热情的Dongming
