Vespa 是一个功能完备的搜索引擎和向量数据库。它在同一个查询中支持向量搜索(ANN)、词法搜索以及结构化数据搜索。本 notebook 展示了如何将
Vespa.ai 用作 LangChain 向量存储。
使用本集成需要安装 langchain-community:pip install -qU langchain-community
为了创建向量存储,我们使用 pyvespa 来创建与 Vespa 服务的连接。
pyvespa 包,您可以连接到 Vespa Cloud 实例 或本地 Docker 实例。在这里,我们将创建一个新的 Vespa 应用程序并使用 Docker 进行部署。
创建 vespa 应用程序
首先,我们需要创建一个应用程序包:text 用于保存文档文本,embedding 用于保存嵌入向量。text 字段被配置为使用 BM25 索引以实现高效的文本检索,稍后我们将看到如何使用它以及混合搜索。
embedding 字段被配置为长度为 384 的向量,用于保存文本的嵌入表示。更多关于 Vespa 中张量的信息请参阅 Vespa 张量指南。
最后,我们添加一个排名配置文件以指导 Vespa 如何对文档排序。这里我们用最近邻搜索来设置。
现在我们可以在本地部署此应用程序:
Vespa 服务的连接。如果您已有正在运行的 Vespa 应用程序(例如在云端),请参阅 PyVespa 应用程序以了解如何连接。
创建 vespa 向量存储
现在让我们加载一些文档:1536 以反映该嵌入的更大尺寸。
要将这些内容提供给 Vespa,我们需要配置向量存储应如何映射到 Vespa 应用程序中的字段。然后我们直接从这组文档创建向量存储:
default 排名函数。您可以使用 similarity_search 的 ranking 参数来指定使用哪个排名函数。
请参阅 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 embeddings 了解更多信息。 首先,我们需要修改应用程序包:hfembedding 字段包含使用 hf-embedder 进行嵌入的指令。
现在我们可以使用自定义查询进行查询:
embed 指令,使用与文档相同的模型对查询进行嵌入。
近似最近邻
在上述所有示例中,我们使用精确最近邻来查找结果。然而,对于大型文档集合,这不可行,因为需要扫描所有文档才能找到最佳匹配。为了避免这种情况,我们可以使用近似最近邻。 首先,我们可以更改嵌入字段以创建 HNSW 索引:approximate 参数设为 True 来轻松使用 ANN 进行搜索:
通过 MCP 将这些文档连接到 Claude、VSCode 等,获取实时答案。

