Skip to main content
本笔记本介绍如何在 LangChain 中开始使用 Weaviate 向量存储,使用 langchain-weaviate 包。
Weaviate 是一个开源向量数据库。它允许你存储来自你喜欢的 ML 模型的数据对象和向量嵌入,并可无缝扩展到数十亿数据对象。
要使用此集成,你需要有一个正在运行的 Weaviate 数据库实例。

最低版本

此模块需要 Weaviate 1.23.7 或更高版本。但是,我们建议你使用最新版本的 Weaviate。

连接到 weaviate

在本笔记本中,我们假设你有一个本地运行的 Weaviate 实例,地址为 http://localhost:8080,并且端口 50051 已为 gRPC 流量开放。我们将使用以下方式连接到 Weaviate:

其他部署选项

Weaviate 可以以多种不同方式部署,例如使用 Weaviate Cloud Services (WCS)DockerKubernetes 如果你的 Weaviate 实例以其他方式部署,请在此处阅读更多关于连接到 Weaviate 的不同方式。你可以使用不同的辅助函数创建自定义实例
请注意,你需要一个 v4 客户端 API,它将创建一个 weaviate.WeaviateClient 对象。

身份验证

某些 Weaviate 实例(例如在 WCS 上运行的实例)启用了身份验证,例如 API 密钥和/或用户名+密码身份验证。 有关更多信息,请阅读客户端身份验证指南以及深入的身份验证配置页面

连接到现有集合(重用索引)

如果你已经在本地 Weaviate 实例中创建了一个集合,你可以直接连接到它:

安装

环境设置

本笔记本通过 OpenAIEmbeddings 使用 OpenAI API。我们建议获取一个 OpenAI API 密钥,并将其导出为名为 OPENAI_API_KEY 的环境变量。 完成后,你的 OpenAI API 密钥将被自动读取。如果你是环境变量的新手,请在 Python os.environ 文档本指南中阅读更多相关信息。

使用方法

通过相似性查找对象

以下是一个示例,展示如何通过与查询的相似性来查找对象,从数据导入到查询 Weaviate 实例。

步骤 1:数据导入

首先,我们将通过加载和分块一个长文本文件的内容来创建要添加到 Weaviate 的数据。
现在,我们可以导入数据。 为此,请连接到 Weaviate 实例并使用生成的 weaviate_client 对象。例如,我们可以如下所示导入文档:

步骤 2:执行搜索

我们现在可以执行相似性搜索。这将返回与查询文本最相似的文档,基于存储在 Weaviate 中的嵌入以及从查询文本生成的等效嵌入。
你还可以添加过滤器,根据过滤条件包含或排除结果。(参见更多过滤器示例。)
也可以提供 k,这是要返回的结果数量的上限。

量化结果相似性

你可以选择检索相关性“分数”。这是一个相对分数,表示在搜索结果池中,特定搜索结果的好坏程度。 请注意,这是一个相对分数,意味着它不应被用于确定相关性的阈值。但是,它可用于比较整个搜索结果集中不同搜索结果的相关性。

搜索机制

similarity_search 使用 Weaviate 的混合搜索 混合搜索结合了向量搜索和关键词搜索,其中 alpha 是向量搜索的权重。similarity_search 函数允许你通过 kwargs 传递额外参数。有关可用参数,请参阅此参考文档 你可以通过添加 alpha=0 来执行纯关键词搜索,如下所示:

持久性

通过 langchain-weaviate 添加的任何数据都将根据其配置持久化在 Weaviate 中。 例如,WCS 实例配置为无限期持久化数据,而 Docker 实例可以设置为在卷中持久化数据。阅读更多关于 Weaviate 的持久性

多租户

多租户允许你在单个 Weaviate 实例中拥有大量隔离的数据集合,具有相同的集合配置。这对于多用户环境(如构建 SaaS 应用程序)非常有用,其中每个最终用户将拥有自己的隔离数据集合。 要使用多租户,向量存储需要知道 tenant 参数。 在添加任何数据时,提供 tenant 参数,如下所示。
在执行查询时,也提供 tenant 参数。

检索器选项

Weaviate 也可以用作检索器

最大边际相关性搜索 (MMR)

除了在检索器对象中使用 similaritysearch 之外,你还可以使用 mmr

与 LangChain 一起使用

大型语言模型 (LLM) 的一个已知限制是其训练数据可能过时,或者不包含你所需的特定领域知识。 请看下面的示例:
向量存储通过提供存储和检索相关信息的方式补充了 LLM。这允许你结合 LLM 和向量存储的优势,将 LLM 的推理和语言能力与向量存储检索相关信息的能力相结合。 结合 LLM 和向量存储的两个著名应用是:
  • 问答
  • 检索增强生成 (RAG)

带来源的问答

LangChain 中的问答可以通过使用向量存储来增强。让我们看看如何做到这一点。 本节使用 RetrievalQAWithSourcesChain,它从索引中查找文档。 首先,我们将再次分块文本并将其导入 Weaviate 向量存储。
现在我们可以构建链,并指定检索器:
并运行链以提出问题:

检索增强生成

结合 LLM 和向量存储的另一个非常流行的应用是检索增强生成 (RAG)。这是一种使用检索器从向量存储中查找相关信息,然后使用 LLM 根据检索到的数据和提示提供输出的技术。 我们从类似的设置开始:
我们需要为 RAG 模型构建一个模板,以便检索到的信息将填充到模板中。
运行单元格后,我们得到非常相似的输出。
请注意,由于模板由你构建,你可以根据需要进行自定义。

总结与资源

Weaviate 是一个可扩展的、生产就绪的向量存储。 此集成允许 Weaviate 与 LangChain 一起使用,通过强大的数据存储增强大型语言模型的能力。其可扩展性和生产就绪性使其成为 LangChain 应用程序向量存储的绝佳选择,并将减少你的生产时间。