b123a36aae
后端修复: - main.go: 恢复 /api/v1/chat 路由中丢失的 handleChat 调用 (空响应回归) - orchestrator.go: splitChatByLines 改为双换行分割, 避免单换行误拆 - chat_handler.go: multi_message 增加 !hasReview 守卫, 消息延迟 200→800ms - thinker.go: RecordUserMessage 追踪活跃会话ID, 推送主动消息到正确会话 - thinker.go: 增强思考提示词 — 禁止在用户休息/离开时发送主动消息 前端修复: - useWebSocket.ts: stream_segments 不再创建消息气泡, 消除重复回复 - MessageBubble.tsx: 动作消息居左对齐无头像, 时间戳移至气泡外侧 hover 显示 - ChatInput.tsx: 昔涟输入提示移至输入框上方, 波点动画效果 - MessageList/TypingIndicator/ChatContainer: 清理冗余 isTyping 传递 - MemoryPanel.tsx: 新增记忆面板组件 文档重整: - docs/debug/ → docs/debug_log/ 重命名统一 - 新增 debug_log/README.md 索引 - .gitignore: 新增 android/ 排除规则 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
7.1 KiB
7.1 KiB
Cyrene 第四轮修复报告 — IoT 操控 + Review Pipeline + 速度优化
报告日期:2026-05-22
覆盖周期:2026-05-22 (UTC+8)
分支:dev
涉及文件数:9 个
E2E 测试:全部通过
一、修复项总览
| # | 类别 | 问题 | 涉及核心文件 |
|---|---|---|---|
| 1 | 🔴 功能 | IoT 设备操控 — 多设备命令支持 + Persona 路径 | iot_provider.go, main.go |
| 2 | 🟡 功能 | Review Pipeline — 主会话输出解析为 action/chat 消息 | orchestrator.go, chat_handler.go |
| 3 | 🟡 功能 | 前端 action 消息显示 + msgType 历史映射 | protocol.go, hub.go, sessionStore.ts |
| 4 | 🟢 优化 | 对话链路速度优化 — IoT 快速通道 + 简单消息跳过子会话 | intent_analyzer.go, orchestrator.go |
| 5 | 🟢 优化 | Persona 注入 action 格式指令 | injector.go |
二、详细修复说明
2.1 IoT 多设备命令支持 + Persona 路径修复
问题:
- IoT 子会话
Execute()在匹配到第一个设备后立即return,导致"打开客厅灯和卧室灯"只执行第一个 NewIoTProvider未接收personaDir参数,persona 配置加载始终使用空路径
修复:
iot_provider.go— 完全重写Execute()函数:先收集所有设备-操作匹配对,再批量执行iot_provider.go—IoTProvider结构体新增personaDir字段,NewIoTProvider接收参数main.go— 注册 IoT provider 时传入personaDir
关键代码(Execute 多设备收集逻辑):
type deviceAction struct {
dev tools.IoTDevice
operation string // "on" | "off" | "query"
}
var actions []deviceAction
for _, dev := range devices {
// 匹配设备名 + 上下文意图词
// 收集所有匹配的 action
}
// 批量执行所有 action,合并 summaries
2.2 Review Pipeline — 内联解析
问题:主会话 LLM 输出需要拆分为 action 消息(描述操作)+ chat 消息(对话文本),前端分别渲染
修复:
orchestrator.go— 新增parseReviewMessages()函数:无正则括号匹配状态机,支持()和()orchestrator.go— 新增splitReviewLongMessage()函数:80 字符智能断句,在句子边界处分割orchestrator.go— 合成完成后自动调用审查,发送StreamReview事件chat_handler.go— SSE 解析review_messages字段,逐条发送 WebSocket response(action 消息 200ms 间隔)protocol.go— 新增ReviewMessage结构体 +ServerMessage.MsgType字段hub.go—Message结构体新增MsgType字段
消息格式约定:
(动作描述) 对话文本→ action 消息(角色action,类型action)+ chat 消息(角色assistant,类型chat)- 括号支持半角
()和全角() - 长 chat 消息自动在 80 字符处按句子边界拆分
2.3 前端 action 消息显示
修复:
sessionStore.ts— 历史消息加载时映射msg_type字段,action类型消息使用action角色
2.4 对话速度优化
问题:每条消息都需要 2-3 秒 LLM 意图分析 + 所有子会话调度
修复:
intent_analyzer.go— 新增isStrongIoTCommand():控制词 + 设备词同时出现时跳过 LLM 分析,直接使用关键词规则(节省 2-3s)intent_analyzer.go— 简单问候的快速通道已存在(精确匹配 + ≤4 字符消息)orchestrator.go— 快速通道扩展:primary=greeting或(primary=chat && !needsIoT && !needsMemory)时跳过所有子会话分派orchestrator.go— 子会话结果等待超时从 500ms 降至 200ms
2.5 Persona action 格式指令
修复:
injector.go— 在对话风格指令中新增:- 执行操作时(开关设备、查询状态等),用括号包裹动作描述,后面跟自然对话。 例如:"(帮你把客厅灯关掉啦) 嗯,已经关好了~"
三、E2E 验证结果
测试场景 1:IoT 设备操控
输入:帮我把卧室空调打开
输出:
[ACTION] "指尖轻点,空调立刻嗡鸣启动"
[CHAT] "好啦,已经让卧室凉快下来啦~♪..."
后端日志:
[IoT-client] ✅ 切换设备成功: ac-bedroom
[iot-subsession] 执行操作: 打开 卧室空调 (ac-bedroom)
设备状态:ac-bedroom: off → on ✅
测试场景 2:Review Pipeline 消息拆分
输入:帮我把客厅灯打开
输出:
[ACTION] "轻轻感应了一下忆庭对客厅灯的投影"
[CHAT] "嗯...叶酱,客厅灯现在是开着的哦?刚才是不是工作太忙,有点眼花啦♪"
后端日志:
[orchestrator] 审查完成: 2 条带类型消息 ✅
测试场景 3:简单问候快速通道
输入:你好呀
输出:
[CHAT] "诶嘿,叶酱今天主动跟人家打招呼了♪"
[ACTION] "笑着晃了晃食指"
[CHAT] "让我猜猜...是不是有好事要跟姐姐分享呀?"
后端日志:
[intent] 快速通道: 检测到简单问候,跳过 LLM 分析
[orchestrator] 快速通道: 简单消息(primary=greeting),跳过子会话分派
意图分析耗时: 0s ✅
测试场景 4:IoT 快速通道
输入:帮我把卧室空调打开
后端日志:
[intent] 快速通道: 检测到 IoT 操控命令,跳过 LLM 分析
意图分析耗时: 0s ✅
四、性能对比
| 场景 | 修复前 | 修复后 | 节省 |
|---|---|---|---|
| IoT 命令 | ~6s (LLM意图2-3s + 子会话 + 合成) | ~3.4s (跳过LLM意图) | ~2.6s |
| 简单问候 | ~5s (LLM意图 + 子会话) | ~3.9s (跳过LLM意图 + 跳过子会话) | ~1.1s |
| 一般聊天 | ~5s | ~4s (仅合成) | ~1s |
五、涉及文件清单
| 文件 | 变更类型 | 说明 |
|---|---|---|
backend/ai-core/cmd/main.go |
修改 | 传递 personaDir 给 NewIoTProvider |
backend/ai-core/internal/orchestrator/intent_analyzer.go |
修改 | 新增 isStrongIoTCommand 快速通道 |
backend/ai-core/internal/orchestrator/orchestrator.go |
修改 | parseReviewMessages + 快速通道扩展 + 超时优化 |
backend/ai-core/internal/persona/injector.go |
修改 | 对话风格新增 action 格式指令 |
backend/ai-core/internal/subsession/iot_provider.go |
修改 | 多设备支持 + persona 路径修复 |
backend/gateway/internal/handler/chat_handler.go |
修改 | SSE review_messages 解析 → WebSocket 转发 |
backend/gateway/internal/ws/protocol.go |
修改 | 新增 ReviewMessage 结构体 + MsgType 字段 |
backend/gateway/internal/ws/hub.go |
修改 | Message 结构体新增 MsgType 字段 |
frontend/web/src/store/sessionStore.ts |
修改 | 历史消息 msg_type 映射 |