原始飞书文档:【AI工单】7月多模态输入、多轮交互、组件优化、工单防重作者:龚菲
【AI工单】7月多模态输入、多轮交互、组件优化、工单防重
墨刀原型 #AI-gf-分享
注:此处为飞书文档同步引用块(源文档 token:VyfedKZuEo4FxOxDyFOcwY1zn0b,源块:UPxqdKjigsfPFnbNoTsc1AVMngf)
多模态输入【P0】
目标说明
- 兼容现有流程引擎的自由搭建能力,保留文本、ASR 文本、语音原始文件、图片视频原始文件,将图片视频、语音原始文件适配到Voice、Pictures,不破坏当前“用户手动核对卡片并手动提交”的业务闭环。
- 图片视频需要随着文本、或者有效录音一同上传。
| 组件 | 标识符 | 典型用途 | 本方案映射对象 | 当前组件截图 |
|---|---|---|---|---|
| 语音组件 | Voice | 问题描述、备注、补充说明 | 原始音频文件 + ASR 转写文本 + 录音时长 | |
| 图片组件 | Pictures | 现场图片、报修图片、图片 | 多张图片临时文件 + 顺序 + 缩略图 |
业务流程图

前端交互样式
输入框
| 模式 | 状态2 | 说明 | 截图 |
|---|---|---|---|
| 无图片 | 文本输入 |
| ![]() |
![]() | |||
| 录音输入 |
| ||
| 有图片 | 文本输入 -无输入内容 |
| |
| 文本输入 -有输入内容 -图片未上传成功 |
| ||
| 文本输入 -有输入内容 -图片上传成功 |
| ![]() | |
| 语音输入 -图片未上传成功 |
| ![]() | |
| 语音输入 -图片上传成功 |
|
图片&语音
| 类型 | 说明 | 截图 |
|---|---|---|
| 图片触发方式 |
| |
| 图片暂存区排版 |
| ![]() |
| 图片上传 |
| ![]() |
| 语音输入 |
| ![]() |
多个同类组件时的匹配规则
关于voice的小优化:由于目前voice组件有文本输入框,并且常成为描述组件,所以目前把voice加入webAI配置中,AI会根据内容提炼文本填入Voice文本组件中。
状态 说明 若工单只有 1 个 Pictures 组件 将包内所有图片全部填入,如果超过上限,多余的图片直接省略丢弃。 若工单有 多个 Pictures 组件 - 把图片按序往组件里塞,直到塞满它的上限(比如上限5张)。
- 如果还有多余的图,往第二个图片组件2里塞,直到塞满。
- 依此类推,直到图片分完或者组件全填满。
若工单只有 1 个 Voice 组件 绑定原始语音音频。 若工单有 多个 Voice 组件 - 默认投放: 语音音频填入 Schema 顺序中的第一个组件。
- 其余组件: 保持空置(由用户在卡片内手动点击二次唤起语音录制)。
图片识别方案设计
目标说明
定位:本轮图片识别不负责选工单类型。图片识别的唯一作用是——用户可能只说了一句话(如"水管爆了"),照片里包含了大量文字说不清的信息(哪个设备坏了、多严重、在哪、铭牌编号等),图片识别负责把这些视觉信息变成结构化文字,注入词槽提取流程,丰富工单字段内容。若用户描述与识别结果矛盾(如用户说"空调坏了"但OCR读到"水管"),以用户文本为准.
技术路径已经初步验证,注意点如下
- 模型本身需要支持图片识别、部署的时候需要部署多模态的参数,不要部署只支持文本。目前部署的Qwen3.6-24b支持多模态
- 需要再dify模型供应商里,把模型的视觉支持打开。
- 在配流程节点的时候,注意需要启用视觉的按钮,并且把图片的那个参数配置到视觉的那栏。
- 如果图片压缩处理打算在dify流程用python写,记得需要在dify的values.yaml 文件sandbox 的配置李安库装环境变量,别直接在流程里下载pillow库(pillow是图片处理需要的库)。
业务流程图

图片压缩
图片上传dify有大小限制,因此需要进行两种操作
- 压缩处理:动态尺度缩放+智能质量压缩,多张张图同时压缩,不等前一张完成
- 强制格式统一:将所有图片统一转换为 JPEG 格式(RGB模式),规避透明层或特殊编码导致的解析失败。
- 容错兜底机制:处理失败时自动记录错误原因,并返回原始链接,防止流程彻底中断。
- 调整Dify系统上传限制:默认情况下,Dify 限制上传文件大小为 10MB,我们需要放大点。所以需要在dify本地部署的文件里调整。建议检查ConfigMap里的UPLOAD_FILE_SIZE_LIMIT和UPLOAD_IMAGE_FILE_SIZE_LIMIT字段。建议放大至 20MB
视觉识别增强模块
目标导向的缺陷描述生成
- 解决问题:一个图片可能背景很杂乱,难以捕捉重点,所以需要提示AI可能需要主要关注的场景
- 做法:由于目前可能拍照的工单场景主要是报修、保洁。所以我们可以引导AI对图片进行探针式问询,
- 保洁单指令:强制扫描材质表面、液态反光、边缘缝隙。
- 维修单指令:强制扫描连接处、指示灯、结构形变、铭牌文字。
缺陷分步推理Visual CoT
- 解决问题:有些故障需要"推理"——比如"水管破了",可能先看到地面积水,再追溯是哪里漏的。比如说,如果不加这一步
- 普通输出:厕所漏水。
- Visual CoT 输出:经视觉初步判定,渗漏源位于洗手台下方不锈钢弯管接口处,伴有持续性滴漏,地面已产生约0.5平米积水。
做法:要求AI设计分步流程:
- 实体拆解:先找出图中的物体(门、窗、灯、水管、地面、水龙头、空调、一摊积水等等)
- 状态属性描述:判断每个物体的状态(完好/破损/脏污/不亮/漏水/天花板没有变色或潮湿痕迹/地砖有没有塌陷等)
- 空间与因果推理:将视觉事实串成逻辑链,判断他们之间有什么关系,比如“天花板干燥,排除了楼上漏水的可能。”、“积水位于管接口的正下方。”、“管接口挂着水珠,说明它是渗漏源。”、“根据水迹大小,这属于持续性渗漏。”
- 结论初步描述:根据各个物体的逻辑链关系,最后得出一个逻辑结论描述。
缺陷定位引用
- 解决问题:维修人员拿到工单后,想知道"具体是哪扇门、哪扇窗有问题"。
- 做法:识别缺陷在画面中的坐标,并自动转化为空间位置描述(如:“画面左上角,靠近天花板处”、"左侧第二扇窗户玻璃碎裂")
文本ocr
- 解决问题:工单流程中资产 ID、型号等核心数据录入难、易出错。
- 做法:强制扫描图片中的资产标签、设备铭牌、房间号标牌等含文字的地方。输出文本
多图场景下的逻辑
- 千问3.6支持多张图同时传入,10张图一次调用完成,不拆成多次
- 要求对每张图单独分析后,输出一份综合结论。输出只输出这份综合结论
多轮交互与意图澄清【P1】
想要实现的效果
规则
| 序号 | 规则 | 说明 |
|---|---|---|
| 1 | 卡片唯一存活原则 |
|
| 2 | 穿插闲聊不置灰卡片 |
|
| 3 | 打断与恢复 |
|
|
【6/27 改】根据评审结果,本轮工单暂不设计较重的多轮交互,直接将近三轮的文本对话+本轮的图片+本轮的音频给到AI,由AI自己进行判断是不是工单流程,重新生成渲染工单卡片。旧卡片的信息、图片与音频不会传给AI.
URL组件优化【P0】
| 序号 | 组件 | 数据来源 | 业务是否有该字段筛选 | 优先级 | 是否已完成 | |
|---|---|---|---|---|---|---|
| 1 | 单项选择(配置了url) 级联单选(配置了url) 多项选择(配置了url) 级联多选(配置了url) | 【运维】专业组 | 运维2.0应用-业务配置-专业组配置-专业名称 | 有 | 7月 | |
| 【运维】是否紧急 | 基础服务-数据管理-工单级别(workOrderLevel) | 无 | 7月 | |||
| 【运送】目的科室 | 运送服务应用-业务配置-运送点管理-类型为全部或目的点的运送点名称 | 有 | 7月 | |||
| 【运送】起始科室 | 运送服务应用-业务配置-运送点管理-类型为全部或起始点的运送点名称 | 有 | 7月 | |||
| 【运送】运送类型 | 运送应用-业务配置-运送类型 | 有 | 7月 | |||
| 【运送】运送工具 | 运送应用-业务配置-数据字典-运送工具 | 无 | 7月 | |||
| 【投诉】投诉类型 | 投诉管理应用-业务配置-启用的投诉类型名称 | 有 | 7月 | |||
| 【保洁】保洁组 | 保洁应用-业务配置-保洁人员管理 | 有 | 7月 | |||
| 【运送】运送组 | 运送服务应用-业务配置-运送人员分组 | 有 | 7月 | |||
| 【保洁】保洁类型 | 保洁应用-业务配置-保洁类型 | 有 | 7月 | |||
| 【运送】详细地址 | 基础服务-空间位置 | -- | ||||
| 【保洁】保洁组成员 | 保洁应用-业务配置-保洁人员管理-里面所有保洁组的所有成员 | -- | ||||
| 【NIMBUS】登录login | 用不到 | -- | ||||
| 【运送】运送组人员 | 运送服务应用-业务配置-运送人员分组-里面所有运送小组里面的小组人员 | -- | ||||
| 【报修】专业组成员 | -- | |||||
| 【报修】专业组负责人 | -- | |||||
| 【展品运维】展品名称 | 展品管理应用-展品管理-展品台账里的展品名称 | -- | ||||
| 【保洁】保洁组负责人 | -- | |||||
| 2 | 单用户 | 基础服务-用户管理-成员管理里的成员 | 有 | -- | ||
| 3 | 单部门 | 基础服务-用户管理-成员管理里的部门 | 有 | -- | ||
| 4 | 多用户 | 基础服务-用户管理-成员管理里的成员 | 有 | -- | ||
| 5 | 多部门 | 基础服务-用户管理-成员管理里的部门 | 有 | -- | ||
| 6 | 空间位置 | AI中枢里的空间向量知识库 | 6月 | √ | ||
| 7 | 资产名称 | AI中枢里的资产向量知识库 | 6月 | √ | ||
| 8 | 后勤人员 | -- | ||||
| 9 | 设备名称 | AI中枢里的设备向量知识库 | -- | |||
| 10 | 巡回运送点 | -- | ||||
| 11 | 巡检点 | -- | ||||
| 12 | 巡更点 | -- | ||||
| 13 | 保养点 | -- | ||||
| 14 | 保洁位置 | -- | ||||
| 15 | 展品巡检 | -- | ||||
| 16 | 展品保养 | -- | ||||
| 17 | 备品备件 | -- | ||||
| 18 | 打印耗材 | -- | ||||
工单防重方案设计【P2】
目标说明
- 支持在webAI配置页面,增加一个AI防重开关的按钮,开启后的流程,将进行防重检测校验。如果用户发起的流程开启了这个校验,则会去查询24小时内该类进行中的工单,去进行AI检索匹配,如果发现有相似的工单,则移动端弹出疑似已有类似工单的弹窗。支持继续提交、催办、查看详情等操作。
业务流程图

工单防重交互设计
| 分组 | 类型 | 说明 | 截图 |
|---|---|---|---|
| webAI配置页面 | 增加工单防重检测的开关滑块 |
| ![]() |
| 列表增加工单防重显示字段 |
| ![]() | |
| 移动端 | 发现疑似重复工单弹窗 |
| ![]() |
| 催办效果 |
| ![]() | |
| 查看重复工单详情 |
| ||
| 不是同个问题,坚持提交 |
|
防重逻辑说明
检索的工单来源
- 工单类型:同模版的工单,比如提交的工单是机电报修工单,那防重检索的工单也需要是机电报修工单才行。IT报修工单不会纳入检索。
- 工单状态:需要是未完成 (不包含撤销、终止的工单)
- 创建时间:创建时间在当前时间 - 24 小时内。
- 数据量业务调研:以当前写prd的时间6/5 16:25为例,查询数据量如下所示。除了基本为系统发起的巡检工单外,其它的数量少少的、
| 工单 | 24小时内的工单数量 | 未完成的数量 |
|---|---|---|
| 太湖-报修2.0 | 21 | 0 |
| 太湖-巡检 | 28 | 0 |
| 太湖-运送 | 19 | 0 |
| 苏州科技馆-科技馆访客预约 | 19 | 0 |
| 苏州科技馆-科技馆访客主动预约 | 7 | 0 |
| 体育中心-维修(不确定是不是几类工单混合) | 3 | 3 |
| 体育中心-巡检服务3 | 22 | 22 |
| 体育中心-访客流程 | 1 | 0 |
| 博览中心-维修(不确定是不是几类工单混合) | 3 | 2 |
| 博览中心-巡检服务(机房) | 5 | 5 |
| 狮山广场-巡检 | 181 | 62 |
| 苏州湾-维修 | 1 | 1 |
| 中环妇幼(禧华)-报修 | 2 | 2 |
喂给AI去计算匹配的数据
- 满足筛选条件的工单,把工单创建节点的组件字段给出,只需要给出组件名称、组件值即可。然后把工单卡片的组件名称、组件值,与满足筛选条件的工单组件名称、组件值进行相似度匹配。
- AI 识别为“不重复”:跳过防重弹窗逻辑,直接走提交流程。
- 多条“最像”工单:若 AI 判定有两条工单相似度极高且分值相同,后端返回创建时间最近的那一条。
移动端测试话术
8楼小会议室灯坏了,一闪一闪的,加急找人来修一下
3楼地面有积水,需要人来拖一下
802的电脑打不开,屏幕是黑的。
把会所楼门口的快递搬到总部大楼8层。
明天上午十点到两点,有个李总来总部大楼办业务,给他登记下。
东塔10层空调漏水,把地毯弄湿了,赶紧找人修一下再把水拖了。
8楼北面的会议室门关不严,锁好像坏了。
裙楼B2层的地面有个大裂缝,推车经过很不方便,处理一下。
废弃
多模态的多轮交互
| 场景 | 图片参加识别? | 图片进 Pictures? | 录音进 Voice? |
|---|---|---|---|
| 工单创建 + 本轮发了图/录音 | ✅ 识别 | ✅ | ✅ |
| 工单创建 + 本轮没发 | ❌ 不识别 | ❌ 不进卡片 | ❌ 不进卡片 |
| 工单修改 + 本轮发了新图 | ✅ 识别新图 | ✅ 追加 | ❌ 不进卡片 |
| 工单修改 + 本轮重新录音 | ❌ 不识别 | ❌ 不进卡片 | ✅ 替换旧录音 |
| 闲聊 | ❌ 不识别 | ❌ 不进卡片 | ❌ 不进卡片 |
| 工单创建/修改+上轮发了图/录音 | ❌ 不识别 | ❌ 不进卡片 | ❌ 不进卡片 |
详细业务场景示例
Turn 1: 用户发送 "帮我预定会议室"
→ 走会议室流程
→ 是否存在活跃工单卡片=否
Turn 2:用户发送 "工单的紧急程度改紧急"
→ 走生成工单的流程,输入=Turn1+Turn2
→ 生成 card_v1
→ 是否存在活跃工单卡片=是
Turn 3:用户自己手动修改组件点击提交按钮
→ 提交工单
→ 是否存在活跃工单卡片=否
Turn 4:用户长按录音发送 "今天天气太冷了,水结冰了" + [图A, 图B, 图C]
→ 没走到工单流程,走了闲聊之类的意图
→ 是否存在活跃工单卡片=否
Turn 5: 用户长按录音发送 "水结冰所以水管爆了,帮我建个紧急报修工单啊"
→ 走生成工单的流程,输入=Turn4+Turn5
→ 前端输入框图片暂存区清空
→ 生成 card_v2
→ 工单的picture组件里附加图片,Pictures = [图A, 图B, 图C],
→ 工单的Voice组件里附加音频Turn5
→ 是否存在活跃工单卡片=是
Turn 6:用户长按录音发送 "位置是二楼" (无新图片)
→ 走更改工单的流程,输入=Turn6+card_v2
→ 基于card_v2,修改用户要改的数据,生成 card_v3.
→ 除要改数据外,其它字段基本继承旧工单,Pictures 继承 = [图A, 图B, 图C]
→ 工单的Voice组件里附加音频Turn6
→ card_v2置灰
→ 是否存在活跃工单卡片=是
Turn 7:用户文本发送 "再加一张图" + [图D]
→ 走更改工单的流程,输入=Turn7+card_v3
→ 基于card_v3,修改用户要改的数据,生成 card_v4.
→ 其它字段继承旧工单,Pictures 继承再加入一张图 = [图A, 图B, 图C,图D]
→ 工单的Voice组件里继承音频Turn6
→ card_v3置灰
→ 是否存在活跃工单卡片=是
Turn 8:用户点击提交按钮
→ 提交工单
→ 是否存在活跃工单卡片=否










