跳至主要内容

Xata

Xata 是一个基于 PostgreSQL 的无服务器数据平台。它提供了一个类型安全的 TypeScript/JavaScript SDK,用于与您的数据库进行交互,以及一个用于管理数据的 UI。

Xata 具有本机向量类型,可以添加到任何表中,并支持相似性搜索。LangChain 将向量直接插入 Xata,并查询它以获取给定向量的最近邻居,以便您可以将所有 LangChain 嵌入集成与 Xata 一起使用。

设置

安装 Xata CLI

npm install @xata.io/cli -g

创建一个用作向量存储的数据库

Xata UI 中创建一个新数据库。您可以将其命名为任何您想要的内容,但在此示例中我们将使用 langchain。创建一个表,同样您可以将其命名为任何内容,但我们将使用 vectors。通过 UI 添加以下列

  • content 类型的 "文本"。这用于存储 Document.pageContent 值。
  • embedding 类型的 "向量"。使用您计划使用的模型使用的维度(对于 OpenAI 为 1536)。
  • 您想要用作元数据的任何其他列。它们从 Document.metadata 对象填充。例如,如果在 Document.metadata 对象中您有一个 title 属性,您可以在表中创建一个 title 列,它将被填充。

初始化项目

在您的项目中,运行

xata init

然后选择您在上面创建的数据库。这也会生成一个 xata.tsxata.js 文件,它定义了您可以用来与数据库交互的客户端。有关使用 Xata JavaScript/TypeScript SDK 的更多详细信息,请参阅 Xata 入门文档

使用

提示

有关安装集成包的常规说明,请参阅 本节

npm install @langchain/openai @langchain/community @langchain/core

示例:使用 OpenAI 和 Xata 作为向量存储的 Q&A 聊天机器人

此示例使用 VectorDBQAChain 搜索存储在 Xata 中的文档,然后将它们作为上下文传递给 OpenAI 模型,以回答用户提出的问题。

import { XataVectorSearch } from "@langchain/community/vectorstores/xata";
import { OpenAIEmbeddings, OpenAI } from "@langchain/openai";
import { BaseClient } from "@xata.io/client";
import { VectorDBQAChain } from "langchain/chains";
import { Document } from "@langchain/core/documents";

// First, follow set-up instructions at
// https://js.langchain.ac.cn/docs/modules/data_connection/vectorstores/integrations/xata

// if you use the generated client, you don't need this function.
// Just import getXataClient from the generated xata.ts instead.
const getXataClient = () => {
if (!process.env.XATA_API_KEY) {
throw new Error("XATA_API_KEY not set");
}

if (!process.env.XATA_DB_URL) {
throw new Error("XATA_DB_URL not set");
}
const xata = new BaseClient({
databaseURL: process.env.XATA_DB_URL,
apiKey: process.env.XATA_API_KEY,
branch: process.env.XATA_BRANCH || "main",
});
return xata;
};

export async function run() {
const client = getXataClient();

const table = "vectors";
const embeddings = new OpenAIEmbeddings();
const store = new XataVectorSearch(embeddings, { client, table });

// Add documents
const docs = [
new Document({
pageContent: "Xata is a Serverless Data platform based on PostgreSQL",
}),
new Document({
pageContent:
"Xata offers a built-in vector type that can be used to store and query vectors",
}),
new Document({
pageContent: "Xata includes similarity search",
}),
];

const ids = await store.addDocuments(docs);

// eslint-disable-next-line no-promise-executor-return
await new Promise((r) => setTimeout(r, 2000));

const model = new OpenAI();
const chain = VectorDBQAChain.fromLLM(model, store, {
k: 1,
returnSourceDocuments: true,
});
const response = await chain.invoke({ query: "What is Xata?" });

console.log(JSON.stringify(response, null, 2));

await store.delete({ ids });
}

API 参考

示例:使用元数据过滤器的相似性搜索

此示例演示了如何使用 LangChain.js 和 Xata 实现语义搜索。在运行它之前,请确保在 Xata 中的 vectors 表中添加一个类型为 String 的 author 列。

import { XataVectorSearch } from "@langchain/community/vectorstores/xata";
import { OpenAIEmbeddings } from "@langchain/openai";
import { BaseClient } from "@xata.io/client";
import { Document } from "@langchain/core/documents";

// First, follow set-up instructions at
// https://js.langchain.ac.cn/docs/modules/data_connection/vectorstores/integrations/xata
// Also, add a column named "author" to the "vectors" table.

// if you use the generated client, you don't need this function.
// Just import getXataClient from the generated xata.ts instead.
const getXataClient = () => {
if (!process.env.XATA_API_KEY) {
throw new Error("XATA_API_KEY not set");
}

if (!process.env.XATA_DB_URL) {
throw new Error("XATA_DB_URL not set");
}
const xata = new BaseClient({
databaseURL: process.env.XATA_DB_URL,
apiKey: process.env.XATA_API_KEY,
branch: process.env.XATA_BRANCH || "main",
});
return xata;
};

export async function run() {
const client = getXataClient();
const table = "vectors";
const embeddings = new OpenAIEmbeddings();
const store = new XataVectorSearch(embeddings, { client, table });
// Add documents
const docs = [
new Document({
pageContent: "Xata works great with Langchain.js",
metadata: { author: "Xata" },
}),
new Document({
pageContent: "Xata works great with Langchain",
metadata: { author: "Langchain" },
}),
new Document({
pageContent: "Xata includes similarity search",
metadata: { author: "Xata" },
}),
];
const ids = await store.addDocuments(docs);

// eslint-disable-next-line no-promise-executor-return
await new Promise((r) => setTimeout(r, 2000));

// author is applied as pre-filter to the similarity search
const results = await store.similaritySearchWithScore("xata works great", 6, {
author: "Langchain",
});

console.log(JSON.stringify(results, null, 2));

await store.delete({ ids });
}

API 参考


此页面对您有帮助吗?


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