如何存储AI聊天历史记录

605 阅读4分钟

如何存储AI聊天历史记录

一、为什么要存储存储AI聊天历史记录?

为了提升用户体验,这是最直接、最重要的原因。

  1. 保持对话连续性(上下文记忆)

    • 用户希望 AI 能“记住”之前的对话内容。
    • 例如:用户先问“React 是什么?”,接着问“它和 Vue 有什么区别?”——AI 需要知道“它”指的是 React。
    • 存储历史 = 让 AI 有“短期记忆”。
  2. 支持“接着聊”功能

    • 用户关闭页面后重新打开,仍能看到之前的聊天记录。
    • 类似微信、钉钉等即时通讯工具的体验。
  3. 个性化交互

    • 基于用户历史提问偏好,提供更贴心的回答。

    • 例如:用户多次问前端问题,AI 可默认以“前端开发者”视角回答。

二、前端如何处理聊天历史?

会话内临时存储:使用组件状态或状态管理
  • 使用 React 的 useStateuseReducerRedux / Zustand 等状态管理工具维护当前会话的聊天记录。
  • 优点:响应快,无需频繁请求后端。
  • 场景:页面刷新前的交互、实时对话展示。

示例:“在单次会话中,我会用 Zustand 管理聊天消息列表,确保 UI 响应流畅。”

跨会话持久化:利用浏览器本地存储
  • localStorage:适合存储用户近期的聊天摘要或会话ID。
  • IndexedDB:适合存储较大量的结构化聊天内容(如完整对话、时间戳、角色等)。
  • 可结合 Service Worker 实现离线访问部分历史。

示例:“如果产品允许用户‘记住我的聊天记录’,我会将加密后的会话摘要存入 IndexedDB,并设置过期时间。”

用户控制与隐私设计(重点!)
  • 提供 UI 按钮:“清除本地记录”、“不保存本次对话”。
  • 首次使用时弹出提示:“我们是否会保存您的聊天记录?” + 隐私链接。
  • 支持“无痕模式”:用户可选择本次对话不存储任何信息。

示例:“我会在设置页提供‘清除聊天历史’按钮,点击后不仅清空 localStorage,还会调用后端 API 删除服务器记录(如已登录)。”

与后端的协作方式

  • 前端在用户登录后,通过 API 拉取历史记录(如 /api/chat/history)。
  • 发送新消息时,前端将消息计入本地状态,同时异步提交给后端保存。
  • 使用 WebSocket 或 SSE 保持实时同步。

示例:“用户登录后,前端会根据 user_id 请求历史记录,并合并到本地状态,实现‘接着聊’的体验。”

三、优化系统性能与成本

虽然看似矛盾,但合理存储反而能降低长期成本

  1. 避免重复提问

    • 如果用户反复问相同问题,系统可直接从缓存返回结果,减少调用大模型的次数。
  2. 摘要式记忆(如你代码中的 summary

    • 不存储全部原始对话,而是定期生成“对话摘要”
    • 后续请求只需传摘要 + 最近几轮消息,节省 token,降低成本。

    实现代码

    import OpenAI from "openai";
    import { config } from "dotenv";
    config();
    // 创建一个对话
    const client = new OpenAI({
      apiKey: process.env.OPENAI_API_KEY,
    });
    
    // 使用一个变量来缓存总结的上下文对象
    let summary = "用户的基本信息:";
    const messages = [
      {
        role: "system",
        content: "你是一个友好的助教",
      },
    ];
    // 没有缓存上下文对话的时候
    async function useMemoryChat(userInput) {
      messages.push({
        role: "user",
        content: userInput,
      }); // 放入缓存中
    
      // 若对话过长,则进行整合
      if (messages.length >= 10) {
        const toRes = await client.chat.completions.create({
          model: "gpt-3.5-turbo",
          messages: [
            { role: "system", content: "请总结一下对话的关键信息" },
            ...messages,
          ],
        });
        summary += toRes.choices[0].message.content;
        messages.splice(0, messages.length); // 清空老聊天记录
      }
    
      const res = await client.chat.completions.create({
        model: "gpt-3.5-turbo",
        messages: [
          {
            role: "system",
            content: `你是一个助教,这是目前的总结:${summary}`,
          },
          ...messages,
        ],
      });
      // 获取相应,保存数据到缓存中
      const reply = res.choices[0].message.content;
      messages.push({
        role: "assistant",
        content: reply,
      });
    
      console.log("AI reply", reply);
    }
    useMemoryChat();
    
    
  3. 本地缓存减少请求

    • 前端用 localStorageIndexedDB 缓存最近记录,减少后端请求频率。

四、安全与合规注意事项

  • 不在 localStorage 中明文存储敏感内容(可做简单混淆或只存摘要)。
  • 使用 HTTPS 防止传输泄露。
  • 遵循同源策略,避免 XSS 导致数据被盗。
  • 支持 GDPR/CCPA:提供“导出数据”、“删除账户”等入口。