Mobile-Aptus:基于信心评估与主动规划的移动端智能体框架
发布时间:2026/8/20 11:16:21 作者:尧图编辑部 阅读量:1,286

1. 项目概述当大模型学会“主动”与“自信”地操作手机想象一下你让一个AI助手帮你订一张下周二的机票它打开手机上的App却因为屏幕上一个弹窗广告而卡住反复点击关闭按钮无果最终任务失败。或者你让它帮你找出昨天朋友发来的那条重要微信消息它却因为消息列表太长在滑动和点击中迷失了方向。这正是当前基于多模态大语言模型的移动使用智能体所面临的普遍困境它们更像是一个“反应迟钝”的学徒需要你一步步下达精确指令对环境变化缺乏预判对自身操作也缺乏“信心”评估导致任务鲁棒性极差。Mobile-Aptus这个项目瞄准的正是这个痛点。它的核心目标是赋予MLLM驱动的手机操作智能体两种关键能力主动性和鲁棒性。这听起来有点抽象我打个比方。传统的智能体就像一个刚拿到驾照的新手司机必须严格按照导航的每一个“左转”、“右转”指令来开车遇到封路或临时路障就傻眼了。而Mobile-Aptus的目标是把它训练成一个经验丰富的老司机。老司机不仅能执行导航指令更能主动观察路况比如提前看到前方拥堵主动选择绕行并且对自己选择的路线有充分的信心比如他知道那条小路虽然导航没推荐但确实能更快到达并且路况良好。具体到手机操作上“主动性”意味着智能体不再被动等待用户下达每一个原子操作如“点击搜索框”、“输入文字”而是能根据高层次任务如“预订机票”和当前屏幕状态自主规划并执行一连串操作甚至能预判可能出现的中间状态如登录弹窗、权限请求并提前处理。“鲁棒性”则体现在“信心驱动”上。智能体每执行一个操作比如点击一个按钮都会生成一个“信心分数”这个分数综合评估了当前操作的正确性、必要性以及成功执行的概率。当信心分数低时智能体不会盲目执行而是可能触发重试、回退、或调用更基础的感知模块重新确认从而避免在错误路径上越走越远。这个项目非常适合对具身智能、智能体、多模态大模型应用以及人机交互前沿感兴趣的开发者、研究者和产品经理。它不仅仅是一个技术演示更提供了一套可复现的框架和评估体系让我们能系统地思考如何让AI更可靠、更智能地与我们日常使用的数字工具进行交互。接下来我将深入拆解Mobile-Aptus的设计思路、核心模块、实操细节以及那些在论文和代码之外真正决定项目成败的经验与技巧。2. 核心架构与设计哲学拆解Mobile-Aptus的整体架构可以看作是一个增强了“大脑前额叶”的智能体系统。传统MLLM智能体主要依赖大模型的推理能力来解析指令和生成动作但Mobile-Aptus在此基础上引入了两套核心的“反射”与“监控”机制。2.1 信心评估模块为每个动作装上“风险雷达”信心评估是Mobile-Aptus的基石。它不是一个简单的二分类成功/失败而是一个连续的、多维度的概率估计。在实现中这个模块通常作为一个轻量级的神经网络模型与大模型协同工作。信心分数的构成 信心分数 $C \in [0, 1]$ 通常由以下几个子分数加权融合而成视觉匹配置信度智能体打算点击的UI元素如按钮与当前屏幕截图经过目标检测模型识别出的候选元素之间的视觉相似度。例如使用CLIP模型计算意图描述的文本嵌入如“蓝色的发送按钮”与截图区域图像嵌入的余弦相似度。布局逻辑置信度评估当前操作在屏幕布局流中的合理性。例如在输入密码之前是否已经位于密码输入框内这个分数可以通过一个训练过的布局理解模型或者基于规则的启发式方法如检查目标元素的clickable、focusable等属性来计算。历史轨迹一致性当前操作是否与之前的一系列操作在逻辑上连贯例如刚刚打开了设置菜单下一步点击“网络设置”比点击“返回桌面”具有更高的一致性置信度。这可以通过一个简单的循环网络或注意力机制来建模短期操作历史。大模型自身置信度许多大模型在生成输出时会附带一个生成概率或token置信度。我们可以提取与动作相关的token如CLICK[‘搜索’]的生成概率作为先验信心。计算公式概念性 $C \alpha \cdot C_{visual} \beta \cdot C_{layout} \gamma \cdot C_{history} \delta \cdot C_{llm}$ 其中权重参数 $\alpha, \beta, \gamma, \delta$ 需要通过大量任务轨迹数据进行端到端或分阶段训练得到。实操心得在初期实验中我们过于依赖大模型自身的置信度发现它经常“过度自信”尤其是在面对从未见过的UI样式时。后来我们加强了视觉匹配置信度的权重并引入了一个简单的“异常检测”机制如果视觉匹配分极低例如0.3即使大模型信心很高也强制触发重新感知这避免了大量因图标变化、主题更换导致的点击失败。2.2 主动规划与执行模块从“听令行事”到“谋定后动”主动性体现在智能体能将高层任务分解为子任务并动态规划执行路径。Mobile-Aptus采用了一种分层任务网络与大模型推理相结合的方式。任务分解给定一个任务如“给张三发微信说晚上开会”大模型首先将其分解为一系列子目标状态[解锁屏幕] - [找到并打开微信] - [进入与张三的聊天窗口] - [点击输入框] - [输入文本] - [点击发送]。状态空间建模智能体将手机屏幕抽象为一个状态 $S$每个操作点击、滑动、输入是导致状态转移的动作 $A$。目标是从初始状态 $S_0$ 通过一系列动作到达目标状态 $S_g$。主动探索与回退这是与传统方法的关键区别。在执行[找到并打开微信]时如果屏幕主界面上没有微信图标传统智能体可能就卡住了。而Mobile-Aptus的智能体会主动触发“滑动屏幕”或“进入应用抽屉”的操作。更重要的是每个操作都附带信心分数。例如在应用抽屉里它可能以高信心识别并点击微信图标。如果点击后没有成功打开微信例如跳转到广告或权限请求状态转移不符合预期信心评估模块会检测到这种“状态异常”触发回退到上一个稳定状态并尝试替代方案比如从最近任务中打开。技术实现细节屏幕状态表示不仅使用截图像素还结合了通过Accessibility Service或UI Automator提取的视图层次结构文件形成多模态状态表示。这比纯视觉方案更稳定。动作空间定义为{CLICK, LONG_CLICK, SWIPE, INPUT, BACK, HOME, SCROLL}等基本操作的集合以及操作的目标坐标或描述。规划器可以是一个经过微调的、具备强化学习能力的轻量级模型也可以直接利用大模型强大的上下文学习能力进行每一步的规划。Mobile-Aptus更倾向于后者但用信心模块来约束和修正大模型的输出。2.3 鲁棒性保障机制构建操作“安全网”鲁棒性不是单一模块而是由信心评估触发的多种应对策略构成的体系。低信心阈值处理设定一个信心阈值 $C_{low}$如0.6。当生成的行动信心 $C C_{low}$ 时系统不会直接执行该行动而是进入“纠错模式”。纠错模式策略重试与细化将当前屏幕状态和低信心动作再次输入大模型要求其重新分析或提供更具体的描述。例如原指令是CLICK[‘确认’]但屏幕上有两个“确认”按钮。重试时模型可能被提示给出更精确的定位如CLICK[‘右下角的蓝色确认按钮’]。子目标回溯如果当前子目标如“找到发送按钮”多次尝试失败则回退到上一个已完成的子目标如“进入聊天界面”并尝试不同的路径比如检查是否网络不佳导致按钮未加载或尝试滑动屏幕。人工干预请求在无法自主解决时可以生成一个自然语言描述的问题向用户请求帮助。例如“屏幕上有两个相似的按钮请问应该点击哪一个来完成发送”状态验证执行动作后获取新的屏幕状态验证是否达到预期。这可以通过比较新状态与预期子目标的描述嵌入相似度来实现。如果未达到预期且信心评估显示进入了未知状态则立即触发回退。避坑指南阈值 $C_{low}$ 的设置非常关键且不是一成不变的。我们发现在任务初期如打开App可以设置较低的阈值如0.5允许智能体进行一些探索。而在任务关键步骤如支付确认则需要非常高的阈值如0.85。我们实现了一个简单的动态阈值机制根据当前子任务的重要性和历史错误率进行微调。3. 实操构建从零搭建一个Mobile-Aptus原型理论讲了很多现在我们动手搭建一个简化版的Mobile-Aptus原型。这里我们以Android平台为例使用Python作为主要开发语言。3.1 环境准备与基础工具链首先你需要一个可以连接和控制的Android设备或模拟器。我们使用adb作为桥梁。# 1. 安装基础依赖 pip install torch transformers opencv-python pillow clip-by-openai # 用于UI层次结构解析可选但强烈推荐 pip install lxml beautifulsoup4 # 2. 确保adb可用并连接设备 adb devices # 应显示你的设备序列号核心工具选型解析大模型我们选择开源、支持视觉理解的模型如Qwen-VL或LLaVA。它们能在单张消费级显卡上运行并支持将图像和文本作为输入输出文本指令。这里我们以Qwen-VL-Chat为例。视觉匹配模型CLIP是首选它能出色地计算文本描述与图像区域的相似度。手机控制使用uiautomator2库它比原生adb shell input命令更强大能获取详细的UI信息。pip install uiautomator23.2 核心模块代码实现我们创建几个核心的Python类来构建系统。1. 设备控制器 (DeviceController) 负责屏幕截图、执行动作、获取UI层次结构。import uiautomator2 as u2 import cv2 from PIL import Image class DeviceController: def __init__(self, device_serial): self.d u2.connect(device_serial) self.screen_size self.d.window_size() def get_screenshot(self): 获取当前屏幕截图PIL Image格式 screenshot self.d.screenshot() return screenshot def get_ui_hierarchy(self): 获取当前UI的XML层次结构用于精准元素定位 return self.d.dump_hierarchy() def execute_action(self, action_type, targetNone, textNone): 执行动作click, swipe, input等 if action_type click: if isinstance(target, tuple): # 坐标 self.d.click(*target) else: # 元素描述通过uiautomator2选择器 self.d(**target).click() elif action_type input: self.d(**target).set_text(text) # ... 其他动作类型2. 信心评估器 (ConfidenceEstimator) 集成CLIP进行视觉匹配并结合规则计算布局信心。import torch import clip from PIL import Image import numpy as np class ConfidenceEstimator: def __init__(self, clip_model_nameViT-B/32): self.device cuda if torch.cuda.is_available() else cpu self.model, self.preprocess clip.load(clip_model_name, deviceself.device) def visual_confidence(self, screen_image, target_description): 计算屏幕图像与目标描述的视觉匹配置信度。 简化版将整个屏幕与描述进行匹配。 进阶版需结合目标检测先定位候选区域再分别匹配。 # 预处理图像和文本 image_input self.preprocess(screen_image).unsqueeze(0).to(self.device) text_input clip.tokenize([target_description]).to(self.device) with torch.no_grad(): image_features self.model.encode_image(image_input) text_features self.model.encode_text(text_input) # 计算余弦相似度作为置信度 similarity (image_features text_features.T).item() # 将相似度从[-1,1]映射到[0,1] visual_conf (similarity 1) / 2 return visual_conf def layout_confidence(self, current_ui_hierarchy, target_element_info): 基于UI层次结构计算布局逻辑置信度。 例如检查目标元素是否可点击、是否在屏幕可见区域等。 这是一个基于规则的简化实现。 conf 0.5 # 基础分 # 解析UI hierarchy (这里需要解析XML简化表示) # 假设我们通过某种方式获取了目标元素的属性 if target_element_info.get(clickable) true: conf 0.3 if target_element_info.get(visible, False): conf 0.2 return min(conf, 1.0) # 确保不超过13. 智能体核心 (MobileAptusAgent) 整合大模型、信心评估和设备控制。from transformers import AutoModelForCausalLM, AutoTokenizer # 假设使用Qwen-VL这里需要根据具体模型加载方式调整 class MobileAptusAgent: def __init__(self, device_controller, confidence_estimator, llm_model_path): self.dc device_controller self.ce confidence_estimator # 加载大模型此处为示意实际需按Qwen-VL文档加载 self.tokenizer AutoTokenizer.from_pretrained(llm_model_path, trust_remote_codeTrue) self.model AutoModelForCausalLM.from_pretrained(llm_model_path, device_mapauto, trust_remote_codeTrue).eval() def perceive_state(self): 感知当前状态截图UI层次 screenshot self.dc.get_screenshot() ui_hierarchy self.dc.get_ui_hierarchy() return {image: screenshot, xml: ui_hierarchy} def plan_next_action(self, task, current_state): 基于大模型规划下一个动作。 输入任务描述当前状态图像UI文本摘要 输出动作字典如 {type: click, target: 搜索按钮, coord: (x,y)} # 将图像和UI信息转化为大模型能理解的提示词 prompt self._construct_prompt(task, current_state) # 调用大模型生成文本指令 with torch.no_grad(): response self.model.chat(self.tokenizer, queryprompt, imagecurrent_state[image]) # 解析response提取动作指令这里需要设计固定的输出格式或使用Function Calling parsed_action self._parse_model_response(response) return parsed_action def estimate_action_confidence(self, action, current_state): 评估给定动作在当前状态下的信心 visual_conf self.ce.visual_confidence(current_state[image], action[target_description]) layout_conf self.ce.layout_confidence(current_state[xml], action.get(element_info, {})) # 简单加权平均实际中可能需要学习权重或加入更多因素 total_confidence 0.7 * visual_conf 0.3 * layout_conf return total_confidence def execute_with_confidence(self, task, max_steps50, confidence_threshold0.65): 信心驱动的主执行循环 current_state self.perceive_state() for step in range(max_steps): action self.plan_next_action(task, current_state) if not action: print(模型未生成有效动作。) break confidence self.estimate_action_confidence(action, current_state) print(f步骤{step}: 计划动作 {action} 信心分数: {confidence:.3f}) if confidence confidence_threshold: print(信心充足执行动作。) self.dc.execute_action(action[type], action.get(target), action.get(text)) # 等待状态稳定 time.sleep(1.5) new_state self.perceive_state() # 简单状态验证检查屏幕是否发生显著变化可通过图像哈希比较 if self._state_changed_significantly(current_state[image], new_state[image]): print(状态已更新。) current_state new_state else: print(状态未发生预期变化可能动作失败。) # 触发低信心处理流程 self._handle_low_confidence(action, current_state, task) else: print(f信心不足({confidence:.3f} {confidence_threshold})进入纠错模式。) self._handle_low_confidence(action, current_state, task) # 检查任务是否完成需要定义任务完成检测器 if self._is_task_complete(task, current_state): print(任务完成) return True print(达到最大步数任务未完成。) return False def _handle_low_confidence(self, action, state, task): 低信心处理策略这里可以实现重试、重新规划、请求帮助等 # 策略1重新感知并规划最多尝试3次 for _ in range(3): print(尝试重新感知与规划...) new_action self.plan_next_action(task, state) new_conf self.estimate_action_confidence(new_action, state) if new_conf self.confidence_threshold: print(f重新规划后信心提升至{new_conf:.3f}执行新动作。) self.dc.execute_action(new_action[type], new_action.get(target), new_action.get(text)) return # 策略2执行保守的回退动作如按一次BACK键 print(多次重试失败执行回退(BACK)。) self.dc.execute_action(back)3.3 运行一个端到端任务示例假设我们的任务是“在微信中搜索联系人‘张三’并打开聊天窗口”。# 初始化 dc DeviceController(你的设备序列号) ce ConfidenceEstimator() # 假设已下载并配置好Qwen-VL模型路径 agent MobileAptusAgent(dc, ce, path/to/qwen-vl-chat) # 执行任务 task_description 在微信中搜索联系人‘张三’并打开聊天窗口 success agent.execute_with_confidence(task_description, max_steps30, confidence_threshold0.7) if success: print(Mobile-Aptus智能体成功完成了任务) else: print(任务执行过程中遇到困难。)在这个流程中智能体会感知主屏幕规划并高信心点击“微信”图标。进入微信后感知界面。规划动作“点击顶部的搜索框”。如果搜索框很明显信心会高直接点击。输入“张三”。由于是明确的输入动作信心通常很高。在搜索结果列表中识别并点击“张三”的联系人头像。这里信心评估至关重要因为列表可能有多人CLIP需要准确匹配“张三”的头像和名称。如果信心低于阈值智能体可能会尝试滑动列表或重新点击搜索框。现场记录与参数调优在实测中confidence_threshold0.7是一个不错的起点。但对于“点击搜索结果”这类动作我们发现由于微信列表项视觉相似度高CLIP给出的初始视觉置信度可能只在0.6左右。此时我们调整了策略对于“列表选择”类动作额外引入一个“选项排序”机制即让模型列出前3个最可能的目标然后依次评估信心选择最高的执行即使它可能略低于全局阈值。这显著提高了在列表中选择项目的成功率。4. 性能优化与高级技巧构建出原型只是第一步要让Mobile-Aptus真正实用还需要大量的优化和工程技巧。4.1 提升信心评估的准确性原始的CLIP全图匹配精度有限我们需要升级到基于目标检测的局部匹配。引入目标检测使用轻量级目标检测模型如YOLO-Nano或MobileNet-SSD对屏幕截图进行实时分析检测出所有可能的交互元素按钮、图标、输入框等并裁剪出它们的图像区域。多候选区域匹配将动作描述如“蓝色的发送按钮”与每一个检测到的元素区域进行CLIP相似度计算取最高分作为视觉置信度同时记录下得分最高的元素坐标。def enhanced_visual_confidence(self, screen_image, target_description): # 1. 目标检测 detected_boxes self.detector.detect(screen_image) # 返回 [x1,y1,x2,y2, label, conf] if not detected_boxes: return 0.0, None max_similarity -1 best_box None for box in detected_boxes: x1, y1, x2, y2 box[:4] element_image screen_image.crop((x1, y1, x2, y2)) # 2. CLIP匹配 image_input self.preprocess(element_image).unsqueeze(0).to(self.device) text_input clip.tokenize([target_description]).to(self.device) with torch.no_grad(): similarity self.model.similarity(image_input, text_input).item() if similarity max_similarity: max_similarity similarity best_box box visual_conf (max_similarity 1) / 2 return visual_conf, best_box # 同时返回置信度和最佳匹配框坐标融合UI属性信息将检测到的元素坐标与从uiautomator2获取的UI层次结构进行关联从而获得该元素的精确属性resource-id,text,class,clickable等将这些属性文本与动作描述一同输入大模型或一个小的分类器进行综合判断可以大幅提升在文本按钮如“登录”、“确定”识别上的信心。4.2 动态阈值与自适应策略固定的信心阈值无法适应所有场景。我们需要一个动态阈值机制。基于任务阶段的阈值将任务分解为阶段启动、导航、操作、确认。在“导航”阶段可以容忍稍低的信心如0.6以鼓励探索在“操作”阶段如点击支付按钮则需要高信心如0.9。基于历史成功率的阈值维护一个滑动窗口记录最近N个同类动作如“点击按钮”的成功率。如果成功率持续走低则自动调高该类动作的阈值使其更加谨慎。基于元素类型的阈值对“返回”、“主页”这类通用且低风险的操作可以设置较低的阈值对涉及文本输入、特定功能键的操作则设置较高的阈值。4.3 利用大模型的上下文学习进行Few-Shot纠错当智能体因低信心而进入纠错模式时除了简单的重试我们可以让大模型进行少量示例学习。在提示词中我们不仅提供当前状态和任务还提供一两个过去成功解决类似困境的“示例轨迹”。当前状态[描述当前屏幕和问题例如“屏幕上有两个‘下一步’按钮一个在顶部一个在底部。”] 历史成功示例 - 问题有两个“提交”按钮。 - 思考顶部的按钮通常在表单项附近底部的按钮是页面主提交按钮。当前任务是提交表单应点击底部按钮。 - 动作CLICK[底部‘提交’按钮] - 结果成功。 请根据当前状态和示例的推理逻辑决定点击哪个“下一步”按钮。通过这种方式大模型能快速借鉴历史经验做出更合理的决策从而跳出当前困境。5. 常见问题、排查技巧与效果评估在实际部署和测试Mobile-Aptus原型时你会遇到各种各样的问题。下面是我在开发过程中遇到的一些典型问题及解决方法。5.1 常见问题速查表问题现象可能原因排查与解决思路动作信心持续偏低1. CLIP模型与当前App UI风格不匹配。2. 目标检测框不准裁剪区域错误。3. 动作描述过于模糊。1.微调CLIP收集一批目标App的截图和元素描述对CLIP的视觉编码器进行轻量微调。2.优化检测模型使用针对移动端UI元素如RICO数据集训练过的检测器。3.细化提示词让大模型生成更精确的元素描述如“右下角圆角蓝色背景的‘下一步’按钮”。智能体在循环中卡住1. 状态验证失败误判动作未生效。2. 低信心处理策略单一陷入“重试-失败”循环。3. 任务分解出现死循环。1.改进状态验证结合图像哈希、主要UI元素变化如出现新弹窗等多维度判断状态是否改变。2.丰富纠错策略引入随机探索如轻微滑动、回退多步、或请求高层任务重新规划。3.设置循环检测记录状态历史如果发现连续多次进入相同或相似状态强制跳出并尝试全新路径。大模型生成动作格式错误提示词工程不到位模型未遵循规定的输出格式。1.强化指令在系统提示词中明确要求以JSON格式输出并给出严格示例。2.后处理解析编写鲁棒的解析器即使模型输出有小瑕疵也能通过正则表达式或自然语言处理提取关键信息。3.使用Function Calling如果所用大模型支持将其输出结构化为函数调用更稳定。执行速度慢无法实时1. 大模型推理耗时过长。2. 目标检测和CLIP计算开销大。3. 屏幕截图和传输延迟高。1.模型量化与加速使用GPTQ、AWQ等技术量化大模型或使用更小的视觉模型如MobileCLIP。2.缓存与异步对不变的背景区域进行缓存将感知、推理、执行 pipeline 异步化。3.优化传输降低截图分辨率在可识别前提下使用ADB over WiFi/USB 3.0。在特定App如游戏、视频App中失效UI元素非标准控件或大量使用自定义绘制、动态内容。1.强化视觉能力依赖更强大的视觉基础模型VFM进行像素级理解和指令跟随。2.备用方案对于极度非标准的界面可以训练针对该App的专用模型或回退到基于坐标的宏录制/回放方案。5.2 效果评估指标如何衡量Mobile-Aptus的好坏不能只看任务完成率。任务成功率最核心的指标。在涵盖不同复杂度简单、中等、复杂的任务测试集上计算成功完成的任务比例。平均完成步数成功完成任务所需的平均操作步骤数。步数越少说明智能体的主动规划和操作效率越高。冗余操作率执行了多少次不必要的、错误的或重复的操作如多次点击同一无效区域。这个指标直接反映信心评估和鲁棒性机制的有效性。人工干预频率任务执行过程中需要人工介入如帮助选择、纠正错误的次数。越低越好。平均置信度偏差智能体预测的信心分数与实际操作成功与否的相关性。理想情况下成功操作应有高信心失败操作应有低信心。可以用校准曲线或期望校准误差来衡量。5.3 我的核心避坑心得不要完全信任大模型的“视觉描述”初期我们让大模型描述屏幕后直接生成动作发现它经常“幻觉”出屏幕上不存在的元素。必须将视觉感知CLIP检测作为事实依据大模型更多用于推理和规划而非感知。UI层次结构是金矿但也是泥潭通过uiautomator2获取的XML信息非常精准但不同App、甚至同一App不同版本的实现千差万别属性可能缺失、错误或过于复杂。最佳策略是视觉为主UI层次信息为辅用于交叉验证和精确定位而不是唯一依赖。设计一个“安全状态”清单定义一些绝对安全的状态和动作例如“回到手机桌面”、“打开设置菜单”。当智能体连续失败多次陷入混乱时可以强制其执行一个“安全动作”回到已知的稳定状态然后重新开始或请求帮助。这能有效防止系统完全崩溃。数据数据还是数据Mobile-Aptus的性能严重依赖于数据。你需要收集大量“人机交互轨迹”数据屏幕截图序列对应的人工操作来训练信心评估模型甚至微调大模型。开源数据集如Android-In-The-Wild、RICO是宝贵的起点但针对你的具体任务场景构建自己的小规模高质量数据集至关重要。构建一个真正鲁棒、主动的移动使用智能体是一场马拉松而不是短跑。Mobile-Aptus框架提供了一个强大的起点它将“信心”这个主观概念量化并融入决策循环是通向更通用、更可靠数字助理的关键一步。每个成功的智能体背后都是对无数边缘案例的细致处理和对人机交互本质的深刻理解。