Files
Cyrene/docs/debug_log/2026-05-22-round5-iot-edge-cases.md
T
AskaEth b123a36aae fix: 第四轮调试 — 回复去重/消息时序/UI布局/自主思考深度优化 + 文档重整
后端修复:
- 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>
2026-05-23 13:09:18 +08:00

90 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Cyrene 第五轮修复报告 — IoT 边界情况 + 快速通道完善
> **报告日期**2026-05-22
> **分支**`dev`
> **涉及文件数**2 个
> **E2E 测试**:全部通过
---
## 一、修复项
| # | 类别 | 问题 | 涉及文件 |
|---|------|------|---------|
| 1 | 🟡 功能 | IoT 快速通道遗漏 "关掉"/"关上" 关键词 | [`intent_analyzer.go`](backend/ai-core/internal/orchestrator/intent_analyzer.go) |
| 2 | 🟡 功能 | IoT 多设备命令上下文窗口过小(±15字节) | [`iot_provider.go`](backend/ai-core/internal/subsession/iot_provider.go) |
---
## 二、详细说明
### 2.1 IoT 快速通道关键词补充
**问题**`isStrongIoTCommand()` 的控制词列表缺少 "关掉"、"关上",导致 "关掉客厅灯" 等常见命令无法命中快速通道,浪费 2-3s LLM 意图分析。
**修复**:在 `controlWords` 中新增 `"关掉"`, `"关上"`
```
修复前: controlWords := []string{"打开", "关闭", "调到", "设置", ...}
修复后: controlWords := []string{"打开", "关闭", "关掉", "关上", "调到", "设置", ...}
```
**验证**
```
"关掉客厅灯" → 修复前: LLM路径 5.12s → 修复后: 快速通道 2.57s (节省 2.55s)
```
### 2.2 IoT 多设备上下文窗口扩展
**问题**:多设备命令如 "帮我把卧室灯和卧室空调都关掉" 中,"卧室灯" 与 "关掉" 之间间隔超过 15 字节,导致操作判断错误(将 "off" 误判为 "query"),设备未被实际控制。
**根因分析**
```
msgLower = "帮我把卧室灯和卧室空调都关掉" (42 bytes)
"卧室灯" 起始偏移 = 9
contextEnd = 9 + 9 + 15 = 33
nearbyContext = msgLower[0:33] = "帮我把卧室灯和卧室空调" ← 缺少 "都关掉"!
```
**修复**
1. 上下文窗口从 ±15 扩展至 ±30 字节
2. 新增全文回退逻辑:附近上下文无法判断时,搜索整条消息
3. 调整判断逻辑为先计算 `hasOpen`/`hasClose` 布尔值,避免级联 if-else 误判
**验证**
```
"帮我把卧室灯和卧室空调都关掉" →
修复前: IoT 子会话完成: 卧室灯当前状态: on; 已帮你关闭卧室空调~ (灯仅查询,未关闭)
修复后: IoT 子会话完成: 卧室空调已经是关闭状态啦~; 已帮你关闭卧室灯~ (两个设备都正确匹配)
```
---
## 三、E2E 验证
| 场景 | 输入 | 预期 | 结果 |
|------|------|------|------|
| "关掉" 快速通道 | 关掉客厅灯 | fast path, <3s | 2.57s, fast path ✅ |
| 多设备打开 | 打开客厅灯和卧室灯 | 两设备均匹配 | 已帮你打开客厅灯♪; 卧室灯已经是打开状态啦~ ✅ |
| 多设备关闭 | 帮我把卧室灯和卧室空调都关掉 | 两设备均 match "off" | 卧室空调关闭 + 已帮你关闭卧室灯~ ✅ |
| 设备状态查询 | 看看家里设备状态怎么样 | 返回全部设备 | 家里设备状态:8 台设备 ✅ |
| 长消息拆分 | 讲星星故事 | action + 多段 chat | 1 action + 2 chat (69+16 chars at sentence break) ✅ |
| 审查消息格式 | 所有场景 | action/chat 分离 | msg_type 正确 ✅ |
---
## 四、构建流程修正
本次调试中发现 DevTools 构建产物名为 `main.exe` 而非 `ai-core.exe`。后续所有编译应通过 DevTools 的 `/api/services/:id/build` 接口执行,避免手动构建到错误文件名。
---
## 五、性能总结
| 场景 | Round 4 | Round 5 | 改善 |
|------|---------|---------|------|
| "打开" IoT 命令 | ~3.4s | ~2.6s | -0.8s |
| "关掉" IoT 命令 | ~6.2s (LLM路径) | ~2.6s (快速通道) | -3.6s |
| 多设备 IoT 命令 | 仅执行第一个 | 全部执行 | 功能修复 |
| 一般聊天 | ~3.9s | ~3.9s | 持平 |