跳到主要内容
Xata 是一个基于 PostgreSQL 的无服务器数据平台。它提供了一个类型安全的 TypeScript/JavaScript SDK 用于与您的数据库交互,以及一个用于管理您的数据的 UI。 Xata 具有原生向量类型,可以添加到任何表中,并支持相似性搜索。LangChain 直接将向量插入 Xata,并查询给定向量的最近邻居,这样您就可以将所有 LangChain 嵌入集成与 Xata 一起使用。

设置

安装 Xata CLI

npm install @xata.io/cli -g

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

Xata UI 中创建一个新数据库。您可以随意命名,但在此示例中我们将使用 langchain。创建一个表,同样您可以随意命名,但我们将使用 vectors。通过 UI 添加以下列:
  • 类型为“Text”的 content。这用于存储 Document.pageContent 值。
  • 类型为“Vector”的 embedding。使用您计划使用的模型所使用的维度(OpenAI 为 1536)。
  • 您想用作元数据的任何其他列。它们从 Document.metadata 对象填充。例如,如果 Document.metadata 对象中有一个 title 属性,您可以在表中创建一个 title 列,它将被填充。

初始化项目

在您的项目中,运行
xata init
然后选择您上面创建的数据库。这将同时生成一个 xata.tsxata.js 文件,该文件定义了可用于与数据库交互的客户端。有关使用 Xata JavaScript/TypeScript SDK 的更多详细信息,请参阅 Xata 入门文档

用法

有关安装 LangChain 软件包的一般说明,请参阅此部分
npm
npm install @langchain/openai @langchain/community @langchain/core

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

此示例使用 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/classic/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 });
}

示例:带有元数据过滤器的相似性搜索

此示例展示了如何使用 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 });
}

以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。
© . This site is unofficial and not affiliated with LangChain, Inc.