【LangChain】检索器(Retrievers)

这篇具有很好参考价值的文章主要介绍了【LangChain】检索器(Retrievers)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概要

检索器是一个接口,它根据非结构化查询返回文档。它比向量存储更通用。检索器不需要能够存储文档,只需返回(或检索)它。向量存储可以用作检索器的骨干,但也有其他类型的检索器。

开始

LangChainBaseRetriever类的公共API如下:

from abc import ABC, abstractmethod
from typing import Any, List
from langchain.schema import Document
from langchain.callbacks.manager import Callbacks

class BaseRetriever(ABC):
    ...
    def get_relevant_documents(
        self, query: str, *, callbacks: Callbacks = None, **kwargs: Any
    ) -> List[Document]:
        """Retrieve documents relevant to a query.
        Args:
            query: string to find relevant documents for
            callbacks: Callback manager or list of callbacks
        Returns:
            List of relevant documents
        """
        ...

    async def aget_relevant_documents(
        self, query: str, *, callbacks: Callbacks = None, **kwargs: Any
    ) -> List[Document]:
        """Asynchronously get documents relevant to a query.
        Args:
            query: string to find relevant documents for
            callbacks: Callback manager or list of callbacks
        Returns:
            List of relevant documents
        """
        ...

就这么简单!您可以调用 get_relevant_documents异步 get_relevant_documents 方法来检索与查询相关的文档,其中“相关性”由您调用的特定检索器对象定义。

当然,我们也帮助构建我们认为有用的检索器。我们关注的主要检索器类型是 Vectorstore 检索器。我们将在本指南的其余部分重点讨论这一点。

为了了解什么是向量存储检索器,了解什么是向量存储,这非常重要。那么让我们看看这个。

pip install chromadb

此示例展示了针对文档的问答。我们选择这个作为入门示例,因为它很好地结合了许多不同的元素(文本分割器、嵌入、向量存储),然后还展示了如何在链中使用它们。

针对文档的问答包括四个步骤:

  1. 创建索引
  2. 从该索引创建一个检索器
  3. 创建问答链
  4. 问问题!

每个步骤都有多个子步骤和潜在的配置。在本笔记本中,我们将主要关注 (1)。
我们将首先展示这样做的简短说明,然后分解实际发生的情况。

首先,让我们导入一些无论如何都会用到的通用类。

from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

接下来在通用设置中,我们指定要使用的文档加载器。您可以在此处下载 state_of_the_union.txt 文件。

from langchain.document_loaders import TextLoader
loader = TextLoader('../state_of_the_union.txt', encoding='utf8')

一行(代码)创建索引

为了尽快开始,我们可以使用 VectorstoreIndexCreator

from langchain.indexes import VectorstoreIndexCreator
index = VectorstoreIndexCreator().from_loaders([loader])

结果:

使用直接本地 API 运行 Chroma。
使用内存中的 DuckDB 作为数据库。数据将是暂时的。

现在索引已创建,我们可以使用它来询问数据问题!请注意,在幕后,这实际上也执行了几个步骤,我们将在本指南的后面部分介绍这些步骤。

query = "总统对科坦吉·布朗·杰克逊说了些什么"
index.query(query)

结果:

总统表示,科坦吉·布朗·杰克逊是美国顶尖的法律专家之一、前私人执业顶级诉讼律师、前联邦公设辩护律师,出身于公立学校教育工作者和警察家庭。他还表示,她是共识的缔造者,得到了从警察兄弟会到民主党和共和党任命的前法官的广泛支持。
query = "总统对科坦吉·布朗·杰克逊说了些什么"
# 注意这里方法不一样啦
index.query_with_sources(query)

结果:

    {'question': '总统对科坦吉·布朗·杰克逊说了些什么',
     'answer': " 总统表示,他提名美国顶尖法律专家之一的巡回上诉法院法官科坦吉·布朗·杰克逊(Ketanji Brown Jackson)继承布雷耶大法官的卓越遗产,她得到了警察兄弟会以及民主党和共和党任命的前法官的广泛支持。\n",
     'sources': '../state_of_the_union.txt'}

VectorstoreIndexCreator 返回的是 VectorStoreIndexWrapper,它提供了很好的查询和 query_with_sources 功能。如果我们只是想直接访问向量库,我们也可以这样做。

index.vectorstore

结果:

    <langchain.vectorstores.chroma.Chroma at 0x119aa5940>

如果我们想访问 VectorstoreRetriever,我们可以这样做:

index.vectorstore.as_retriever()

结果:

    VectorStoreRetriever(vectorstore=<langchain.vectorstores.chroma.Chroma object at 0x119aa5940>, search_kwargs={})

演示

好吧,现在我们可能会有很多疑问:到底发生了什么?这个索引是如何创建的?
很多神奇之处都隐藏在这个 VectorstoreIndexCreator 中。这是在做什么?
加载文档后 将执行下面三个主要步骤:

  1. 将文档分割成块
  2. 为每个文档创建嵌入
  3. 在向量存储中存储文档和嵌入

让我们用代码来演示一下:

加载文档:

documents = loader.load()

接下来,我们将把文档分成块。

from langchain.text_splitter import CharacterTextSplitter
# 拆分器
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
# 将文档分成块
texts = text_splitter.split_documents(documents)

然后我们将选择要使用的嵌入。

from langchain.embeddings import OpenAIEmbeddings
# 创建嵌入
embeddings = OpenAIEmbeddings()

我们现在创建向量存储来用作索引。

from langchain.vectorstores import Chroma
# 向量存储,这也就意味着,创建了一个索引
db = Chroma.from_documents(texts, embeddings)

结果

    Running Chroma using direct local API.
    Using DuckDB in-memory for database. Data will be transient.

这就是创建索引。然后,我们在检索器接口中公开该索引。

# 公开该索引
retriever = db.as_retriever()

然后,像以前一样,我们创建一条链并用它来回答问题!

qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=retriever)
query = "总统对科坦吉·布朗·杰克逊说了些什么"
qa.run(query)

结果:

总统表示,科坦吉·布朗·杰克逊法官是美国顶尖的法律专家之一、前私人执业顶级诉讼律师、前联邦公设辩护律师,出身于公立学校教育工作者和警察家庭。他说,她是共识的缔造者,并得到了警察兄弟会等组织以及民主党和共和党任命的前法官的广泛支持。

VectorstoreIndexCreator 是所有这些逻辑的包装器。它可以在它使用的文本分割器、嵌入以及向量存储中进行配置。例如,您可以如下配置:

index_creator = VectorstoreIndexCreator(
    vectorstore_cls=Chroma,
    embedding=OpenAIEmbeddings(),
    text_splitter=CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
)

希望能帮助我们了解 VectorstoreIndexCreator 背后发生的事情。

总结

如何创建检索器

  1. 加载文档documents = loader.load()
  2. 创建拆分器,拆分文档
  3. 创建嵌入
  4. 构建向量存储(利用拆分后的文档和嵌入)得到索引:db = Chroma.from_documents(texts, embeddings)
  5. 利用索引得到检索器:retriever = db.as_retriever()

参考地址:

https://python.langchain.com/docs/modules/data_connection/retrievers/文章来源地址https://www.toymoban.com/news/detail-601422.html

到了这里,关于【LangChain】检索器(Retrievers)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Langchain使用介绍之 - 基于向量存储进行检索

    Text Embedding Models   如何将一段Document转换成向量存储到向量数据库中,首先需要了解Langchain提供了哪些将文本转换成向量的model,langchian提供了很多将自然语言转换成向量的的模型,如下图所示,除了下图列举的model,更多支持的model可参考官网信息。    这里将以Langchain提供

    2024年02月09日
    浏览(43)
  • 【LangChain】检索器之上下文压缩

    【LangChain】检索器(Retrievers) 【LangChain】检索器之MultiQueryRetriever 【LangChain】检索器之上下文压缩 检索的一项挑战是,通常我们不知道:当数据引入系统时,文档存储系统会面临哪些特定查询。 这意味着与查询最相关的信息可能被隐藏在包含大量不相关文本的文档中。 通过我

    2024年02月15日
    浏览(51)
  • Chinese-LangChain:基于ChatGLM-6b+langchain实现本地化知识库检索与智能答案生成

    Chinese-LangChain:中文langchain项目,基于ChatGLM-6b+langchain实现本地化知识库检索与智能答案生成 https://github.com/yanqiangmiffy/Chinese-LangChain 俗称:小必应,Q.Talk,强聊,QiangTalk 🐯 2023/04/19 引入ChuanhuChatGPT皮肤 📱 2023/04/19 增加web search功能,需要确保网络畅通! 📚 2023/04/18 webui增加知

    2024年02月06日
    浏览(58)
  • 基于Langchain的txt文本向量库搭建与检索

    这里的源码主要来自于Langchain-ChatGLM中的向量库部分,做了一些代码上的修改和封装,以适用于基于 问题 和 包含数据库表描述的txt文件 (文件名为库表名,文件内容为库表中的字段及描述)对数据库表进行快速检索。 splitter.py myfaiss.py embedder.py Config是用来传参的类,这里略

    2024年02月04日
    浏览(36)
  • Langchain 与 Elasticsearch:创新数据检索的融合实战

    在信息爆炸的时代,有效地检索和处理数据变得至关重要。Langchain 和 Elasticsearch 的结合,为我们提供了一个强大的工具,以更智能的方式进行数据检索和分析。 作为一名拥有多年 Elasticsearch 实战经验的技术博主,我将在本文中详细介绍这两种技术的整合应用。 Langchain是一个

    2024年01月19日
    浏览(43)
  • langchain pdf链检索,提问式表单(实体命名识别)

    目录 PDF检索 提问式表单 通过用户输入的内容,识别需要填写的字段,有点实体命名识别的感觉,当需要从程序中识别特定实体时可以参考

    2024年04月25日
    浏览(27)
  • TS版LangChain实战:基于文档的增强检索(RAG)

    LangChain是一个以 LLM (大语言模型)模型为核心的开发框架,LangChain的主要特性: 可以连接多种数据源,比如网页链接、本地PDF文件、向量数据库等 允许语言模型与其环境交互 封装了Model I/O(输入/输出)、Retrieval(检索器)、Memory(记忆)、Agents(决策和调度)等核心组件

    2024年02月05日
    浏览(57)
  • 使用langchain与你自己的数据对话(三):检索(Retrieval)

      之前我已经完成了使用langchain与你自己的数据对话的前两篇博客,还没有阅读这两篇博客的朋友可以先阅读一下: 使用langchain与你自己的数据对话(一):文档加载与切割 使用langchain与你自己的数据对话(二):向量存储与嵌入 今天我们来继续讲解deepleaning.AI的在线课程“Lan

    2024年02月15日
    浏览(44)
  • 【ChatGLM】基于 ChatGLM-6B + langchain 实现本地化知识库检索与智能答案生成: 中文 LangChain 项目的实现开源工作

      目录 【ChatGLM】基于 ChatGLM-6B + langchain 实现本地化知识库检索与智能答案生成: 中文 LangChain 项目的实现开源工作 1.克隆源代码:

    2024年02月11日
    浏览(46)
  • Langchain+ElasticSearch+文心千帆 构建检索增强LLM Agent

    很早就开始做检索增强的大语言模型Agent了,通过外接知识库为LLM提供外部知识能增强它回答的准确性。这里我们使用ElasticSearch作为数据库存储相关知识,使用百度文心千帆的embedding API提供向量嵌入;借助langchain搭建LLM Agent. 需要安装的环境有: Python, ElasticSearch, langchain, q

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包