以编程方式使用文档

> YDB 是一个多功能的开源分布式 SQL 数据库,将高可用性和可扩展性与强一致性和 ACID 事务相结合。它同时支持事务性 (OLTP)、分析性 (OLAP) 和流式工作负载。

本指南提供快速入门 YDBVectorStore 向量存储的快速概览。要获取所有功能和配置的详细文档,请参阅 YDB LangChain.js 指南.

设置

使用 Docker 设置本地 YDB 实例:

docker run -d -p 2136:2136 --name ydb-langchain -e YDB_USE_IN_MEMORY_PDISKS=true -h localhost ydbplatform/local-ydb:trunk

安装 @ydbjs/langchain@langchain/core 以使用此集成。

本指南使用 OpenAI 嵌入 作为示例。您可以使用 其他支持的嵌入模型 instead.

npm install @ydbjs/langchain @langchain/openai @langchain/core
yarn add @ydbjs/langchain @langchain/openai @langchain/core
pnpm add @ydbjs/langchain @langchain/openai @langchain/core

凭证

本地 YDB 实例不需要凭证。请确保您已安装上面显示的包。

如果您在本指南中使用 OpenAI 嵌入,请设置您的 OpenAI 密钥:

process.env.OPENAI_API_KEY = "YOUR_API_KEY";

如果您想获取模型调用的自动追踪,您还可以设置您的 LangSmith API 密钥,方法是取消注释以下内容:

// process.env.LANGSMITH_TRACING="true"
// process.env.LANGSMITH_API_KEY="your-api-key"

实例化

要实例化向量存储,请传递嵌入模型和连接字符串。当存储创建驱动程序时,它还管理其生命周期:

const embeddings = new OpenAIEmbeddings({
  model: "text-embedding-3-small",
});

await using vectorStore = new YDBVectorStore(embeddings, {
  connectionString: "grpc://localhost:2136/local",
});

await using 语法会在变量超出范围时自动释放存储并关闭其驱动程序。如果你不使用 await using,请调用 close() 在完成时手动调用:

const vectorStore = new YDBVectorStore(embeddings, {
  connectionString: "grpc://localhost:2136/local",
});
// ...
vectorStore.close();

管理向量存储

向向量存储添加项目

使用 addDocuments 方法添加文档。没有 ID 的文档会收到自动生成的 UUID,重新插入具有现有 ID 的文档会替换它。

const document1 = new Document({
  pageContent: "The powerhouse of the cell is the mitochondria",
  metadata: { source: "https://example.com" },
});

const document2 = new Document({
  pageContent: "Buildings are made out of brick",
  metadata: { source: "https://example.com" },
});

const document3 = new Document({
  pageContent: "Mitochondria are made out of lipids",
  metadata: { source: "https://example.com" },
});

const documents = [document1, document2, document3];

const ids = await vectorStore.addDocuments(documents);

从向量存储删除项目

按 ID 删除特定文档:

await vectorStore.delete({ ids: [ids[ids.length - 1]] });

查询向量存储

一旦您的向量存储已创建并且相关文档已添加,您很可能希望在链或代理运行期间对其进行查询。

直接查询

执行简单的相似性搜索如下:

const results = await vectorStore.similaritySearch("biology", 2);

for (const doc of results) {
  console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata)}]`);
}

要执行相似性搜索并接收相应的分数,请运行:

const resultsWithScore = await vectorStore.similaritySearchWithScore("biology", 2);

for (const [doc, score] of resultsWithScore) {
  console.log(`* [SIM=${score.toFixed(3)}] ${doc.pageContent} [${JSON.stringify(doc.metadata)}]`);
}

您还可以按元数据过滤结果。过滤器作为键值对传递,并与 AND logic:

const filteredResults = await vectorStore.similaritySearch("biology", 2, {
  source: "https://example.com",
});

通过转换为检索器进行查询

您还可以将向量存储转换为 检索器 以便在您的链中更轻松地使用:

const retriever = vectorStore.asRetriever({
  k: 2,
});
await retriever.invoke("biology");

用于检索增强生成

有关如何使用此向量存储进行检索增强生成 (RAG) 的指南,请参阅以下部分:

API 参考

有关所有功能的详细文档 YDBVectorStore 功能和配置(包括搜索策略、近似最近邻索引和列自定义),请参阅 YDB LangChain.js 指南.