主题
AI工作流生成
蓝贝AI RPA的核心创新在于AI驱动的工作流自动生成。通过自然语言对话和屏幕节点镜像分析,AI能够理解你的意图并生成可执行的自动化工作流。
🧠 工作原理
端到端流程
mermaid
graph LR
A[用户自然语言] --> B[屏幕节点镜像]
B --> C[后端AI推理]
C --> D[工作流生成]
D --> E[入库保存]
E --> F[执行引擎]
F --> G[自动化完成]
详细步骤:
- 用户输入: 用自然语言描述需求(如"帮我发一条朋友圈")
- 节点采集: Android端采集当前屏幕的无障碍节点树
- 数据压缩: 将节点树压缩为nodesZip格式
- AI推理: 后端调用AI模型,结合Prompt和节点镜像进行推理
- 生成工作流: AI输出步骤序列、选择器、手势参数等
- 校验修正: 验证JSON格式,补充缺省值,优化选择器
- 返回草案: 返回工作流草案(workDraft)和捕获器集合(nodeCats)
- 用户确认: 用户预览并确认工作流
- 入库保存: 持久化到数据库(ei_work表)
- 执行: 通过执行引擎闭环执行
核心技术架构
Android端(rpa-app):
AiChatFloatView
: 对话式悬浮窗,渲染后端下发的UIAiDynamicRenderer
: 多类型控件渲染器AiWorkApi
: 封装后端API调用AiWorkRunner
: 驱动工作流执行
Java后端(ruoyi-fitted):
AiReasonerService
: AI推理主流程PromptBuilder
: 构建System Prompt模板AiModelGateway
: 统一AI模型网关SchemaValidator
: JSON校验与修正DraftMapper
: 映射为EiWork和NodeCats
🎯 三段式选择器
为了精准定位屏幕元素,我们设计了三段式选择器(selector3)机制。
选择器结构
json
{
"selector3": {
"target": {
"resourceId": "com.tencent.mm:id/fp",
"className": "android.widget.Button",
"text": "发表",
"index": 0
},
"must": [
{"text": "发现", "matchMode": "EQ"}
],
"must_not": [
{"text": "查看消息", "matchMode": "EQ"}
]
}
}
三段说明
1. target(目标)
要操作的目标节点,支持多种属性组合:
resourceId
: 资源ID(优先级最高)text
: 文本内容content-desc
: 内容描述className
: 类名index
: 同类节点中的索引bounds
: 边界坐标
2. must(必须存在)
屏幕上必须存在的节点,用于确认当前页面状态:
- 确保在正确的页面
- 避免误操作
- 提高匹配准确性
3. must_not(必须不存在)
屏幕上必须不存在的节点,用于排除错误状态:
- 排除错误页面
- 避免重复操作
- 增强容错能力
匹配模式
模式 | 说明 | 示例 |
---|---|---|
EQ | 完全相等 | text="发表" |
LIKE | 包含匹配 | text包含"发" |
START | 开头匹配 | text以"发"开头 |
END | 结尾匹配 | text以"表"结尾 |
REGEX | 正则匹配 | text匹配"发.*表" |
定位优先级
AI在生成选择器时遵循以下优先级:
resourceId > content-desc > text(EQ) > className+index
原因:
- resourceId: 最稳定,不受语言和版本影响
- content-desc: 为无障碍设计,通常稳定
- text: 可能因语言、版本变化
- className+index: 最不稳定,仅作为最后手段
🤖 AI Prompt工程
System Prompt模板
我们精心设计了System Prompt,确保AI输出符合规范。
核心要点:
你是一个Android RPA自动化专家,负责将用户的自然语言意图转换为可执行的工作流。
输入:
1. 用户意图(promptText)
2. 屏幕节点树(nodesZip,JSON格式)
输出:
1. 工作流标题(workTitle)
2. 应用包名(appPkg)
3. 步骤序列(steps[]),每步包含:
- intent: 步骤意图说明
- action: 操作类型(click/long_click/type/scroll等)
- selector3: 三段式选择器
- verify: 验证条件
- gesturePolicy: 手势策略
- gesture: 手势参数(可选)
- delay/sleep: 延迟参数
- fallback: 备选方案
- confidence: 置信度(0-1)
规则:
1. 优先使用resourceId定位
2. 必要时组合多个条件
3. 添加must/must_not确保页面状态
4. 置信度低于0.7时,返回候选建议(ask[])
5. 输出严格的JSON格式
用户Prompt优化
好的Prompt示例:
✅ "点击微信发现页的朋友圈入口"
✅ "在淘宝搜索框输入'手机壳'并点击搜索"
✅ "向下滑动3次,然后点击第一个商品"
✅ "长按第二条消息,选择删除"
不好的Prompt示例:
❌ "打开朋友圈"(太模糊,不知道当前在哪个页面)
❌ "点一下"(没有说明点击什么)
❌ "做那个操作"(完全不明确)
❌ "帮我"(没有具体需求)
优化技巧:
- 明确当前状态: "在微信首页,点击..."
- 具体目标: "点击右上角的设置图标"
- 完整流程: "先...,然后...,最后..."
- 关键信息: 提供文本、位置、颜色等特征
🔄 多轮对话机制
对话流程
AI支持多轮对话,逐步完善工作流。
示例对话:
[第1轮]
用户: "帮我发朋友圈"
AI: 好的,请问要发布什么内容?
[文字] [图片] [视频]
[第2轮]
用户: 选择[文字]
AI: 请输入要发布的文字内容
[第3轮]
用户: "今天天气真好"
AI: 已生成工作流:
1. 点击"发现"
2. 点击"朋友圈"
3. 点击相机图标
4. 选择"发表文字"
5. 输入"今天天气真好"
6. 点击"发表"
是否确认?[对] [不对]
[第4轮]
用户: [对]
AI: 工作流已保存,是否立即执行?
后端驱动UI
采用后端驱动UI的创新模式,前端仅负责渲染。
UiMessage结构:
json
{
"msgId": "msg_001",
"role": "assistant",
"uiSchema": {
"type": "form",
"controls": [
{
"id": "content_type",
"type": "segmented",
"label": "内容类型",
"options": [
{"value": "text", "label": "文字"},
{"value": "image", "label": "图片"},
{"value": "video", "label": "视频"}
],
"required": true
},
{
"id": "content_text",
"type": "textarea",
"label": "文字内容",
"placeholder": "请输入要发布的内容",
"visibleWhen": "content_type == 'text'"
}
]
}
}
前端回传:
json
{
"sessionId": "session_123",
"msgId": "msg_001",
"formSnapshot": {
"content_type": [{"value": "text"}],
"content_text": [{"value": "今天天气真好"}]
},
"nodesZip": "...",
"verdict": "approve"
}
🎨 手势策略
策略类型
1. prefer_ai(AI优先)
AI直接生成手势参数(坐标、时长等)
json
{
"gesturePolicy": "prefer_ai",
"gesture": {
"x": 540,
"y": 320,
"action": 2,
"duration": 67
}
}
2. server_only(仅服务端)
后端根据bounds自动计算
json
{
"gesturePolicy": "server_only"
}
3. server_fallback(服务端兜底)
AI优先,失败时服务端计算
json
{
"gesturePolicy": "server_fallback",
"gesture": {
"x": 540,
"y": 320
}
}
手势计算
点击手势:
java
// 计算节点中心点
int centerX = (bounds.left + bounds.right) / 2;
int centerY = (bounds.top + bounds.bottom) / 2;
CmdGesture gesture = new CmdGesture();
gesture.setX(centerX);
gesture.setY(centerY);
gesture.setAction(2); // 点击
gesture.setDuration(67); // 毫秒
滑动手势:
java
CmdGesture gesture = new CmdGesture();
gesture.setX(startX);
gesture.setY(startY);
gesture.setX2(endX);
gesture.setY2(endY);
gesture.setAction(3); // 滑动
gesture.setDuration(300);
🛡️ 人审Gating
Verdict机制
每个生成的步骤都需要人工确认。
Verdict类型:
approve
: 通过,锁定该步骤reject
: 不通过,需要修正skip
: 跳过,暂不确认
锁定机制:
json
{
"stepId": "step_001",
"locked": true,
"verdict": "approve",
"lockedAt": "2025-01-15T10:30:00Z"
}
一旦锁定,AI不能自动修改,只能由用户手动解锁。
修正反馈
当用户选择reject
时,可以提供修正建议。
示例:
AI: 步骤2:点击"朋友圈"
[对] [不对]
用户: [不对] + "应该是点击'视频号'"
AI: 收到反馈,已修正:
步骤2:点击"视频号"
[对] [不对]
📊 候选建议
Suggestions机制
当AI不确定时,返回多个候选方案。
返回格式:
json
{
"ask": [
{
"question": "检测到多个可能的目标,请选择:",
"candidates": [
{
"id": "cand_1",
"label": "发表(右上角)",
"selector": {...}
},
{
"id": "cand_2",
"label": "发送(底部)",
"selector": {...}
}
]
}
]
}
用户选择:
json
{
"candidateId": "cand_1"
}
AI根据选择继续生成后续步骤。
🚀 最佳实践
1. 分步描述复杂流程
❌ "帮我在淘宝买一个手机壳"
✅ 分步描述:
- "在淘宝搜索'手机壳'"
- "点击第一个商品"
- "选择颜色和规格"
- "点击立即购买"
- "确认订单信息"
- "提交订单"
2. 提供关键特征
❌ "点击那个按钮"
✅ "点击右上角的蓝色'发表'按钮"
3. 利用多模态输入
- 上传截图标注目标
- 录制短视频演示流程
- 结合文字说明细节
4. 多轮优化
- 第一次生成不理想,继续对话调整
- 利用候选建议选择最佳方案
- 通过人审确认每个关键步骤
5. 测试与迭代
- 生成后先测试执行
- 根据执行结果调整参数
- 保存多个版本对比效果
AI持续进化
我们的AI模型会持续学习和优化,随着使用数据的积累,生成的工作流会越来越准确和智能。