如何在Next.js应用中用Langchain ConversationalRetrievalQA链存储聊天历史
能否用浏览器存储实现LangChain.js聊天机器人的对话内存?
完全可以通过浏览器存储(localStorage 或 sessionStorage)来保存对话历史,替代或补充后端的Redis内存方案,具体实现思路如下:
核心实现步骤
- 前端存储对话历史:每次用户发送消息并收到AI回复后,将对话对存入浏览器存储。建议用数组结构存储,每个元素包含角色和内容信息。
- 请求时携带历史:前端调用
/ask接口时,除了当前问题,把存储的完整对话历史一起传给后端。 - 后端用历史初始化内存:后端不再每次创建全新的内存实例,而是用前端传入的历史对话初始化
BufferMemory或ConversationSummaryMemory,让LLM能访问之前的对话上下文。
代码示例
前端逻辑(Next.js客户端)
// 保存对话到localStorage function saveChatHistory(userMsg, aiMsg) { let history = JSON.parse(localStorage.getItem('docChatHistory')) || []; history.push({ role: 'user', content: userMsg }); history.push({ role: 'assistant', content: aiMsg }); localStorage.setItem('docChatHistory', JSON.stringify(history)); } // 发送问题并携带历史 async function submitQuestion(question) { const chatHistory = JSON.parse(localStorage.getItem('docChatHistory')) || []; const res = await fetch('/api/ask', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ question, chatHistory }) }); const data = await res.json(); saveChatHistory(question, data.answer); return data; }
后端API路由(Next.js /api/ask)
import { BufferMemory, ConversationChain } from "langchain/chains"; import { OpenAI } from "langchain/llms/openai"; export default async function handler(req, res) { const { question, chatHistory } = req.body; // 将前端格式的历史转换为LangChain内存所需的格式 const formattedHistory = chatHistory.map(msg => ({ type: msg.role === 'user' ? 'human' : 'ai', text: msg.content })); // 用历史初始化内存 const memory = new BufferMemory({ chatHistory: formattedHistory }); const llm = new OpenAI({ temperature: 0.7 }); const chain = new ConversationChain({ llm, memory }); const result = await chain.call({ input: question }); res.status(200).json({ answer: result.response }); }
注意事项
- 存储容量限制:
localStorage单域名存储上限约5MB,长对话场景下可能需要做本地历史截断或摘要,避免超出限制。 - 安全风险:浏览器存储是明文的,容易被XSS攻击窃取,不要在对话中包含敏感信息。
- 持久化选择:
localStorage会永久保存(除非用户手动清除),sessionStorage仅在当前标签页会话有效,可根据需求选择。 - 摘要内存适配:如果用
ConversationSummaryMemory,可以让后端生成对话摘要后返回给前端存储,减少前端存储的数据量,同时保留上下文语义。
内容的提问来源于stack exchange,提问作者jasan
相关产品推荐
相关产品推荐

