Firestore 聊天记忆
为了在聊天会话之间实现更长期的持久化,您可以将默认的内存中 chatHistory 替换为 Firestore,以支持如 BufferMemory 这类聊天记忆类。
安装配置
首先,在您的项目中安装 Firebase 管理包:
- npm
- Yarn
- pnpm
npm install firebase-admin
yarn add firebase-admin
pnpm add firebase-admin
:::提示 请参阅安装集成包的一般说明部分。 :::
- 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
从您的 Firebase 项目中访问 Project Settings 页面,然后选择 Service accounts 标签页。
在 Service accounts 标签页中,点击 Firebase Admin SDK 部分内的 Generate new private key 按钮,下载包含您的服务账户凭据的 JSON 文件。
使用下载的 JSON 文件,将 projectId、privateKey 和 clientEmail 传递给 FirestoreChatMessageHistory 类的 config 对象,如下所示:
import { FirestoreChatMessageHistory } from "@langchain/community/stores/message/firestore";
import admin from "firebase-admin";
const messageHistory = new FirestoreChatMessageHistory({
collections: ["chats"],
docs: ["user-id"],
sessionId: "user-id",
userId: "[email protected]",
config: {
projectId: "YOUR-PROJECT-ID",
credential: admin.credential.cert({
projectId: "YOUR-PROJECT-ID",
privateKey:
"-----BEGIN PRIVATE KEY-----\nCHANGE-ME\n-----END PRIVATE KEY-----\n",
clientEmail: "[email protected]",
}),
},
});
在此,collections 字段应与数据库中的 collections 名称和顺序匹配。
docs 字段也是如此,应与数据库中的 docs 名称和顺序匹配。
使用方法
import { BufferMemory } from "langchain/memory";
import { FirestoreChatMessageHistory } from "@langchain/community/stores/message/firestore";
import { ChatOpenAI } from "@langchain/openai";
import { ConversationChain } from "langchain/chains";
import admin from "firebase-admin";
const memory = new BufferMemory({
chatHistory: new FirestoreChatMessageHistory({
collections: ["langchain"],
docs: ["lc-example"],
sessionId: "lc-example-id",
userId: "[email protected]",
config: {
projectId: "YOUR-PROJECT-ID",
credential: admin.credential.cert({
projectId: "YOUR-PROJECT-ID",
privateKey:
"-----BEGIN PRIVATE KEY-----\nnCHANGE-ME\n-----END PRIVATE KEY-----\n",
clientEmail: "[email protected]",
}),
},
}),
});
const model = new ChatOpenAI({
model: "gpt-4o-mini",
});
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 Reference:
- BufferMemory from
langchain/memory - FirestoreChatMessageHistory from
@langchain/community/stores/message/firestore - ChatOpenAI from
@langchain/openai - ConversationChain from
langchain/chains
嵌套集合
FirestoreChatMessageHistory 类支持嵌套集合以及动态的集合/文档名称。
以下示例展示了如何向具有以下结构的数据库添加和检索消息:
/chats/{chat-id}/bots/{bot-id}/messages/{message-id}
import { BufferMemory } from "langchain/memory";
import { FirestoreChatMessageHistory } from "@langchain/community/stores/message/firestore";
import { ChatOpenAI } from "@langchain/openai";
import { ConversationChain } from "langchain/chains";
import admin from "firebase-admin";
const memory = new BufferMemory({
chatHistory: new FirestoreChatMessageHistory({
collections: ["chats", "bots"],
docs: ["chat-id", "bot-id"],
sessionId: "user-id",
userId: "[email protected]",
config: {
projectId: "YOUR-PROJECT-ID",
credential: admin.credential.cert({
projectId: "YOUR-PROJECT-ID",
privateKey:
"-----BEGIN PRIVATE KEY-----\nnCHANGE-ME\n-----END PRIVATE KEY-----\n",
clientEmail: "[email protected]",
}),
},
}),
});
const model = new ChatOpenAI({
model: "gpt-4o-mini",
});
const chain = new ConversationChain({ llm: model, memory });
const res1 = await chain.invoke({ input: "Hi! I'm Jim." });
console.log({ res1 });
/*
{ res1: { response: 'Hello Jim! How can I assist you today?' } }
*/
const res2 = await chain.invoke({ input: "What did I just say my name was?" });
console.log({ res2 });
/*
{ res2: { response: 'You just said that your name is Jim.' } }
*/
API Reference:
- BufferMemory from
langchain/memory - FirestoreChatMessageHistory from
@langchain/community/stores/message/firestore - ChatOpenAI from
@langchain/openai - ConversationChain from
langchain/chains
Firestore 规则
如果您的集合名称是 "chathistory",您可以按以下方式配置 Firestore 规则:
match /chathistory/{sessionId} {
allow read: if request.auth.uid == resource.data.createdBy;
allow write: if request.auth.uid == request.resource.data.createdBy;
}
match /chathistory/{sessionId}/messages/{messageId} {
allow read: if request.auth.uid == resource.data.createdBy;
allow write: if request.auth.uid == request.resource.data.createdBy;
}