TL;DR: 我们正在调整我们的抽象概念,以便除了 LangChain 的 VectorDB
对象之外的其他检索方法也能在 LangChain 中轻松使用。 这样做是为了实现以下目标:(1) 允许在 其他地方构建 的检索器在 LangChain 中更易于使用,(2) 鼓励更多地试验替代检索方法(如 混合搜索)。 这与之前的版本向后兼容,因此所有现有的链应继续像以前一样工作。 但是,我们建议尽快从 VectorDB
链更新到新的 Retrieval
链,因为这些链将在未来获得最全面的支持。
介绍
自从 ChatGPT 问世以来,人们一直在为他们的数据构建个性化的 ChatGPT。 我们甚至写了 一篇关于此的教程,然后在几个月前 举办了一场关于此的竞赛。 对此的渴望和需求突显了 ChatGPT 的一个重要局限性——它不了解您的数据,如果了解,大多数人会觉得它更有用。 那么,如何构建一个了解您数据的聊天机器人呢?
实现此目的的主要方法是通过一个通常被称为“检索增强生成”的过程。 在此过程中,系统不是直接将用户问题传递给语言模型,而是“检索”任何可能与回答问题相关的文档,然后将这些文档(连同原始问题)传递给语言模型以进行“生成”步骤。
大多数人(包括 LangChain 的我们)进行检索的主要方式是使用语义搜索。 在此过程中,为所有文档计算一个数值向量(嵌入),然后将这些向量存储在向量数据库中(一个针对存储和查询向量优化的数据库)。 然后也将传入的查询向量化,检索到的文档是那些在嵌入空间中最接近查询的文档。 我们不会在此处深入探讨太多细节——但 此处 有一篇关于该主题的更深入的教程,下面是一个很好地总结了这一点的图表。

问题
这个过程效果很好,我们构建的许多组件和抽象概念(嵌入、向量存储)都是为了促进这个过程。
但我们注意到了两个问题。
第一: 在执行此检索步骤的方式上有很多不同的变化。 人们希望做超出语义搜索的事情。 具体来说
第二: 我们还意识到,人们可能会在 LangChain 之外构建检索器——例如 OpenAI 发布了他们的 ChatGPT Retrieval Plugin
。 我们希望尽可能方便人们在 LangChain 中使用他们创建的任何检索器。
我们意识到我们犯了一个错误——通过将我们的抽象概念集中在 VectorDBQA 上,我们限制了链的使用,使得 (1) 想要尝试其他检索方法的用户,(2) 在 LangChain 生态系统之外创建检索器的用户难以使用它们。
解决方案
那么我们是如何解决这个问题的呢?
在我们最新的 Python 和 TypeScript 版本中,我们
- 引入了
Retriever
的概念。 检索器应公开一个get_relevant_documents
方法,其签名如下:def get_relevant_documents(self, query: str) -> List[Document]
。 这是我们对检索器做出的唯一假设。 请参阅下文了解有关此接口的更多信息。 - 更改了我们所有使用 VectorDB 的链,现在都使用检索器。
VectorDBQA
现在是RetrievalQA
,ChatVectorDBChain
现在是ConversationalRetrievalChain
等。 请注意,展望未来,我们有意使用Conversational
前缀来表示链正在使用内存,并使用Chat
前缀来表示链正在使用聊天模型。 - 添加了第一个非 LangChain 检索器实例——
ChatGPT Retrieval Plugin
。 这是 OpenAI 昨天开源的一个模块,旨在帮助公司公开检索端点以连接到 ChatGPT。 注意:在所有意图和目的上,ChatGPT Retrieval Plugin
的内部工作原理与我们的 VectorStore 非常相似,但我们仍然非常高兴将其集成,以此来突出显示存在的新灵活性。
扩展 Retriever
接口
- 我们特意只要求一个方法 (
get_relevant_documents
),以便尽可能地具有包容性。 我们(尚未)对这些检索器的构建方式提出任何统一的要求。 - 我们特意强制
query: str
作为唯一参数。 对于所有其他参数(包括元数据过滤),这应存储为检索器本身的参数。 这是因为我们预计检索器经常嵌套在链内部使用,并且我们不希望围绕其他参数进行管道。
完成这一切的最终目标是使(LangChain VectorStore 之外的)替代检索器更容易在链和代理中使用,并鼓励替代检索方法的创新。
问答
问:索引和检索器之间有什么区别?
答: 索引是一种支持高效搜索的数据结构,而检索器是使用索引来查找和返回与用户查询相关的文档的组件。 索引是检索器赖以执行其功能的关键组件。
问:如果我之前在 VectorDBQA
链(或其他 VectorDB
类型链)中使用过 VectorStore,那么我现在在 RetrievalQA
链中使用什么?
答: 您可以使用 VectorStoreRetriever
,可以通过对现有向量存储执行 vectorstore.as_retriever()
来创建它
问:VectorDBQA
链(或其他 VectorDB
类型链)是否仍然存在?
答: 是的,尽管我们将不再关注它。 预计未来的任何开发都将在 RetrievalQA
链上进行。
问:我可以为库贡献一种新的检索方法吗?
答: 当然! 我们专门为此目的启动了一个新的 langchain/retrievers
模块
问:这实现了哪些现实世界的示例?
答: 主要的是更好地回答关于您的文档的问题。 但是,如果开始摄取然后检索以前的消息,这可以被认为是人工智能更好的长期记忆。