Files

105 lines
5.4 KiB
Markdown
Raw Permalink Normal View History

2026-07-08 19:53:15 +08:00
# 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<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 性能与功能
- [x] 修改 `TabletController.cs`,实现 UI 气泡数量限制(自动销毁旧气泡)。
- [x]`TabletController` 或独立脚本 `ChatHistoryPanelController` 中制作“历史记录面板” (History Panel) 的逻辑。
### 阶段四:AI 互动与 Function Calling
- [ ] 制定 AI 指令协议(Prompt 与 格式)。
- [ ]`LLMChatManager` 中编写指令解析器。
- [ ] 连接游戏系统(如 Inventory, DoorController)。
- [ ] 测试 AI 能否正确触发开门或给道具。