5.4 KiB
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 数据结构分离
-
Local Context(局部上下文 / 短期记忆)- 位置:
DeepSeekService和DoubaoService内部。 - 用途: 仅用于维护当前对话的 API 上下文。
- 策略: 严格限制长度(如 20 条)。触发限制时,执行滚动压缩(移除最早记录,保留 System Prompt)。
- 生命周期: 切换模型时,通常意味着上下文切换(可选策略:清空或保留)。
- 位置:
-
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 能否正确触发开门或给道具。