105 lines
5.4 KiB
Markdown
105 lines
5.4 KiB
Markdown
|
|
# 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 能否正确触发开门或给道具。
|