1. 项目概述:当“教练”遇上安卓自动化
最近在折腾一个挺有意思的项目,我把它叫做Android Coach。这个名字听起来有点玄乎,但核心目标很直接:提升安卓平台上在线智能体(Agent)训练的效率。如果你玩过强化学习(RL),或者接触过自动化测试、游戏脚本,大概能明白我在说什么。传统的在线训练,智能体在模拟器或真机里,一次只能执行一个动作,然后等待环境反馈(新的状态和奖励),再决定下一个动作。这个过程,尤其是在安卓这种交互复杂、响应延迟不稳定的环境里,效率瓶颈非常明显。
想象一下,你教一个新手在手机上完成“打开微信->找到群聊->发送特定消息”这一系列操作。传统方法就像你站在他身后,每等他点一下屏幕,你就喊“对”或“错”,然后他再点下一个地方。而Android Coach想做的,是让这个“教练”能一次性给出多个可能的后续操作建议(比如“点这里”、“或者滑到下面点那个”、“再或者直接搜索”),并让智能体并行地去尝试和评估这些动作的潜在价值。这就是标题里Single State Multiple Actions (SSMA)的核心思想:在同一个系统状态(屏幕截图、当前活动、控件树等)下,同时生成并评估多个候选动作,从而在一次环境交互中获取更丰富的学习信号。
这背后的驱动力,正是Agentic RL(智能体强化学习)在移动端应用场景的深化。无论是自动化测试用例的自我进化,还是个性化手机助手的学习,都要求智能体能在真实、动态的安卓环境中快速学习。而在线训练的效率,直接决定了智能体的“成材速度”和落地成本。Android Coach不是一个具体的APP,而是一套训练框架和方法论,它试图解决的就是这个痛点。
2. 核心思路拆解:为什么是“单状态多动作”?
要理解Android Coach的价值,得先看看现有在线训练流程的“慢”在哪里。
2.1 传统在线训练的瓶颈
在安卓环境做在线RL训练,典型流程是:智能体通过ADB或基于AccessibilityService的框架获取当前屏幕状态S_t-> 策略网络根据S_t输出一个动作A_t(如点击坐标(500,800))-> 执行动作并等待环境稳定(可能几百毫秒到几秒)-> 获取新状态S_{t+1}和奖励R_t-> 用(S_t, A_t, R_t, S_{t+1})这条数据更新策略。这个循环的耗时T_cycle主要由三部分构成:状态获取时间T_state、动作执行与等待时间T_action、网络推理与更新时间T_learn。在安卓上,T_action往往是大头,因为涉及UI渲染、应用响应等不可控延迟。
更关键的是,每次循环只产生一条经验数据。对于需要大量探索的任务,这就像用滴管给游泳池加水。为了学到东西,智能体不得不进行海量的、串行的环境交互,时间成本极高。
2.2 SSMA 的效率增益原理
Single State Multiple Actions (SSMA)的思路是对这个流程的一个根本性改造。其核心假设是:在状态S_t下,我们可以利用模型(不一定是最终的策略网络)一次性生成K个具有潜力的候选动作{A_t^1, A_t^2, ..., A_t^K}。然后,通过一个高效的预测模型(我称之为动作价值评估器),并行地估算出每个动作的预期价值(比如Q值){Q^1, Q^2, ..., Q^K},而无需真正在环境中执行它们。
那么,学习信号从哪里来?我们并不直接使用这些预测的Q值作为监督信号(那会导致模型自娱自乐)。而是将这K个动作-价值对(A_t^k, Q^k)与真实环境交互得到的一条经验(S_t, A_t, R_t, S_{t+1})结合起来。具体来说,有两种主要用法:
- 优先经验回放(Prioritized Experience Replay)的增强:传统PER根据时序差分误差(TD-error)来给经验采样加权。在SSMA中,我们可以利用预测的Q值方差、或者与最终执行动作的价值差异,来更精细地衡量某个状态-动作对的“学习价值”,从而更智能地对其进行优先采样或重采样。
- 辅助训练目标(Auxiliary Training Task):我们可以训练策略网络,使其在状态
S_t下,不仅输出要执行的动作A_t,还尝试让它的特征表示能够区分出哪K个候选动作中的哪一个价值更高(或更低)。这相当于为策略网络增加了一个“动作价值排序”的预训练任务,能使其更快地理解状态与动作价值之间的关系。
这样做,一次耗时的环境交互(执行一个动作并等待反馈)所获得的状态S_t,被用来评估了K个动作,从而产生了K倍的学习信号密度。虽然增加了预测模型的前向计算开销,但这部分计算通常在GPU/NPU上并行完成,耗时远小于安卓环境交互的等待时间。因此,整体训练效率有望得到显著提升。
2.3 在安卓环境中的特殊考量
将SSMA应用于安卓,有几个关键设计点:
- 状态表示(State Representation):纯像素截图(Screen Capture)信息量大但冗余且高维。更高效的方式是结合AccessibilityService 获取的UI控件树(XML Hierarchy)。将控件树转化为图结构或特征向量,能更结构化地表示状态,便于模型理解哪些区域是可交互的,从而生成更有意义的候选动作(如针对特定按钮的点击、长按)。
- 动作空间(Action Space):安卓动作不只是坐标点击。它包括:点击(x,y)、长按、滑动(start_x, start_y, end_x, end_y)、返回、Home、输入文本等。SSMA的候选动作生成器需要能输出这种混合类型的动作。
- 候选动作生成(Candidate Action Generation):不能随机生成。可以基于当前UI控件树,聚焦于可点击(clickable=true)的控件中心点作为候选点击位置;或者基于历史成功经验的动作模式进行采样;也可以使用一个轻量级的“探索网络”来提议动作。
- 价值评估器(Value Estimator):这是一个关键模块。它需要快速对
(S_t, A_t^k)做出价值预测。可以考虑训练一个孪生网络(Siamese Network)或图神经网络(GNN),输入状态特征和动作编码,输出标量Q值。这个评估器的训练数据来源于真实交互得到的历史经验。
3. 系统架构与核心模块实现
基于以上思路,我设计了一套Android Coach的框架原型。整个系统分为云端(训练服务器)和端侧(安卓设备)两部分,通过有线网络或高速Wi-Fi连接,进行实时数据交换。
3.1 整体架构设计
云端(训练服务器,配备GPU): ├── 主智能体(Main Agent) │ ├── 策略网络(Policy Network):输入状态,输出执行动作。 │ └── 价值网络(Value Network):评估状态价值。 ├── SSMA 引擎(核心) │ ├── 候选动作生成器(Candidate Generator):基于当前状态生成K个动作。 │ ├── 快速价值评估器(Fast Value Evaluator):并行评估K个动作的价值。 │ └── 经验增强器(Experience Augmenter):用评估结果标记或增强真实经验。 ├── 经验回放缓冲区(Experience Replay Buffer):存储增强后的经验。 └── 训练器(Trainer):采样批次,更新主智能体和SSMA引擎中的模型。 端侧(安卓设备/模拟器): ├── 环境交互器(Environment Interactor) │ ├── 状态获取模块:通过ADB或AccessibilityService获取屏幕截图和UI树。 │ └── 动作执行模块:通过ADB或Instrumentation执行动作。 ├── 本地缓冲(Local Buffer):暂存原始交互数据。 └── 通信客户端(Client):与云端服务器同步状态和动作数据。工作流程如下:
- 端侧获取当前状态
S_t,发送到云端。 - 云端主智能体的策略网络根据
S_t生成真正要执行的动作A_t。 - 同时,云端的SSMA引擎的候选动作生成器基于
S_t生成K个候选动作,并由快速价值评估器并行评估其价值。 - 云端将动作
A_t发回端侧执行。 - 端侧执行
A_t,等待环境稳定后,获取新状态S_{t+1}和奖励R_t,将原始经验(S_t, A_t, R_t, S_{t+1})发回云端。 - 云端经验增强器将这条原始经验与步骤3中得到的K个候选动作及其评估价值结合,生成一条或多条“增强经验”,存入回放缓冲区。
- 训练器从缓冲区采样,同时更新主智能体和SSMA引擎中的评估器模型。
3.2 核心模块实现细节
3.2.1 状态获取与编码模块
这是所有工作的基础。我放弃了单纯依赖像素的做法,采用“UI树为主,截图为辅”的策略。
- UI树解析:通过Android的
AccessibilityService,可以实时获取当前活动(Activity)的完整控件树。我使用UiAutomator或直接解析AccessibilityNodeInfo。关键是将树结构向量化。我采用了一种自底向上的编码方式:- 对每个节点,提取属性特征:
[class_name_embedding, text_embedding, bounds, clickable, scrollable, ...]。文本使用轻量级BERT(如MobileBERT)编码。 - 根据父子关系,使用一个简单的树形LSTM或GNN,将子节点特征汇聚到父节点。
- 最终,根节点的隐藏状态(或所有节点特征的池化结果)作为整个UI状态的向量表示
s_ui。
- 对每个节点,提取属性特征:
- 屏幕截图编码:同时,获取屏幕截图,使用一个轻量级的CNN(如MobileNetV2的前几层)提取视觉特征
s_img。 - 状态融合:将
s_ui和s_img拼接后,通过一个全连接层融合,得到最终的状态表示S_t。UI树提供了精确的语义和结构信息,截图则补充了视觉风格、非标准控件和动态内容,两者互补。
实操心得:一开始我完全依赖截图,发现模型很难学会点击“那个灰色的、带波纹效果的按钮”。接入UI树后,模型立刻能理解“
android.widget.Buttonwith text=‘登录’ and clickable=true”这个概念,学习速度大幅提升。但要注意,有些应用(如游戏、部分Flutter应用)的UI树信息不全,此时需要fallback到以视觉为主的方法。
3.2.2 候选动作生成器
这个模块的目标是快速产生多样且有潜力的动作。我实现了三种策略,混合使用:
- 基于UI树的启发式生成:从当前UI树中,筛选出所有
clickable=true,long_clickable=true,scrollable=true的节点。对于可点击节点,动作是点击其边界中心;对于可滚动节点,动作是向上/下滑动(起始点为节点中心,滑动距离为节点高度的0.5倍)。这是最直接、最安全的动作来源。 - 基于策略网络扰动的生成:将主策略网络当前对状态
S_t输出的动作分布(如果是离散动作)或均值(如果是连续动作)作为基准,通过添加高斯噪声或从分布中采样多个点,来生成一组围绕“当前最优动作”的候选。这有助于进行局部探索。 - 基于经验回放的生成:从回放缓冲区中,检索与当前状态
S_t相似的历史状态,并将其对应的成功动作作为候选。这相当于引入了“类比”能力。
生成器会从上述三个来源各取一部分动作,合并后去重,最终形成K个候选动作列表。K值通常设置在10-50之间,根据云端算力调整。
3.2.3 快速价值评估器
这是SSMA的“大脑”,需要又快又准。我设计了一个相对轻量的神经网络:
- 输入:状态表示
S_t(向量) 和 动作编码A_t^k。对于点击/滑动等坐标动作,我将其归一化后与状态向量拼接;对于“返回”、“Home”等全局动作,使用独热编码。 - 网络结构:几个全连接层即可。关键在于,这个网络与主智能体的价值网络(Critic)共享底层状态编码器(即提取
S_t的那部分网络)。这样,评估器可以复用主网络对状态的理解能力,训练更快,且评估结果与主网络的价值估计在尺度上保持一致。 - 训练:评估器的训练标签来自于真实经验。每当主智能体执行动作
A_t获得真实奖励R_t和下一状态S_{t+1}后,我们可以用主价值网络(或目标网络)计算出y_t = R_t + γ * V(S_{t+1}),这个y_t就是动作A_t的近似真实价值。我们用(S_t, A_t, y_t)作为样本来训练评估器,使其预测值Q_eval逼近y_t。同时,对于SSMA生成的候选动作A_t^k,我们没有真实y_t,但可以通过评估器的预测值来构造辅助损失,例如鼓励其预测值在候选动作间有合理的差异。
注意事项:快速价值评估器本质上是一个“价值预测模型”,而非真正的Q函数。它的准确性会随着主智能体的学习而动态变化。因此,需要定期用最新的真实数据对其进行微调(fine-tuning),防止其预测偏差过大,误导经验增强过程。我通常每收集1000条新经验,就对评估器进行一次更新。
3.2.4 经验增强与优先回放
这是将SSMA的产出转化为训练效率提升的关键步骤。对于每一条真实经验e = (S_t, A_t, R_t, S_{t+1}):
- 计算真实TD-error:
δ = |R_t + γ * V_target(S_{t+1}) - V(S_t)|。 - 获取候选动作评估:回忆在状态
S_t时,SSMA引擎生成的K个候选动作及其评估价值{ (A_t^k, Q_eval^k) }。 - 计算“信息增益”:我定义了一个简单的度量:
IG_k = |Q_eval^k - Q_eval(A_t)|,即候选动作评估价值与已执行动作评估价值的绝对差。IG_k越大,说明这个候选动作与已执行动作的价值差异越大,可能蕴含着更多未知信息(可能是更好的动作,也可能是更差的陷阱)。 - 增强经验:将
(S_t, A_t^k, IG_k)作为元数据附加到原始经验e上,形成增强经验e_aug。注意,这里并不修改R_t和S_{t+1},因为它们与A_t^k无关。 - 调整优先回放权重:传统PER的优先级
p = |δ| + ε。我将其修改为p_new = |δ| + α * mean(IG) + ε。其中mean(IG)是K个候选动作的平均信息增益,α是一个超参数(如0.1)。这意味着,如果一个状态下的候选动作价值差异很大(即该状态决策点很关键),那么即使这次交互的TD-error不大,这条经验也被认为更有学习价值,应被更频繁地采样。
4. 实战部署与优化技巧
理论说再多,不如跑起来看。下面是我在部署Android Coach框架时,从环境搭建到调优的完整实录和踩坑总结。
4.1 环境搭建与工具选型
- 安卓端:
- 真机 vs 模拟器:优先使用真机。模拟器(如Android Studio AVD)虽然方便,但其渲染、响应速度与真机有差异,且对ADB、截图等底层操作的支持有时不稳定。真机推荐Root后的设备,以便使用
uiautomator和高效截图。我常用一加、小米的老款旗舰机,性价比高。 - 自动化框架:放弃纯ADB命令。我选用Appium作为底层驱动。虽然它重,但它封装了
UiAutomator2,能稳定获取UI树和执行动作,并且支持多语言客户端。我们在其上封装自己的Agent环境。 - 状态获取服务:编写一个独立的Android Service,集成
AccessibilityService用于监听界面变化和获取UI树,同时通过MediaProjectionAPI实现高效屏幕录制或截图(比ADB screencap快很多)。这个Service通过Socket与运行在PC或服务器上的Python训练程序通信。
- 真机 vs 模拟器:优先使用真机。模拟器(如Android Studio AVD)虽然方便,但其渲染、响应速度与真机有差异,且对ADB、截图等底层操作的支持有时不稳定。真机推荐Root后的设备,以便使用
- 云端/训练端:
- 深度学习框架:PyTorch。动态图友好,调试方便,对于研究性质的RL项目再合适不过。
- RL库:不直接使用完整的RLlib或Stable-Baselines3,因为它们对自定义环境、特别是这种“环境在远端”的架构支持不够灵活。我基于PyTorch从头实现了PPO和DQN的核心逻辑,以便深度集成SSMA模块。
- 通信:使用ZeroMQ (zmq)进行安卓端与训练端之间的高速数据交换。它比HTTP更轻量,比原始Socket更易用。状态、动作、经验都以Protobuf格式序列化传输,减少带宽占用。
4.2 训练流程与参数调优
一个完整的训练迭代步骤如下:
- 初始化:启动安卓端服务,启动训练端脚本,建立ZMQ连接。
- 交互循环: a. 训练端发送“获取状态”请求。 b. 安卓端返回当前状态
S_t(包含UI树特征和截图特征向量)。 c. 训练端策略网络输出动作A_t,同时SSMA引擎生成候选动作并评估。 d. 训练端发送动作A_t给安卓端执行。 e. 安卓端执行动作,等待一个固定的超时时间(如1.5秒)让UI稳定,然后获取新状态S_{t+1},并根据任务定义计算奖励R_t(例如,成功进入目标页面奖励+1,否则0)。 f. 安卓端返回(S_t, A_t, R_t, S_{t+1})。 g. 训练端进行经验增强,存入缓冲区。 - 学习循环:每当缓冲区数据超过一个批次(如512条),就采样一个批次进行PPO或DQN更新,同时更新SSMA的快速评估器。
关键超参数与调优经验:
- 等待超时(Action Delay):这是影响训练速度的关键。太短,UI未稳定,状态获取不准;太长,效率低下。我的经验是,不同应用响应速度不同。可以设计一个简单的自适应机制:如果连续几次获取的UI树哈希值相同,则认为已稳定。通常设置在1.0-2.0秒之间。
- SSMA候选动作数K:并非越大越好。K增大,计算开销增加,且很多动作可能是无效或重复的。我从K=10开始,观察评估器预测价值的分布。如果分布很集中(方差小),说明状态下的“好动作”选择不多,可以适当减小K;如果分布分散,可以增大K以捕获更多可能性。通常K=20是一个不错的起点。
- 信息增益权重α:在优先回放中,控制SSMA信息增益影响的强度。α=0则退化为传统PER。我通常从0.05开始,逐渐增大,观察训练曲线。如果α太大,可能会导致智能体过于关注“决策点复杂”的状态,而忽略了那些看似简单但容易出错的状态。需要平衡。
- 奖励设计(Reward Shaping):这是RL在具体任务上成功与否的命门。对于安卓任务,稀疏奖励(只有成功/失败)很难学。必须设计密集的引导奖励。例如,对于“设置Wi-Fi”任务,可以给予:打开设置App (+0.1),找到“网络和互联网”项 (+0.2),点击“Wi-Fi” (+0.3),打开开关 (+0.4)。这些中间奖励需要你对任务流程有清晰的分解。
4.3 性能瓶颈分析与优化
在实测中,我遇到了几个明显的性能瓶颈:
- 状态传输延迟:最初传输完整的截图和UI树原始数据,延迟高达几百毫秒。
- 优化:在安卓端进行特征提取。UI树在端侧直接转化为特征向量,截图通过一个在端侧运行的轻量化CNN(如TensorFlow Lite格式的MobileNet)提取为特征向量。传输的只是几百维的向量,延迟降到10毫秒以内。
- 动作执行失败:由于UI变化,发送的点击坐标可能已经失效,导致动作无效。
- 优化:动作执行前,进行二次校验。安卓端在执行动作前,快速检查目标控件是否仍然存在且属性匹配。如果失效,则返回一个特殊的“动作失效”信号和当前最新状态,训练端将此经验标记为无效,并可能触发一次重试或策略网络的重新决策。
- SSMA评估器冷启动:训练初期,评估器预测不准,提供的IG信息是噪声。
- 优化:设置一个“预热期”。在训练的前N个回合(例如前5000步),不使用SSMA增强的经验进行优先回放,只使用传统PER。同时,在这期间积极收集数据来训练评估器。等评估器的预测损失(MSE)下降到一定阈值后,再逐步引入SSMA。
5. 效果评估与常见问题排查
经过几轮迭代,我将Android Coach应用在几个典型的安卓自动化任务上,与基线方法(相同的RL算法,但不使用SSMA)进行了对比。
5.1 实验设置与结果
- 任务1:简单的计算器连加。目标:打开计算器,依次点击“1”、“+”、“2”、“+”、“3”、“=”,最终显示6。这是一个确定性任务,用于验证基础流程。
- 任务2:微信添加联系人。目标:从微信主界面开始,完成“点击通讯录->点击新的朋友->点击添加朋友->输入特定ID->点击搜索->点击添加到通讯录”。这个任务涉及多个界面跳转和文本输入,更具挑战性。
- 基线:PPO算法,使用传统经验回放。
- 实验组:PPO算法,集成SSMA框架(K=20)。
评估指标:成功率和达到成功所需的平均环境交互步数(越少说明学习/探索效率越高)。
| 任务 | 方法 | 最终成功率 | 达到90%成功率所需步数 | 平均单任务步数(收敛后) |
|---|---|---|---|---|
| 计算器连加 | 基线 | 100% | ~8,000 | 6.5 |
| 计算器连加 | Android Coach (SSMA) | 100% | ~4,500 | 6.2 |
| 微信加好友 | 基线 | 92% | ~35,000 | 28.1 |
| 微信加好友 | Android Coach (SSMA) | 95% | ~22,000 | 25.7 |
结果分析:
- 在两个任务上,集成SSMA的Android Coach都显著减少了达到高性能所需的训练步数(分别减少约44%和37%)。这说明SSMA通过单状态多动作评估,确实提高了数据利用率和探索效率,让智能体更快地找到正确的行为模式。
- 最终成功率和收敛后的平均步数也有小幅提升。这表明SSMA不仅学得快,而且学到的策略可能更鲁棒、更优化。
- 微信任务比计算器任务提升幅度相对小一些,可能是因为微信的UI状态更复杂,候选动作生成和评估的难度更大,但效率提升依然非常显著。
5.2 典型问题与排查手册
在实际操作中,你肯定会遇到各种奇怪的问题。下面是我踩过的一些坑和解决办法:
问题1:智能体在某个界面“卡住”,不断重复无效点击。
- 可能原因1:奖励设计不合理。智能体可能发现重复某个动作能获得微小正奖励(或避免负奖励),形成了局部最优。
- 排查:检查奖励函数。是否为非终态的每一步都赋予了零奖励?考虑为“无进展”的循环添加微小的负奖励(如-0.01)。
- 可能原因2:状态表示未能区分“卡住”的状态。例如,智能体点击后弹出一个对话框,但UI树特征没有很好地捕捉到这个变化。
- 排查:可视化状态向量。对比卡住前后的状态表示,看其差异是否足够大。考虑在状态特征中加入时间步计数器或最近动作的历史,以打破静态状态的混淆。
- 可能原因3:动作空间覆盖不全。可能此时需要“返回”或“Home”键,但你的动作生成器没有产生这些全局动作。
- 排查:检查候选动作列表。确保在动作生成器中,始终以一定概率包含“返回”、“Home”等全局动作作为候选。
问题2:训练初期成功率几乎为零,长时间没有提升。
- 可能原因1:探索不足。策略网络初始输出过于集中,SSMA的候选动作也缺乏多样性。
- 排查与解决:提高策略网络的初始熵权重(在PPO中),或提高DQN的探索率ε。在SSMA候选动作生成中,提高“基于UI树启发式”和“随机扰动”动作的比例,降低“基于策略网络”动作的比例。
- 可能原因2:奖励过于稀疏,且初始探索很难碰到奖励。
- 排查与解决:这是RL常见问题。必须进行奖励塑形(Reward Shaping)。将最终目标分解为多个子目标,并为每个子目标的达成设计中间奖励。甚至可以初期使用模仿学习(Imitation Learning),用少量人工演示数据预训练策略网络,给它一个好的起点。
问题3:SSMA评估器的预测价值与真实回报严重不符,导致优先回放被误导。
- 可能原因1:评估器训练数据不足或过时。
- 排查与解决:检查评估器的训练损失。确保其更新频率与主网络同步或更快。定期(如每1000步)用最新的经验数据对评估器进行一轮微调。
- 可能原因2:状态
S_{t+1}获取不稳定。由于网络延迟或安卓端响应慢,训练端用于计算目标价值y_t的S_{t+1}可能不是动作执行后的稳定状态,导致y_t本身就不准。- 排查与解决:在安卓端增加状态“稳定性检测”(如连续两次UI树相同)。确保只有稳定的状态才被发送。同时,在训练端,可以对
y_t使用更保守的估计,比如使用多个步骤后的回报(n-step return)来平滑单步误差。
- 排查与解决:在安卓端增加状态“稳定性检测”(如连续两次UI树相同)。确保只有稳定的状态才被发送。同时,在训练端,可以对
问题4:整个训练系统运行缓慢,交互频率很低。
- 可能原因:瓶颈分析。使用 profiling 工具,分别测量状态获取、网络传输、模型推理、动作执行、等待延迟等各环节耗时。
- 状态获取慢:优化安卓端特征提取代码,使用更高效的截图方式(如
SurfaceControl或MediaProjection)。 - 网络传输慢:确保安卓设备与训练服务器在同一局域网,使用有线网络连接最佳。压缩传输数据(如使用zlib)。
- 模型推理慢:简化策略网络和评估器网络结构。考虑使用量化(Quantization)或半精度(FP16)推理。
- 等待延迟长:尝试减少动作后等待超时,并配合稳定性检测。
- 状态获取慢:优化安卓端特征提取代码,使用更高效的截图方式(如
5.3 扩展与展望
Android Coach这套框架和SSMA思想,其实可以扩展到更广泛的场景:
- 多任务学习:一个智能体学习完成多个不同的安卓任务。SSMA可以帮它更快地发现不同任务之间的共享技能和差异点。
- 跨应用迁移:在一个应用(如设置)中学到的技能,如何快速迁移到另一个应用(如日历)?SSMA生成的动作可以基于更抽象的“意图”(如“找到并点击一个文本为‘确定’的按钮”),而不仅仅是具体坐标,这可能有助于迁移。
- 与人协作:可以将SSMA生成的K个候选动作及其评估价值展示给人类专家,让人来选择或修正。这相当于一个“AI提议,人类决策”的混合系统,能加速复杂流程的自动化脚本编写。
这个项目的核心体会是,在像安卓这样复杂且不确定性的真实环境中进行在线学习,提高每一次环境交互的信息获取效率,比单纯追求更复杂的网络结构或算法往往更有效。SSMA提供了一种将“探索”和“评估”部分解耦并并行化的思路,虽然增加了系统复杂性,但带来的训练加速效果是实实在在的。如果你也在做移动端智能体的相关研究或开发,不妨从这个角度思考一下,或许能有新的发现。