# 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` (局部上下文 / 短期记忆)** * **位置**: `DeepSeekService` 和 `DoubaoService` 内部。 * **用途**: 仅用于维护当前对话的 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 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 性能与功能 - [x] 修改 `TabletController.cs`,实现 UI 气泡数量限制(自动销毁旧气泡)。 - [x] 在 `TabletController` 或独立脚本 `ChatHistoryPanelController` 中制作“历史记录面板” (History Panel) 的逻辑。 ### 阶段四:AI 互动与 Function Calling - [ ] 制定 AI 指令协议(Prompt 与 格式)。 - [ ] 在 `LLMChatManager` 中编写指令解析器。 - [ ] 连接游戏系统(如 Inventory, DoorController)。 - [ ] 测试 AI 能否正确触发开门或给道具。