Vespa是一个功能齐全的搜索引擎和向量数据库。它支持向量搜索(ANN)、词法搜索以及结构化数据搜索,所有这些都可以在同一查询中完成。本笔记本展示了如何使用
Vespa.ai 作为 LangChain 向量存储。 您需要安装 langchain-community,运行 pip install -qU langchain-community 才能使用此集成。 为了创建向量存储,我们使用 pyvespa 来连接 Vespa 服务。pyvespa 包,您可以连接到 Vespa 云实例或本地 Docker 实例。在这里,我们将创建一个新的 Vespa 应用程序并使用 Docker 进行部署。
创建 Vespa 应用程序
首先,我们需要创建一个应用程序包text 和用于存储嵌入向量的 embedding。text 字段被设置为使用 BM25 索引进行高效的文本检索,我们稍后将看到如何使用它和混合搜索。 embedding 字段设置为长度为 384 的向量,用于存储文本的嵌入表示。有关 Vespa 中张量的更多信息,请参阅 Vespa 的张量指南。 最后,我们添加一个 排名配置文件,以指示 Vespa 如何对文档进行排序。在这里,我们将其设置为 最近邻搜索。 现在我们可以将此应用程序部署到本地:Vespa 服务的连接。如果您已经有一个 Vespa 应用程序在运行,例如在云中,请参阅 PyVespa 应用程序了解如何连接。
创建 Vespa 向量存储
现在,让我们加载一些文档1536 以反映其更大的尺寸。 要将这些数据馈送给 Vespa,我们需要配置向量存储如何映射到 Vespa 应用程序中的字段。然后我们直接从这组文档创建向量存储:default 排名函数,这是我们在上面的应用程序包中设置的。您可以使用 ranking 参数在 similarity_search 中指定要使用的排名函数。 有关更多信息,请参阅 pyvespa 文档。 这涵盖了 LangChain 中 Vespa 存储的基本用法。现在您可以返回结果并继续在 LangChain 中使用它们。更新文档
除了调用from_documents 之外,您还可以直接创建向量存储并从其中调用 add_texts。这也可以用于更新文档
pyvespa 库包含直接操作 Vespa 内容的方法,您可以直接使用这些方法。
删除文档
您可以使用delete 函数删除文档
pyvespa 连接也包含删除文档的方法。
返回分数
similarity_search 方法仅按相关性顺序返回文档。要检索实际分数
angular 参数指定)的 "all-MiniLM-L6-v2" 嵌入模型的结果。 不同的嵌入函数需要不同的距离函数,并且 Vespa 需要知道在排序文档时使用哪个距离函数。有关距离函数的更多信息,请参阅 文档。作为检索器
要将此向量存储用作 LangChain 检索器,只需调用as_retriever 函数,这是一个标准的向量存储方法
元数据
到目前为止的示例中,我们只使用了文本及其嵌入。文档通常包含额外的信息,在 LangChain 中称为元数据。 Vespa 可以通过将其添加到应用程序包中来包含许多不同类型的字段:自定义查询
如果相似性搜索的默认行为不符合您的要求,您总是可以提供自己的查询。因此,您不需要向向量存储提供所有配置,只需自己编写即可。 首先,让我们在应用程序中添加一个 BM25 排名函数:混合搜索
混合搜索意味着同时使用经典的基于词项的搜索(如 BM25)和向量搜索,并结合结果。我们需要为 Vespa 上的混合搜索创建一个新的排名配置文件Vespa 中的原生嵌入器
到目前为止,我们一直使用 Python 中的嵌入函数为文本提供嵌入。Vespa 本身支持嵌入函数,因此您可以将此计算推迟到 Vespa 中。一个好处是,如果您有大量集合,在嵌入文档时能够使用 GPU。 有关更多信息,请参阅 Vespa 嵌入。 首先,我们需要修改我们的应用程序包:hfembedding 字段包含使用 hf-embedder 进行嵌入的说明。 现在我们可以使用自定义查询进行查询:embed 指令,用于使用与文档相同的模型嵌入查询。
近似最近邻
在上述所有示例中,我们都使用精确最近邻搜索来查找结果。然而,对于大型文档集合,这并不可行,因为必须扫描所有文档才能找到最佳匹配。为了避免这种情况,我们可以使用 近似最近邻。 首先,我们可以更改嵌入字段以创建 HNSW 索引:approximate 参数设置为 True 来轻松使用 ANN 进行搜索。
以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。