AI 工单(一键工单)- 设计实现偏差问题说明(现状 vs 产品预期)
版本:初版(V0.1,未经产品经理评审,待强哥 review 后修订) 状态:待评审 | 范围:对话端(Chatbot)一键工单 | 关联:6月一键工单方案、6月资产语义底座、7月多模态输入_多轮交互_组件优化_工单防重 | 实现依据:
dify/主智能体.yml、dify/sub-agent/一键工单.yml| 问题定位:Dify 编排实现相对设计文档存在占位缺陷、防幻觉简化与功能缺失
0. 问题清单总览
等级说明:由强哥手动维护优先级,P0(阻断/必须本期解决)> P1(本期应解决)> P2(后续版本/需求点)。未定级时留空。
| # | 问题 | 等级 | 定性 | 处理建议 |
|---|---|---|---|---|
| 1 | 资产实体对齐 query 硬编码「空调」,未用提取的资产名 | P0 | 功能缺陷(占位/接线错误) | 估计是对应 ahu012的后门, 不算问题吧? |
| 2 | 静态选项超集校验缺失,AI 非法选项未被置 missing | P1 | 防幻觉原则简化,依赖后端安检 | 对齐后端安检后定(§3.2) |
| 3 | 工单模板切换(rematch)不保留旧卡片已填字段值 | P2 | 功能缺失 | 暂不处理 |
| 4 | 资产解析 scoreThreshold=0.5,低于 PRD 约定 0.85 | P2 | 阈值偏差,稳定性待实测 | 暂不处理 |
| 5 | 多模态视觉增强模块(压缩/OCR/CoT)未在 Dify 落地 | P1 | 下沉 / 待确认 | 对齐后端后定(§3.5) |
| 6 | 基础输入型长度/数值范围校验缺失(应强制截断) | P1 | 设计简化 | 对齐后端安检(§3.6) |
| 7 | 工单防重(24h 同类进行中)完全未实现 | P2 | 功能缺失(需求点) | 暂不处理 |
| 8 | 图片字段填入数量不按 max_val 截断(超限不丢弃) | P2 | 边界缺陷 | 待整改(§3.8) |
| 9 | businessType / 意图前置胶囊未在 Dify 层传递 | P2 | 设计简化 | 待对齐(§3.9) |
| 10 | 上传大小未按文档三建议调至 20MB | P2 | 配置项 | 部署侧调整(§3.10) |
| 11 | 语音(Voice)ASR 转写文本链路待确认 | P2 | 待确认 | 对齐前端(§3.11) |
1. 问题一句话
一键工单 Dify 子流程相对 PRD 在"资产实体对齐、防幻觉校验、工单切换保留、多模态增强、工单防重"五个能力点上存在占位缺陷、简化与缺失,其中资产解析 query 硬编码为「空调」属明确缺陷(非空调类资产对齐必然失败或错配),部分能力未落地系下沉至后端或需求未排期。
2. 产品预期(PRD 汇总)
按三篇 PRD 的原始定义:
- 架构主线(6月 v2.0):
后端清洗 + AI 提取 + 后端实体对齐 + 后端安检。AI 只做语言提取,真实 ID 转换全部由中台完成;"提交工单必须由人手动点击",AI 不执行最终提交([6月一键工单方案 四、整体系统架构])。 - 动态实体提取型组件(Location / Asset / Device):AI 只从原话截取短语(
enty_extract),后端向量库余弦相似度检索,Score > 0.85 命中回填标准 ID+中文名,< 0.85 标 missing([6月方案 六、字段清洗/词槽填充校验])。 - 静态选项型组件:AI 必须从 options 中挑一模一样的字眼输出;后端校验值是否在 options 内,不在则填 missing(防幻觉核心,[6月方案 六])。
- 基础输入型组件:数值/长度范围校验,超出强制截断([6月方案 六])。
- 工单模板切换(原地重绘):前端将"旧对话 + 旧卡片数据 + 新目标工单类型"发给后端重新提取映射([6月方案 五、前端卡片交互])。
- 可用工单列表:后端按"流程可发起 + AI 配置启用"过滤该用户可发起工单,结合前端意图前置胶囊隐式传参(businessType)提高识别准确度([6月方案 六、判断可发起工单])。
- 多模态输入【P0】:图片/语音上传建单;图片识别走"图片压缩 + 视觉识别增强(探针式指令 / Visual CoT / OCR)+ 文本 OCR",不负责选工单类型,仅视觉→结构化文字→注入词槽;Dify 上传限制建议调至 20MB([7月方案 多模态输入])。
- 多轮交互【P1】6/27 简化版:近三轮文本对话 + 本轮图片 + 本轮音频直接给 AI 重生成卡片;旧卡片信息/图片/音频不传给 AI([7月方案 多轮交互])。
- 工单防重【P2】:开启 AI 防重开关的流程,提交时查 24h 内同类进行中工单 → AI 检索匹配 → 疑似重复弹窗(我要催办 / 查看详情 / 坚持提交)([7月方案 工单防重])。
- 资产语义底座(6月 v1.0):资产向量知识库(别名、权重,默认 0.5),支撑 Asset 型字段实体对齐;
/assets/resolve需在指定空间下检索([6月资产语义底座])。
3. 现状实现与偏差定性
3.1 资产实体对齐 query 硬编码「空调」(P0)
现状 HTTP-资产解析 节点请求体:
{ "query": "空调", "ambiguityMargin": 0.15, "spaceId": "{{space_id}}",
"retrievalSetting": { "topK": 1, "scoreThreshold": 0.5 } }query 硬编码为字面量「空调」,而 提取工单词槽后置格式处理 已从用户话术提取出 asset_name(如"投影仪")并存于 asset_fields。后端实际按"空调"去资产向量库检索:
非空调类资产(投影仪/门锁/地毯…)→ 检索结果为空或错配 → 进入
拼接资产信息的wanted 非空且 asset_result 为空分支,回复"无法找到【投影仪】对应的资产",建单被 clarify 卡死;恰好提"空调"时正常,掩盖缺陷。
与 PRD「enty_extract 作为参数调 URL 模糊匹配」直接冲突([6月方案 六]),属占位/接线遗留。P0,必须整改。
3.2 静态选项超集校验缺失(P1,防幻觉依赖后端安检)
PRD 要求静态选项型"值不在 options 内 → 填 missing"。现状 提取工单词槽后置格式处理(static_select / open_select 单选)在 fill_val 匹配不到 options 时:
if not options_match:
options_match.append({"option_id": None, "option_name": fill_val})即无条件保留 AI 提取的 label(仅 option_id 置空),未按 PRD 置 missing。若后端安检未兜底,AI 输出幻觉选项会以 option_id=None 透传至流程引擎。需与 AIHUB 后端安检确认兜底情况后定级。
3.3 工单模板切换(rematch)不保留旧卡片字段值(P1)
现状支持 rematch:主智能体将前端 payload(含 flowId/workOrderId/flowName/uniqueId)传入,用户输入格式处理 解析后走 判断是否为工单模板切换 → 工单id转换 → 工单字段 → 重新槽提取。但 用户输入格式处理 只解析 flowId/workOrderId/flowName/uniqueId/userFiles/userVoice,未解析旧卡片已填字段值。切换目标工单类型后,原卡片已填内容全部丢失(仅靠 chathistory 里的对话文本兜底)。
与 PRD「前端将旧对话 + 旧卡片数据 + 新目标工单类型发给后端重新提取映射 → 原地重绘」不符([6月方案 五])。注:7月 6/27 简化版对"修改工单"有演进(规则已删),故定 P1 待评审确认。
3.4 资产解析 scoreThreshold=0.5 低于 PRD 0.85(P1)
HTTP-资产解析 与 HTTP-空间解析 均配置 scoreThreshold: 0.5、topK: 1。PRD 明确资产向量库命中阈值 0.85([6月方案 六])。0.5 阈值过宽,存在低相似度资产误命中风险。空间解析 PRD 未约定阈值(0.5 可保留),资产解析需实测对齐。
另:HTTP-空间解析 的 query 用整句用户输入({{query}}),而非 PRD 建议的"原话短语提取",属设计简化(语义检索整句可接受,P2 备注)。
3.5 多模态视觉增强模块未在 Dify 落地(P2,待后端确认)
现状已实现基础多模态:判断是否有上传文件 分流,有文件走 有上传文件工单词槽提取(LLM Qwen3.6-27B,vision enabled: true, detail: high,图片直传模型)。但 PRD【7月 P0】的图片压缩(动态尺度+智能质量)、探针式缺陷指令、Visual CoT 分步推理、OCR(铭牌/房间号)、多图综合结论等增强模块在 Dify 侧均未实现,仅"把图直接喂给模型"。需确认视觉增强模块是否由 AIHUB 后端承担。
3.6 基础输入型长度/数值范围校验缺失(P2)
PRD 要求基础输入型"数值/长度范围校验,超出强制截断"([6月方案 六])。现状 工单字段格式处理 仅做字段降维(i/g/o/d 对照表),提取工单词槽后置格式处理 仅做类型映射,无 minLength/maxLength/数值截断逻辑。依赖后端安检兜底,待确认。
3.7 工单防重完全未实现(P2,需求点)
PRD【7月 P2】工单防重(24h 内同类进行中工单 → AI 检索匹配 → 疑似重复弹窗)在 Dify 两个 yml 中无任何对应节点(无防重 HTTP 调用、无 AI 匹配分支、无"触发防重时禁切换/禁提交"交互态)。记录为未排期需求点。
3.8 图片字段不按 max_val 截断(P2)
提取工单词槽后置格式处理 处理 imageMedia 时:
if max_val > 0 and used_photo_count < len(user_files):
for i in range(len(user_files) - used_photo_count):
picture_fields.append(user_files[i + used_photo_count])将全部剩余图片填入当前字段,未按 valueConstraints.max 截断。PRD【7月】要求"仅 1 个 Pictures → 全部填入,超上限多余丢弃"。当 max_val=2 而用户传 5 张时,会超量填入。
3.9 businessType / 意图前置胶囊未传递(P2)
HTTP-可发起工单列表 请求体 businessType: "" 恒为空。PRD 要求前端意图前置胶囊隐式传参(【工单创建】前缀 + businessType)提高工单类型识别准确度([6月方案 六])。现状 一键工单工作流 tool 参数、用户输入 start 变量中均无 businessType 字段。
3.10 上传大小限制未调至 20MB(P2)
一键工单.yml features:file_size_limit: 15、image_file_size_limit: 10(MB)。PRD【7月】建议 Dify 调大至 20MB(ConfigMap UPLOAD_FILE_SIZE_LIMIT / UPLOAD_IMAGE_FILE_SIZE_LIMIT)。
3.11 语音(Voice)ASR 链路待确认(P2)
features.speech_to_text.enabled: false。audioMedia 字段仅绑定 user_voice(payload.userVoice 原始音频对象);槽提取 LLM 的 prompt 输入为 query + chathistory,未注入 ASR 转写文本。悬浮球语音建单依赖前端 ASR 转文本后作为 query 传入。PRD【7月】Voice = 原始音频 + ASR 转写文本 + 录音时长,ASR 文本应喂给 AI。需确认 ASR 文本是否已由前端/后端注入 query。
4. 测试用例(实测清单)
4.1 资产实体对齐(P0,先复现后整改)
| ID | 输入 | 前置条件 | 设计预期 | 现状预期 | 判定 |
|---|---|---|---|---|---|
| T-AS-01 | "8楼会议室投影仪坏了,帮报修" | 项目含投影仪资产 | 资产回填投影仪标准 ID+名称,正常出卡 | 后端按"空调"检索→无法找到【投影仪】→ clarify 卡死 | 缺陷 |
| T-AS-02 | "东塔10层空调漏水" | 空调资产在案 | 回填空调 ID | 硬编码"空调"恰好命中→正常(掩盖缺陷) | 假阳性 |
| T-AS-03 | "裙楼B2地面裂缝"(无资产诉求) | — | 不触发资产解析,正常出卡 | asset_fields 空→跳过资产解析,正常 | 基线一致 |
4.2 静态选项防幻觉(P1,待后端安检确认)
| ID | 输入 | 前置条件 | 设计预期 | 现状预期 | 判定 |
|---|---|---|---|---|---|
| T-OP-01 | "报修,原因选『管道漏水』" | 故障原因 options 无"管道漏水"(只有"水管爆裂") | 校验失败→该字段 missing(空卡片可编辑) | 保留 option_id=None + 原话 label 透传 | 设计差异 |
| T-OP-02 | "报修,原因『水管爆裂』" | 命中 options | 回填 option_id | 回填 option_id | 基线一致 |
4.3 工单模板切换保留(P1)
| ID | 输入 | 前置条件 | 设计预期 | 现状预期 | 判定 |
|---|---|---|---|---|---|
| T-RE-01 | 已生成"报修"卡(位置/描述已填),语音切换为"保洁"工单 | 前端发 payload 含旧卡片字段 | 旧卡片字段随切换重映射保留可编辑 | 仅对话文本重提,旧值丢失 | 功能缺失 |
| T-RE-02 | 切换目标与源模板字段结构相近 | 同上 | 相同字段值保留 | 需用户在新对话复述 | 功能缺失 |
4.4 资产解析阈值(P1,实测)
| ID | 输入 | 设计预期 | 现状预期 | 判定 |
|---|---|---|---|---|
| T-TH-01 | 相似度 0.5–0.85 之间的资产别名 | 不命中(<0.85 标 missing) | 0.5 阈值命中回填(可能错配) | 设计差异 |
| T-TH-02 | 明确别名(score≈1) | 命中 | 命中 | 基线一致 |
4.5 端到端主链路(7月移动端测试话术 9 条)
对 [7月方案 移动端测试话术] 的 9 条全量跑通验证(覆盖报修/保洁/运送/访客/漏水/门锁/裂缝等),重点观察:含资产诉求的条目("空调漏水"假阳性、"会议室门关不严"等)是否触发 §3.1 缺陷。
5. 整改方向(供评审)
- 资产 query 接线(P0):
HTTP-资产解析的query改为引用asset_name(提取工单词槽后置格式处理已输出),删除硬编码"空调";并校验后端assets/resolve入参契约。 - 静态选项校验(P1):
提取工单词槽后置格式处理中 static_select/open_select 单选,fill_val不在 resolved_options 且 Hub options 非空时,option_id/option_name置 null(等价 missing),把"是否由后端安检兜底"与后端确认后定级。 - rematch 保留旧值(P1):
用户输入格式处理解析 payload 中的旧卡片fields(fieldId→value),rematch 时合并入本次槽提取;或与前端约定"旧值走 payload 传递"。评审是否沿用 7月 6/27 简化版(不保留)。 - 阈值对齐(P1):资产解析
scoreThreshold对齐 PRD 0.85(与后端确认其取值范围与语义),空间解析 0.5 暂保留;实测后定。 - 图片截断(P2):imageMedia 按
max_val截断,超限丢弃并提示。 - businessType(P2):start 增加 businessType 输入,catalog 请求体透传前端意图胶囊参数。
- 上传限制(P2):部署侧将
UPLOAD_FILE_SIZE_LIMIT/UPLOAD_IMAGE_FILE_SIZE_LIMIT调至 20MB。 - 多模态增强 / 防重 / 语音 ASR(P2):与后端确认视觉增强模块归属;工单防重作为独立需求点排期;语音 ASR 链路与前端对齐后补注入。
- 基础输入型校验(P2):与后端确认安检是否覆盖长度/数值截断,若否由 Dify 层或后端补齐。
6. 已决策 / 不纳入项(评审确认后冻结)
| 项 | 决策 | 依据 |
|---|---|---|
| 单模板旁路(sole_work_order_id) | 不算问题,保持现状 | 仅一个可用模板时跳过模板选用 LLM 直连字段接口,为合理优化 |
| 多意图澄清(主智能体) | 不算问题 | 6月 PRD"本期暂不需要澄清",但主智能体已实现多意图澄清,属 7月 P1 演进,超前不冲突 |
| 基准日历注入(date_block) | 不算问题,保持现状 | 相对日(下周X/后天)按日历换算,较 PRD 为增强项 |
| 工单模板选用强制单选 | 保持现状 | PRD"多候选默认选一个,靠前端切换纠正",一致 |
| 空间解析整句 query | 本期不做短语提取 | 整句语义检索可接受;PRD 短语提取为优化项 |
| 图片/语音绑定组件(imageMedia/audioMedia 填值) | 保持现状 | 与 PRD 组件映射一致 |
| 动态实体后端安检(ID 回填、非向量库 URL 模糊匹配) | 属于 AIHUB 后端职责 | PRD 架构将实体对齐/安检下沉至中台,Dify 仅传短语与阈值 |
7. 例外说明
本问题不影响正向主链路:无资产诉求的报修/保洁/运送等建单在"模板选用→字段提取→出卡"行为正确,多轮(近 3 轮 chathistory)与工单切换(rematch)主路径可用。
卡片唯一存活/置灰快照/打断中止/提交按钮等为前端交互,Dify 不涉及(Dify 只产出
reply/action/artifacts结构,前端据此渲染卡片)。已落地且不在本次问题范围:可用工单列表权限过滤(catalog)、字段降维(i/g/o/d 对照表)、空间解析 + 未匹配澄清、LLM 结构化输出(JSON schema)、相对日期基准日历、Vision 多模态基础通道。
多轮支持正常 ✅:主智能体经
准备上下文将最近 3 轮对话(history_text)传入一键工单chathistory,槽提取 LLM 提示词含"历史"且规则 3 支持上下文继承——多轮槽位延续可用。
