You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:22:21