(17-6-01)检索增强生成(RAG):LangChain中的检索器+基于向量存储的检索器

马上假期,XDM,Happy起来!!

5.6  检索器(Retrievers)

在LangChain中,检索器(Retrievers)是一种接口,能够根据非结构化查询返回相关的文档。和前面介绍的向量存储(Vector Store)相比,检索器更为通用,具体说明如下所示。

  1. 向量存储专注于存储文本的嵌入向量,并提供基于这些向量的相似性搜索功能。它是一种特定的数据存储和检索机制,通常用于处理和检索高维向量数据,这些数据通常是由文本嵌入模型生成的。
  2. 检索器是一种更高层次的抽象,它定义了一个接口,用于根据非结构化查询返回相关文档。检索器不一定要存储文档,它只需要能够检索并返回它们。这意味着检索器可以在多种不同类型的存储和索引机制之上工作,包括但不限于向量存储。

5.6.1  LangChain中的检索器

在LangChain中,检索器(Retriever)的通用性主要体现在以下几个方面。

  1. 多种实现方式:检索器可以通过多种方式实现,包括基于向量的相似性搜索、基于文档元数据的过滤、基于内容的全文搜索等。
  2. 灵活性:检索器可以灵活地与不同的数据源和索引机制结合使用,例如可以与向量存储、关系数据库、Elasticsearch等集成。
  3. 扩展性:检索器可以扩展以支持更复杂的检索需求,如多查询检索器(Multi-Query Retriever)和集成检索器(Ensemble),这些检索器可以结合多个数据源或检索策略来提供更准确的结果。
  4. 与LLM的集成:某些检索器类型,如Self Query和Contextual Compression,可以与语言模型(LLM)结合使用,以提供更智能和上下文相关的检索结果。

检索器为构建复杂的信息检索和自然语言处理应用提供了强大的工具,在LangChain中提供了多种检索器类型,具体如表5-1所示。

表5-1  LangChain中的检索器类型

名称

索引类型

是否使用LLM

何时使用

描述

Vectorstore

Vector store

刚开始并且正在寻找一些快速且简单的信息时

这是最简单的方法,也是最容易入门的方法,会涉及为每个文本创建嵌入。

ParentDocument

Vector store + 文档存储

页面具有许多较小的不同信息块,最好通过自身索引,但最好一次检索所有信息。

涉及为每个文档索引多个块,然后找到在嵌入空间中最相似的块,但检索整个父文档并返回它(而不是单个块)。

Multi Vector

Vector store + 文档存储

有时候在索引期间

能够从文档中提取您认为比文本本身更相关的信息。

涉及为每个文档创建多个向量,每个向量可以以各种方式创建。例如,文本摘要和假设问题。

Self Query

Vector store

用户提出的问题最好通过基于元数据而不是文本相似性的检索来回答。

使用LLM将用户输入转换为两个内容:(1)要进行语义查找的字符串(2)与之一起使用的元数据筛选器。这很有用,因为通常问题是关于文档的元数据(而不是内容本身)。

Contextual Compression

任意

有时

发现检索到的文档包含太多无关信息,并且分散了LLM。

在另一个检索器之上放置了一个后处理步骤,并仅从检索的文档中提取最相关的信息。这可以使用嵌入或LLM完成。

Time-Weighted Vectorstore

Vector store

文档关联有时间戳,并且希望检索最近的文档。

基于语义相似性的组合(与常规向量检索相同)和最新性(查看已索引文档的时间戳)来检索文档。

Multi-Query Retriever

任意

用户提出的问题很复杂,并且需要多个不同信息片段来回答。

使用LLM从原始问题生成多个查询。当原始查询需要有关多个主题的信息片段才能得到恰当回答时,这很有用。通过生成多个查询,我们可以为每个查询获取文档。

Ensemble

任意

有多个检索方法并希望尝试将它们组合在一起。

从多个检索器中获取文档,然后将它们组合在一起。

Long-Context Reorder

任意

正在使用长文本模型,并且注意到它不注意检索到的文档中的中间信息。

从基础检索器中获取文档,然后重新排列它们,以使最相似的文档靠近开头和结尾。这很有用,因为已经证明对于更长的上下文模型,有时它们不关注上下文窗口中间的信息。

对表5-1中各个猎德具体说明如下所示:

  1. 名称:检索方法的名称。
  2. 索引类型:此检索方法依赖的索引类型(如果有)。
  3. 是否使用LLM:此检索方法是否使用LLM。
  4. 何时使用:应该何时使用此检索方法。
  5. 描述:此检索方法正在执行的描述。

5.6.2  基于向量存储的检索器

在LangChain中,基于向量存储的检索器(Vector store-backed retriever)是一种利用向量存储系统来检索相关文档的组件。这种检索器将文档转换为向量表示,并将这些向量存储在高效的向量数据库中,以便在接收到查询时能够快速地检索出与查询内容最相关的文档。它是一个轻量级的包装器,利用向量存储技术,通过向量存储实现的搜索方法(如相似性搜索和最大边际相关性搜索)来查询存储在其中的文本数据。

基于向量存储的检索器的特点如下所示。

  1. 高效性:向量存储系统专为快速检索设计,能够处理大量的向量数据和复杂的搜索任务。
  2. 灵活性:支持多种文本嵌入模型和向量存储系统,使得开发者可以根据具体需求选择合适的工具。
  3. 可扩展性:可以轻松地扩展以适应更大规模的数据集和更复杂的检索需求。
  4. 语义理解:通过使用先进的文本嵌入技术,检索器能够理解查询的语义内容,提供更准确的搜索结果。

在LangChain程序中,基于向量存储的检索器的实现步骤如下所示。

(1)文档嵌入:使用文本嵌入模型(如OpenAI Embeddings或其他支持的模型)将原始文本转换为数值向量。这些向量能够捕捉文本的语义信息。

(2)构建向量索引:将嵌入向量存储到向量存储系统中,如FAISS、Elasticsearch或Qdrant等。这些系统能够高效地处理和检索大规模的向量数据。

(3)查询处理:当接收到用户的查询时,检索器首先将查询文本转换为查询向量。然后,在向量存储中执行搜索操作,找到与查询向量最相似的文档向量。

(4)返回结果:根据搜索结果检索器返回一组与查询最相关的文档,这些文档可以是原始文本、摘要或其他形式的表示。

例如下面是一个使用基于向量存储的检索器的例子,这个例子需要准备一个有效的OpenAI API密钥,并且已经将其设置为环境变量。另外需要注意,由于OpenAI嵌入模型可能需要较长的处理时间,特别是在处理大量文档时,因此请耐心等待检索结果。

实例5-1使用基于向量存储的检索器查询信息(源码路径:codes\5\jian01.py

实例文件jian01.py的具体实现代码如下所示。

import os
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS

# 指定文档加载路径
document_path = "path_to_your_documents.txt"

# 加载文档
loader = TextLoader(document_path)
raw_documents = loader.load()

# 使用字符文本分割器分割文档
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)

# 初始化OpenAI嵌入模型
embeddings = OpenAIEmbeddings()

# 创建FAISS向量存储实例
db = FAISS.from_documents(documents, embeddings)

# 将向量存储转换为检索器
retriever = db.as_retriever()

# 用户查询
query = "What is the significance of the GPT model in AI?"

# 执行检索,获取与查询最相关的文档
relevant_docs = retriever.get_relevant_documents(query)

# 输出相关文档的内容
for doc in relevant_docs:
    print(doc.page_content)

在上述代码中,首先加载了一个文档,然后使用CharacterTextSplitter来分割文档。接着,使用OpenAIEmbeddings来生成文本的嵌入向量,并使用FAISS创建一个向量存储实例。最后,将向量存储转换为检索器,并使用它来响应用户的查询。执行后会输出用户查询“"What is the significance of the GPT model in AI?"”最相关的文档内容,例如:

The GPT (Generative Pre-trained Transformer) model is a significant breakthrough in the field of artificial intelligence. Developed by OpenAI, GPT is a language prediction model that uses deep learning to generate human-like text. It has the ability to understand and produce context, making it a versatile tool for various applications, including chatbots, content creation, and language translation.

在本实例中,检索器会根据文档内容和查询的相关性,返回一个或多个与查询最匹配的文档。在这个例子中,由于查询与文档内容高度相关,整个文档被返回作为查询的响应。

未完待续

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值