SA 设备控制 - 设计实现偏差问题说明(现状 vs 产品预期)
状态:待评审 | 范围:对话端(Chatbot)设备控制 | 关联:SA 设备控制 Agent 设计(§4.4 跨产品控制推理策略) | 问题定位:① 跨产品兼容控制退化为单产品控制;② 多轮支持未接通(主智能体未传历史)
0. 问题清单总览
等级说明:由强哥手动维护优先级,P0(阻断/必须本期解决)> P1(本期应解决)> P2(后续版本/需求点)。未定级时留空。
文档导航:§2–§6 全部围绕 问题 1(跨产品退化) 这一个缺陷展开;§7 为独立问题 2(多轮支持)。
| # | 问题 | 等级 | 定性 | 处理建议 |
|---|---|---|---|---|
| 1 | 跨产品兼容控制退化为单产品控制(score 最高产品,其余整体丢弃) | P1 | 功能退化 | 跨产品决策交还大模型(§5) |
| 2 | 多轮支持未接通(主智能体未传 chathistory,Slot 提取器历史占位恒空) | P1 | 功能缺失 | 主智能体补传历史(§7.3) |
1. 问题一句话
设备控制存在两项偏差:① 跨产品指令被退化为单产品控制(score 最高的产品,其余整体丢弃);② 多轮支持未接通(主智能体未传历史,Slot 提取器的历史占位恒空,指代类指令无法解析)。
2. 产品预期(PRD §4.4 跨产品推理策略)
按 SA_设备控制_Agent设计.md §4.4,跨产品控制的核心规则:
- 判断目标语义值在各产品中是否存在;
- 全部存在 → 跨产品统一执行;
- 部分存在 → 仅选中支持该语义的产品设备子集;
- 均不存在 → 告知用户不支持并建议替代。
示例一:大金 / 美的空调(语义值映射不同)
两个产品都支持"制热",但物理值不同(大金制热=1 / 美的制热=2)。产品预期是:用户"调到制热模式",两个产品都展示在控制卡片上,各自按映射值下发;若"除湿"仅大金支持,则只展示大金,美的跳过。
示例二:灯 / 灯带(共享同一语义)
灯和灯带是两个不同产品,但共享同一套语义:都具备"照明开关",也都具备"照明亮度"。
- 用户"开灯" → 灯和灯带都应展示,一并开关;
- 用户"调亮一点" → 灯和灯带都应展示,一并调节亮度。
3. 现状实现(单产品退化)
当前 Dify 实现中,设备列表先按检索得分(score)排序,取 score 最高那台设备所属的产品作为唯一目标产品,随后只对该产品下的设备做控制组装,其余产品整体丢弃。
| 步骤 | 行为 |
|---|---|
| 1 | 收集所有匹配目标语义点位的设备(此步灯和灯带都会进来,未丢失) |
| 2 | 按设备检索得分 score 降序 |
| 3 | 取 score 最高那台设备所属的产品作为唯一目标 |
| 4 | 仅保留该产品下的全部设备,另一产品丢弃 |
| 5 | 组装控制列表 |
结果:即使灯和灯带都是用户明确要控制的目标,只要灯带中没有任一设备的得分超过灯的最高分,灯带就被整体丢弃,控制卡片上只出现灯。
4. 偏差定性
| 维度 | 产品预期 | 现状 | 影响 |
|---|---|---|---|
| 跨产品兼容判断 | 由大模型在完整产品上下文里判断(哪些产品支持、值怎么映射) | 代码硬编码为"取单个产品" | 灯+灯带无法同卡片控制 |
| 目标产品筛选 | 支持全部 / 部分产品子集 | 仅保留 score 最高产品的设备 | 多产品场景丢失目标产品 |
| 语义值拆解 | 按各产品映射独立拆解(大金制热=1 / 美的制热=2) | 不做跨产品值拆解 | 无法覆盖异构映射 |
根因:跨产品决策被下沉到代码硬编码为单产品,而非由大模型在完整的设备/产品上下文中做跨产品兼容判断。这与 PRD §4.4 的定位相悖。
5. 整改方向(供评审)
- 跨产品决策交还大模型:让大模型基于完整产品上下文,输出覆盖全部支持产品的目标集合(含各产品映射值),而非代码锁定单产品。
- 移除"取单产品"硬筛:保留所有能匹配目标语义点位的产品设备(无论命中几个产品),按 PRD 规则做全部/部分兼容。
- 与权限可感知过滤联动:整改时一并考虑"部分无权限设备过滤后,剩余产品仍应正常展示"的场景(关联 SA_设备控制_设备数据权限提示需求)。
6. 例外说明
- 本问题不影响单产品场景(用户只控一种产品时行为正确)。
- 本问题与"异构设备逻辑代偿(开关在枚举里)"无关:代偿依赖大模型理解标准语义,Dify 无需额外编排改动。
7. 多轮支持未接通(独立问题,与跨产品退化无关)
等级:由强哥手动维护,未定级时留空。
7.1 现状
- 设备控制工作流
位置设备名称词槽提取(LLM)的用户提示词已预留历史占位:## 历史对话 {{#1779093087495.chathistory#}}; - 但主智能体调用设备控制时,Tool 参数**只传
query、未传chathistory**(对比:会议预定 / 一键工单均传history_text)→ 该子 Agent 的chathistory恒为空,历史占位实际不生效。
影响:多轮指代类指令无法解析。例:用户先说"把 801 的灯打开",再说"把那个空调也调到 18 度"——"那个"依赖上轮上下文(801 空间),设备控制侧因无历史无法继承空间/设备指代,Slot 提取会落空。
7.2 测试用例
| ID | 输入 | 前置条件 | 预期(若支持) | 现状预期 | 判定 |
|---|---|---|---|---|---|
| T-MH-01 | 轮1"把801的灯打开";轮2"那个空调也调到18度" | 同一会话 | 轮2 继承 801 空间,"那个空调"→801 空调 | 轮2 无历史,"那个空调"空间缺失 → 无法解析/澄清 | 功能缺失 |
| T-MH-02 | 轮1"开灯";轮2"太亮了调暗点" | 同一会话 | 轮2 继承上轮设备上下文调亮度 | 轮2 无历史 → 设备槽位缺失 | 功能缺失 |
7.3 整改方向
主智能体设备控制 Tool 参数补传 chathistory: {{#1782500010110.history_text#}}(与会议预定 / 一键工单一致),即可打通 Slot 提取器已预留的历史占位,无需改动设备控制内部编排。
7.4 等级
| 问题 | 等级 |
|---|---|
| 多轮支持未接通(主智能体未传 chathistory) | P1 |
