Xata 聊天记忆
Xata 是一个基于 PostgreSQL 的无服务器数据平台。它提供了一个类型安全的 TypeScript/JavaScript SDK 用于与您的数据库交互,以及一个用于管理您的数据的 UI。
使用 XataChatMessageHistory
类,您可以使用 Xata 数据库来长期保存聊天会话。
由于 Xata 通过 REST API 工作并具有纯 TypeScript SDK,因此您可以将其与 Vercel Edge、Cloudflare Workers 和任何其他无服务器环境一起使用。
设置
安装 Xata CLI
npm install @xata.io/cli -g
创建要用作向量存储的数据库
在 Xata UI 中创建一个新的数据库。您可以随意命名它,但在这个示例中,我们将使用 langchain
。
首次执行时,Xata LangChain 集成将创建用于存储聊天消息的表。如果已存在具有该名称的表,它将保持不变。
初始化项目
在您的项目中,运行
xata init
然后选择您上面创建的数据库。这还将生成一个 xata.ts
或 xata.js
文件,该文件定义了您可以用来与数据库交互的客户端。有关使用 Xata JavaScript/TypeScript SDK 的更多详细信息,请参见 Xata 入门文档。
用法
存储在 Xata 数据库中的每个聊天历史会话必须具有一个唯一的 ID。
在这个示例中,getXataClient()
函数用于基于环境变量创建新的 Xata 客户端。但是,我们建议使用 xata init
命令生成的代码,在这种情况下,您只需要从生成的 xata.ts
文件中导入 getXataClient()
函数。
有关安装集成包的一般说明,请参阅 此部分。
- npm
- Yarn
- pnpm
npm install @langchain/openai @langchain/community
yarn add @langchain/openai @langchain/community
pnpm add @langchain/openai @langchain/community
import { BufferMemory } from "langchain/memory";
import { ChatOpenAI } from "@langchain/openai";
import { ConversationChain } from "langchain/chains";
import { XataChatMessageHistory } from "@langchain/community/stores/message/xata";
import { BaseClient } from "@xata.io/client";
// 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;
};
const memory = new BufferMemory({
chatHistory: new XataChatMessageHistory({
table: "messages",
sessionId: new Date().toISOString(), // Or some other unique identifier for the conversation
client: getXataClient(),
apiKey: process.env.XATA_API_KEY, // The API key is needed for creating the table.
}),
});
const model = new ChatOpenAI();
const chain = new ConversationChain({ llm: model, memory });
const res1 = await chain.invoke({ input: "Hi! I'm Jim." });
console.log({ res1 });
/*
{
res1: {
text: "Hello Jim! It's nice to meet you. My name is AI. How may I assist you today?"
}
}
*/
const res2 = await chain.invoke({ input: "What did I just say my name was?" });
console.log({ res2 });
/*
{
res1: {
text: "You said your name was Jim."
}
}
*/
API 参考
- BufferMemory 来自
langchain/memory
- ChatOpenAI 来自
@langchain/openai
- ConversationChain 来自
langchain/chains
- XataChatMessageHistory 来自
@langchain/community/stores/message/xata
使用预先创建的表
如果您不想让代码始终检查表是否存在,则可以在 Xata UI 中手动创建表,并将 createTable: false
传递给构造函数。该表必须具有以下列
sessionId
类型为String
type
类型为String
role
类型为String
content
类型为Text
name
类型为String
additionalKwargs
类型为Text
import { BufferMemory } from "langchain/memory";
import { ChatOpenAI } from "@langchain/openai";
import { ConversationChain } from "langchain/chains";
import { XataChatMessageHistory } from "@langchain/community/stores/message/xata";
import { BaseClient } from "@xata.io/client";
// Before running this example, see the docs at
// https://js.langchain.ac.cn/docs/modules/memory/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;
};
const memory = new BufferMemory({
chatHistory: new XataChatMessageHistory({
table: "messages",
sessionId: new Date().toISOString(), // Or some other unique identifier for the conversation
client: getXataClient(),
createTable: false, // Explicitly set to false if the table is already created
}),
});
const model = new ChatOpenAI();
const chain = new ConversationChain({ llm: model, memory });
const res1 = await chain.invoke({ input: "Hi! I'm Jim." });
console.log({ res1 });
/*
{
res1: {
text: "Hello Jim! It's nice to meet you. My name is AI. How may I assist you today?"
}
}
*/
const res2 = await chain.invoke({ input: "What did I just say my name was?" });
console.log({ res2 });
/*
{
res1: {
text: "You said your name was Jim."
}
}
*/
API 参考
- BufferMemory 来自
langchain/memory
- ChatOpenAI 来自
@langchain/openai
- ConversationChain 来自
langchain/chains
- XataChatMessageHistory 来自
@langchain/community/stores/message/xata