跳至主要内容

Google Vertex AI 匹配引擎

兼容性

仅适用于 Node.js。

Google Vertex AI 匹配引擎“提供业界领先的超大规模低延迟向量数据库。这些向量数据库通常被称为向量相似度匹配或近似最近邻 (ANN) 服务。”

设置

注意

此模块需要一个已创建的端点和已部署的索引,因为创建时间大约需要一个小时。要了解更多信息,请参阅 LangChain python 文档 创建索引并将其部署到端点

在运行此代码之前,您应该确保在您的 Google Cloud 控制台中为相关项目启用了 Vertex AI API,并且您已使用以下方法之一登录到 Google Cloud

  • 您已登录到有权访问该项目的帐户(使用 gcloud auth application-default login)。
  • 您正在使用有权访问该项目的服务帐户的机器上运行。
  • 您已下载有权访问该项目的服务帐户的凭据,并将 GOOGLE_APPLICATION_CREDENTIALS 环境变量设置为该文件路径。

使用以下命令安装身份验证库

npm install @langchain/community @langchain/core google-auth-library

匹配引擎不存储实际的文档内容,只存储嵌入。因此,您需要一个 docstore。以下示例使用 Google Cloud Storage,它需要以下内容

npm install @google-cloud/storage

用法

初始化引擎

创建 MatchingEngine 对象时,您需要一些有关匹配引擎配置的信息。您可以从匹配引擎的 Cloud 控制台获取这些信息

  • 索引的 ID
  • 索引端点的 ID

您还需要一个文档存储。虽然 InMemoryDocstore 适用于初始测试,但您需要使用类似于 GoogleCloudStorageDocstore 的东西来更持久地存储它。

import { MatchingEngine } from "@langchain/community/vectorstores/googlevertexai";
import { Document } from "langchain/document";
import { SyntheticEmbeddings } from "langchain/embeddings/fake";
import { GoogleCloudStorageDocstore } from "@langchain/community/stores/doc/gcs";

const embeddings = new SyntheticEmbeddings({
vectorSize: Number.parseInt(
process.env.SYNTHETIC_EMBEDDINGS_VECTOR_SIZE ?? "768",
10
),
});

const store = new GoogleCloudStorageDocstore({
bucket: process.env.GOOGLE_CLOUD_STORAGE_BUCKET!,
});

const config = {
index: process.env.GOOGLE_VERTEXAI_MATCHINGENGINE_INDEX!,
indexEndpoint: process.env.GOOGLE_VERTEXAI_MATCHINGENGINE_INDEXENDPOINT!,
apiVersion: "v1beta1",
docstore: store,
};

const engine = new MatchingEngine(embeddings, config);

添加文档

const doc = new Document({ pageContent: "this" });
await engine.addDocuments([doc]);

文档中的任何元数据都将转换为匹配引擎“允许列表”值,这些值可用于在查询期间进行过滤。

const documents = [
new Document({
pageContent: "this apple",
metadata: {
color: "red",
category: "edible",
},
}),
new Document({
pageContent: "this blueberry",
metadata: {
color: "blue",
category: "edible",
},
}),
new Document({
pageContent: "this firetruck",
metadata: {
color: "red",
category: "machine",
},
}),
];

// Add all our documents
await engine.addDocuments(documents);

假定文档具有可用的“id”参数。如果未设置此参数,则将分配一个 ID,并将其作为文档的一部分返回。

查询文档

执行直接 k-最近邻搜索以返回所有结果,可以使用任何标准方法

const results = await engine.similaritySearch("this");

使用过滤器/限制查询文档

我们可以根据为文档设置的元数据限制返回的文档。因此,如果我们只想将结果限制为颜色为红色的那些,我们可以执行以下操作

import { Restriction } from `langchain/vectorstores/googlevertexai`;

const redFilter: Restriction[] = [
{
namespace: "color",
allowList: ["red"],
},
];
const redResults = await engine.similaritySearch("this", 4, redFilter);

如果我们想要执行更复杂的操作,例如颜色为红色但不可食用,我们可以执行以下操作

const filter: Restriction[] = [
{
namespace: "color",
allowList: ["red"],
},
{
namespace: "category",
denyList: ["edible"],
},
];
const results = await engine.similaritySearch("this", 4, filter);

删除文档

删除文档是使用 ID 完成的。

import { IdDocument } from `langchain/vectorstores/googlevertexai`;

const oldResults: IdDocument[] = await engine.similaritySearch("this", 10);
const oldIds = oldResults.map( doc => doc.id! );
await engine.delete({ids: oldIds});

此页面是否有帮助?


您也可以留下详细的反馈 在 GitHub 上.