Files
Echo/Assets/_Project/Docs/chat_system_optimization_plan.md
T
2026-07-08 20:42:51 +08:00

5.4 KiB

DeepSeek & Doubao 对话系统优化计划 (Multi-Provider 版)

1. 核心痛点与需求分析

1.1 现状问题

  • API 上下文限制: 无论是 DeepSeek 还是 Doubao,无限增长的 messageHistory 都会导致 Token 超限或费用激增。
  • 数据持久化缺失: 重启游戏后,玩家与 AI 的所有交互记录都会丢失。
  • UI 性能隐忧: TabletController 中的聊天气泡若无限增加,会导致渲染卡顿。
  • 多模型架构: 现已引入 LLMChatManager 管理 DeepSeek 和 Doubao,优化方案必须适配这种多服务架构。

1.2 用户新需求

  • 滚动压缩: 在服务内部控制发送给 API 的上下文长度。
  • 全局存档: 无论切换哪个 AI 模型,对话历史都应被统一保存和回看。
  • UI 优化: 聊天框只显示最近消息,但提供“查看完整历史”的功能。
  • Function Calling (AI 互动控制): 让 AI 能够通过调用游戏内的特定函数来控制环境(如开灯、开门、发放道具等)。

2. 架构设计:全局存档 + 局部上下文 + Function Calling

为了适配多模型架构,我们将数据职责分离:

2.1 数据结构分离

  1. Local Context (局部上下文 / 短期记忆)

    • 位置: DeepSeekServiceDoubaoService 内部。
    • 用途: 仅用于维护当前对话的 API 上下文。
    • 策略: 严格限制长度(如 20 条)。触发限制时,执行滚动压缩(移除最早记录,保留 System Prompt)。
    • 生命周期: 切换模型时,通常意味着上下文切换(可选策略:清空或保留)。
  2. Global Chat Log (全局存档 / 长期记忆)

    • 位置: LLMChatManager 或新建 ChatHistoryManager
    • 用途: 记录玩家在游戏中产生的所有对话(User + Any AI)。
    • 策略: 只增不减,负责序列化保存到本地 JSON。
    • 生命周期: 贯穿整个游戏存档。

2.2 UI 显示与性能优化策略 (TabletController)

  • 主聊天窗口 (Active UI):
    • 仅显示最近 N 条消息(例如 50 条)。
    • 当新消息生成时,若 UI 子物体过多,销毁最旧的消息对象。
  • 历史记录功能 (History Viewer):
    • 触发: 平板界面上的“历史记录”按钮。
    • 数据源: 读取 Global Chat Log
    • 显示: 在独立面板中展示完整对话。

2.3 Function Calling (AI 互动)

  • 目标: 允许 AI 通过输出特定的格式(如 JSON 或 特殊标记)来触发游戏内的行为。
  • 实现方式:
    • 定义一套 Command 协议(例如 [CMD:OpenDoor(ID=1)])。
    • LLMChatManager 中解析 AI 的回复内容。
    • 如果包含命令,拦截该部分内容并执行对应的 C# 方法,仅将文本部分显示给玩家。

3. 详细实施方案

3.1 LLM 服务层改造 (DeepSeekService.cs / DoubaoService.cs)

  • 目标: 实现上下文修剪 (Context Trimming)。
  • 修改:
    • 引入 maxContextLength 变量。
    • SendMessage 流程中,在添加到 messageHistory 后调用 TrimHistory()
    • TrimHistory() 逻辑:保留 Index 0 (System Prompt),移除 Index 1+ 的旧消息,直到 Count <= maxContextLength。

3.2 管理层改造 (LLMChatManager.cs)

  • 目标: 实现全局日志记录与存档。
  • 修改:
    • 新增 public List<Message> fullChatLog
    • 新增 SaveChatHistory()LoadChatHistory()
    • 事件监听: 当 SendUserMessage 被调用或回调返回时,将内容追加到 fullChatLog 并触发自动保存。

3.3 UI 层改造 (TabletController.cs)

  • 目标: UI 缓冲管理与历史查看。
  • 修改:
    • AddMessageToUI: 检查 chatContent 子物体数量,超过阈值则 Destroy 顶部子物体。
    • 新增 ShowHistoryPanel(): 打开新面板,根据 LLMChatManager.fullChatLog 实例化所有历史消息。

3.4 AI 互动系统 (Function Calling)

  • Prompt 调整: 更新 System Prompt,告知 AI 它可以使用 [CMD:xxx] 格式来执行动作。
  • Command Parser:
    • LLMChatManager 中实现正则匹配 \[CMD:(.*?)\]
    • 构建 CommandRegistry,将字符串映射到 UnityAction 或具体函数。
    • 示例: [CMD:GiveItem(Key)] -> InventorySystem.AddItem("Key")

4. 任务清单 (Todo List)

阶段一:服务层上下文优化

  • 修改 DeepSeekService.cs,实现 TrimHistory 逻辑。
  • 修改 DoubaoService.cs,实现 TrimHistory 逻辑。
  • 验证 API 请求体长度是否受控。

阶段二:全局存档系统

  • 修改 LLMChatManager.cs,添加 fullChatLog 列表。
  • 实现 JSON 存档/读档功能 (Save/Load)。
  • Start 中加载历史,在对话发生时追加记录并保存。

阶段三:UI 性能与功能

  • 修改 TabletController.cs,实现 UI 气泡数量限制(自动销毁旧气泡)。
  • TabletController 或独立脚本 ChatHistoryPanelController 中制作“历史记录面板” (History Panel) 的逻辑。

阶段四:AI 互动与 Function Calling

  • 制定 AI 指令协议(Prompt 与 格式)。
  • LLMChatManager 中编写指令解析器。
  • 连接游戏系统(如 Inventory, DoorController)。
  • 测试 AI 能否正确触发开门或给道具。