Skip to content

AI工作流生成

蓝贝AI RPA的核心创新在于AI驱动的工作流自动生成。通过自然语言对话和屏幕节点镜像分析,AI能够理解你的意图并生成可执行的自动化工作流。

🧠 工作原理

端到端流程

mermaid
graph LR
    A[用户自然语言] --> B[屏幕节点镜像]
    B --> C[后端AI推理]
    C --> D[工作流生成]
    D --> E[入库保存]
    E --> F[执行引擎]
    F --> G[自动化完成]

详细步骤:

  1. 用户输入: 用自然语言描述需求(如"帮我发一条朋友圈")
  2. 节点采集: Android端采集当前屏幕的无障碍节点树
  3. 数据压缩: 将节点树压缩为nodesZip格式
  4. AI推理: 后端调用AI模型,结合Prompt和节点镜像进行推理
  5. 生成工作流: AI输出步骤序列、选择器、手势参数等
  6. 校验修正: 验证JSON格式,补充缺省值,优化选择器
  7. 返回草案: 返回工作流草案(workDraft)和捕获器集合(nodeCats)
  8. 用户确认: 用户预览并确认工作流
  9. 入库保存: 持久化到数据库(ei_work表)
  10. 执行: 通过执行引擎闭环执行

核心技术架构

Android端(rpa-app):

  • AiChatFloatView: 对话式悬浮窗,渲染后端下发的UI
  • AiDynamicRenderer: 多类型控件渲染器
  • 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

原因:

  1. resourceId: 最稳定,不受语言和版本影响
  2. content-desc: 为无障碍设计,通常稳定
  3. text: 可能因语言、版本变化
  4. 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示例:

❌ "打开朋友圈"(太模糊,不知道当前在哪个页面)
❌ "点一下"(没有说明点击什么)
❌ "做那个操作"(完全不明确)
❌ "帮我"(没有具体需求)

优化技巧:

  1. 明确当前状态: "在微信首页,点击..."
  2. 具体目标: "点击右上角的设置图标"
  3. 完整流程: "先...,然后...,最后..."
  4. 关键信息: 提供文本、位置、颜色等特征

🔄 多轮对话机制

对话流程

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. 分步描述复杂流程

❌ "帮我在淘宝买一个手机壳"

✅ 分步描述:

  1. "在淘宝搜索'手机壳'"
  2. "点击第一个商品"
  3. "选择颜色和规格"
  4. "点击立即购买"
  5. "确认订单信息"
  6. "提交订单"

2. 提供关键特征

❌ "点击那个按钮"

✅ "点击右上角的蓝色'发表'按钮"

3. 利用多模态输入

  • 上传截图标注目标
  • 录制短视频演示流程
  • 结合文字说明细节

4. 多轮优化

  • 第一次生成不理想,继续对话调整
  • 利用候选建议选择最佳方案
  • 通过人审确认每个关键步骤

5. 测试与迭代

  • 生成后先测试执行
  • 根据执行结果调整参数
  • 保存多个版本对比效果

AI持续进化

我们的AI模型会持续学习和优化,随着使用数据的积累,生成的工作流会越来越准确和智能。

粤ICP备18141372号