Skip to main content
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 类型为 “Text”。用于存储 Document.pageContent 值。
  • embedding 类型为 “Vector”。使用您计划使用的模型所使用的维度(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.com/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.com/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 });
}

相关