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.ts
或 xata.js
文件,它定义了您可以用来与数据库交互的客户端。有关使用 Xata JavaScript/TypeScript SDK 的更多详细信息,请参阅 Xata 入门文档。
使用
提示
有关安装集成包的常规说明,请参阅 本节。
- npm
- Yarn
- pnpm
npm install @langchain/openai @langchain/community @langchain/core
yarn add @langchain/openai @langchain/community @langchain/core
pnpm add @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 参考
- XataVectorSearch 来自
@langchain/community/vectorstores/xata
- OpenAIEmbeddings 来自
@langchain/openai
- OpenAI 来自
@langchain/openai
- VectorDBQAChain 来自
langchain/chains
- Document 来自
@langchain/core/documents
示例:使用元数据过滤器的相似性搜索
此示例演示了如何使用 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 参考
- XataVectorSearch 来自
@langchain/community/vectorstores/xata
- OpenAIEmbeddings 来自
@langchain/openai
- Document 来自
@langchain/core/documents