最近圈子里讨论得最热闹的话题,不是某个模型又刷了排行榜,而是AI开始“动手干活”了。我连续几天刷到十几条消息,说的都是同一件事:AI在替你点外卖、AI在替你写周报、AI在替你排版幻灯片。有人管这波叫“AI Agent”,有人叫“自动化助手”,也有人直接说“AI接管设备”。叫法不一样,但现象已经很明显——AI正在从“回答问题”走向“直接操作你的手机和办公软件”,从操作 iPhone 上的 App 到驱动幻灯片自动生成,背后都在构建同一个闭环:理解界面、拆解意图、执行动作。
这篇文章我准备把手头收集和实测过的 8 个方向的项目放到一起拆,它们有的盯着手机屏幕,有的扎进办公套件,看起来是两拨人,做的东西也不一样,但核心逻辑完全同源。适合正在做智能体开发、办公自动化,或者想搞清楚“AI 到底怎么控制软件”的读者。我已经跑通了其中几个的最小可用版本,后面会直接给出可复现的思路和踩坑记录,方便你自己落地。
1. 8 个项目的全景扫描:它们都在拆同一个闭环
1.1 手机端项目:把界面变成AI能看懂的语言
先说手机这边的项目。有一个开源的 iOS 操作代理,做的思路很有意思:不依赖任何官方接口,只管截图,把屏幕像素变成“视觉语言”,配合语音指令去判断用户想干什么。实际演示场景是,用户对着手机说“帮我把相册里最近一张照片发到某聊天软件”,项目通过连续截图、识别界面元素、模拟点击一步步完成。这套路本质是“长得像人一样看屏幕”。
另一个项目走的是 Android 无障碍服务路线。无障碍服务本身是为了辅助视障用户设计的,可以读取当前界面的控件树——相当于把屏幕上的按钮、输入框、列表项全部变成结构化数据。这个项目利用该能力实现跨 App 数据搬运,比如从邮件里提取一串确认码,自动切到银行 App 粘贴并提交。相比纯视觉方案,它在 Android 上更稳,速度也更快,因为拿到的控件信息不是“猜”出来的,而是系统给的精确位置。
还有一类项目聚焦通讯场景,比如通话与消息的智能代理。它做的事情是,根据来电上下文判断是否需要代接,再结合用户预设的规则生成回复内容。比如开会时来电话,自动识别出是快递,就回复“放门口”;识别出是推销,直接挂断并拉黑。这类项目把“自动操作”和“语义决策”结合得特别紧,本质上已经不是简单的脚本,而是有判断力的代理。
最后一个是跨 App 工作流的调度器。它把“截图识别元素—执行点击—校验结果”封装成可编排的流水线,支持把多个 App 的操作串成一个任务。比如早上打开某新闻 App 签到、去某购物 App 领积分、再到记账 App 记一笔开销,三分钟的人工操作,它每晚自动跑一遍。这个项目虽然不是纯 AI 驱动,但 AI 承担了“动态识别新界面”的能力,比传统定时脚本聪明得多。
1.2 办公软件端项目:从生成内容到驱动软件本身
办公软件方向的思路更偏“生成 + 执行”。其中一个演示文稿自动生成项目,输入一段大纲文本,它会自动拆出章节结构、匹配模板版式、生成配图占位,然后调用办公软件的扩展接口把幻灯片逐页写出来。我实测过,十分钟能做出一个二十页的汇报初稿,基础的排版和内容填充已经像模像样,剩下要做的就是人工润色。
表格方向有一个自然语言助手项目,专门处理电子表格。它能把中文指令翻译成公式、格式规则、条件判断。最典型的例子是输入“把销售额大于一万的标成红色,同时计算每个销售员的占比”,它能自动生成条件格式脚本和统计公式,并且直接写进表格文件。这个方向最难的不是生成公式本身,而是理解表格的物理结构——哪一列是数值、哪一列是姓名、表头占几行。
文档协作方向的项目集中在会议场景。有一个会议纪要机器人,把录音转写、说话人分离、要点提取、待办生成串成一条流水线。转写完成后自动把会议结论整理成结构化摘要,按“决定事项、待办清单、风险点”三个板块输出,然后写入协同文档并通知相关人。它把“语音识别—语义理解—文档写入”三段能力捏在了一起。
还有一个邮件与日程助理项目,逻辑是:读取邮件内容自动起草回复建议,并识别邮件里的时间地点信息生成日程条目。比如收到一封“周五下午三点碰一下项目进度”的邮件,它自动创建日程事件、设置提醒、回一封确认邮件草稿。我 实测最省心的一点是,它不会直接发送,只生成草稿和日程,用户点确认就算完事,既省时间又不会翻车。
1.3 这 8 个项目的共同底座:感知、理解、执行
把上面这 8 个项目并排放,能看出一个非常清晰的共性:每条链路都有三段式结构。
第一段是感知层,负责把界面变成 AI 能理解的输入。手机端靠截图、无障碍节点、控件树,办公端靠文档结构、单元格坐标、段落样式。第二段是理解层,也就是调度大模型把用户指令和界面状态对齐,大模型在这里不负责生成文章,而是负责“读懂界面布局,判断下一步动作”。第三段是执行层,通过模拟点击、调用扩展接口、写入文件等操作把意图落到实际动作上。
过去几年大家做的自动化是基于规则的脚本,只要界面变了脚本就废。现在这批项目把 AI 塞进中间层,界面的动态变化由视觉和理解能力来兜底,脚本只负责最后执行。这带来的变化不只是“更聪明”,而是整套自动化逻辑从“写死”变成了“看懂再操作”。理解了这一点,后面看每个项目都不会迷路。
2. 手机操作 AI 的核心原理与边界
2.1 感知层:人看的是“画面”,机器要的是“结构”
手机操作 AI 最关键的一步是感知。人类看一眼屏幕就知道“右上角有个关闭按钮”,但机器不知道。机器有三种方式拿到界面信息:第一种是截图后做视觉识别,AI 模型直接看图,标注出每个元素的位置和含义;第二种是通过系统辅助接口读控件树,拿到按钮的文本、坐标、类型;第三种是混合模式,截图为主、结构信息为辅,互相校准。
这里要纠正一个常见误解:很多朋友以为视觉方案更通用、更“高级”,实际用下来正好相反。在 Android 上,只要目标 App 没有特殊防御,控件树方案又稳又快,因为位置是系统给的,不存在误判。而视觉方案的优势在于“没有接口也能跑”,比如 iOS 上无法读取任意 App 的控件树,只能靠截图。两个方案不是二选一,而是互补。
我在实测中发现一个比较隐蔽的坑:无障碍服务读到的控件树,在 WebView 场景下经常是乱套的,按钮文本和实际显示不一致。原因是 Web 页面有自己的 DOM 结构,系统把它转译成无障碍节点时经常丢信息。这时候只能靠视觉方案兜底。所以在设计感知层时,我强烈建议做成“双通道”,优先结构信息,遇到异常自动切换到截图识别。
2.2 理解层:大模型的任务不是“聊天”而是“决策”
感知层拿到界面信息后,接下来要交给大模型做决策。这一步的核心工作,是把用户意图映射到界面元素上。比如用户说“帮我把亮度调低”,模型看到屏幕上有“设置”“显示与亮度”等元素,就需要规划出动作序列:先进入设置、找到亮度滑块、计算要拖动的距离、执行拖动并检查结果。
这里的关键不只是“看懂界面”,还包括拆解长任务。很多操作不能一步完成,模型需要把目标拆成多步,并在每步之后重新检查界面状态,决定继续还是修正。我测试下来,用「截图序列 + 操作历史 + 用户指令」作为输入,比单张截图单独推理准确率高很多。原因很简单,界面状态是动态的,AI 必须知道“上一步发生了什么”,才能判断“下一步该怎么办”。
我在工程里还会给模型加一个“安全动作白名单”。像点击、输入、滑动这类低风险动作允许直接执行,但涉及删除、支付、发送消息等不可逆操作,必须经过用户确认。这样设计不是为了限制智能,而是为了兜底。大模型的幻觉问题目前还解决不了,它的判断偶尔会错得离谱,如果没有这层护栏,一次误操作的成本是用户无法接受的。
2.3 边界意识:哪些事坚决不适合交给手机 AI
虽然这些项目看着很酷,但边界感一定要有。我目前的判断是,高频、低风险、流程固定的操作最适合交给手机 AI,比如签到、填表、数据搬运、消息归类。这类操作做了几千遍,模式稳定,出错的影响也很小。
高风险操作暂时别碰,比如支付、批量删数据、自动发送对外消息。不是技术上做不到,而是责任界定不清楚。有一次我测试一个自动整理短信的项目,它把一条银行验证码短信误判成营销信息,差点归档掉。这类问题一旦发生,用户不会管是“模型幻觉”还是“配置错误”,结果都是不信任。
权限最小化原则必须执行到位。我给手机项目授权的范围通常只有:读取当前界面、模拟点击、截图。定位、通讯录、短信这类敏感权限,不该给就绝对不给。有些方案为了省事直接申请系统级权限,这是在给自己埋雷。自动化工具的底线是:可以技术激进,但权限必须克制。
3. 办公软件 AI 驱动的底层逻辑与实现路径
3.1 演示文稿生成:核心不是内容,是版式控制
演示文稿自动生成项目,看似是让 AI 写内容,实际最花功夫的是版式控制。我拆过类似项目的逻辑,发现它内部维护了一套模板库,每套模板定义了标题字号、正文位置、配色方案、图片占位规则。AI 拿到大纲后,第一步不是写文字,而是“分页”——根据内容密度把大纲切成若干页,再为每页选择合适的版式。
分页是一个容易被低估的难点。一句话和三段话不能放同一页,配图和纯文本页的版式也不同。我见过的最靠谱做法,是让模型先输出一个“页面内容块”结构,每块标明类型(标题页、要点页、图文页、数据页),再由程序匹配模板。这样比让模型直接控制坐标稳定得多,因为模型擅长结构理解,不擅长像素级排版。
生成之后还有一步容易被忽略:校验。生成完的幻灯片经常出现文字溢出、图片遮挡文本框的问题。好的项目会调用办公软件接口做一轮自动化检查,测量文本框宽度和内容长度,发现溢出就自动缩小字号或换版式。这一步的效果直接决定了交付物能不能直接拿去用,而不是“看起来差不多,要手动改半天”。
3.2 表格自然语言处理:困难在于理解“表格物理结构”
表格方向的项目,最难的部分不是公式生成,而是“读懂表格的物理结构”。一个表格文件里,可能有合并单元格、多级表头、空行、标签页,同样的“销售额”可能出现在不同列。模型需要先把这些结构信息解析清楚,才能把自然语言指令映射到正确的单元格范围。
我在测试一个中文指令转公式的项目时就遇到过这个问题。用户说“计算每个月的增长率”,但表格里月份是横向排列的,而模型默认按纵向理解,生成的公式引用范围完全错误。后来项目组调整了策略,先把整个工作表的结构信息用表格方式序列化,包括行列号、合并关系、数据类型,再喂给模型推理。效果提升非常明显。
这里给一个非常实用的建议:处理表格任务时,不要直接用截图让模型看,一定要先生成结构化的“表头-行列-样例值”数据。大模型对 JSON 结构的理解远强于对坐标和视觉的感知。把表格转成结构化文本再推理,准确率能提升一大截,而且调试也更方便,出错了能直接看到是哪一行引用错。
3.3 文档协作自动化:把语音、文字、任务流串成一条线
会议纪要和邮件日程助理这类项目,技术含量不在单一环节,而在“串联”。语音转写已经很成熟,摘要提取也不难,难的是把转写文本里的“周五下午三点”正确解析成日程事件,把“张总说需要跟进”正确归类到待办清单,并且把结果无损地写入文档系统。
我拆解过一个会议纪要项目,它的处理链条是这样的:先做说话人分离和转写,然后按时间窗切分转写文本,每一段都标注说话人;接着让大模型做结构化提取,输出“决定事项”“待办任务”“风险问题”三类条目;最后通过文档扩展接口写入指定位置。整个过程看起来很顺,但任何一个环节出问题都会传导到下一步。
传输链路最容易坏的是中间那一步——结构化提取。转写文本是口语化的,很多东西说不完整:“这个方案还是得推”“他说下周二之前给结果”。模型要理解指代关系,判断“他”是谁,“这个方案”指哪个方案。所以我建议在这类项目里,把“上下文窗口”拉长,把参会人列表、会议主题、子议题一并喂给模型,而不是只给孤立的一句话。上下文越完整,提取的准确率越高。
4. 实操复现:从零搭一个能操作手机屏幕的最小 Agent
4.1 技术选型和环境准备
纸上谈兵没意思,我直接分享一个可落地的最小方案。目标是:让 AI 通过看屏幕截图,理解用户指令,然后操作手机完成一个简单任务。技术栈我选的是:Python 3.10 + 某商用大模型视觉接口 + ADB 调试桥。手机端使用 Android 更有优势,因为 ADB 可以直接执行点击、滑动、截图操作,不需要绕弯。
环境准备步骤如下:先安装 Python 和 ADB,手机开启开发者模式并连接电脑,确认adb devices能识别到设备。大模型接口只需要申请一个带视觉能力的 API Key。整个过程不涉及 App 注入,也不需要 root,所以风险很低,适合拿来练手。
这里重点说明一下选型逻辑:为什么用 ADB 而不是无障碍服务?因为做最小 Demo 时,ADB 的指令最直接,adb shell input tap x y一行命令就能点击,日志也清晰。无障碍服务虽然更接近实际问题场景,但需要写一个完整 App 并配置权限,调试成本高。先用 ADB 跑通闭环,再替换执行层,是正确的节奏。
4.2 核心代码骨架:感知-决策-执行三步走
完整的代码逻辑可以分成四段:截图、理解、解析动作、执行点击。我把核心骨架贴出来,稍微改一下就能跑:
import base64 import json import subprocess import time import requests def get_screenshot(): """通过 adb 截图,并转成 base64 返回""" subprocess.run(["adb", "exec-out", "screencap", "-p", ">", "screen.png"], shell=True) with open("screen.png", "rb") as f: return base64.b64encode(f.read()).decode() def ask_model(screenshot_base64, instruction): """调用大模型视觉接口,输入截图和指令,输出结构化动作""" prompt = f""" 你是一个手机操作助手。请分析当前屏幕截图,理解用户指令并规划操作。 用户指令:{instruction} 请严格输出 JSON,格式为: {{"action": "tap" | "swipe" | "input" | "done" | "error", "params": {{"x": 100, "y": 200, "text": "可选"}}, "reason": "简要说明你的判断依据"}} 只输出 JSON,不要输出其他内容。 """ resp = requests.post( "https://api.example.com/v1/chat/completions", headers={"Authorization": "Bearer YOUR_API_KEY"}, json={ "model": "vision-model", "messages": [ {"role": "user", "content": [ {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{screenshot_base64}"}}, {"type": "text", "text": prompt}, ]}, ], }, timeout=30, ) return json.loads(resp.json()["choices"][0]["message"]["content"]) def execute_action(action): """根据模型输出的动作结构,执行 adb 命令""" if action["action"] == "tap": x, y = action["params"]["x"], action["params"]["y"] subprocess.run(["adb", "shell", "input", "tap", str(x), str(y)]) elif action["action"] == "swipe": x1, y1 = action["params"]["x1"], action["params"]["y1"] x2, y2 = action["params"]["x2"], action["params"]["y2"] subprocess.run(["adb", "shell", "input", "swipe", str(x1), str(y1), str(x2), str(y2)]) elif action["action"] == "input": text = action["params"]["text"] subprocess.run(["adb", "shell", "input", "text", text.replace(" ", "%s")]) else: print("任务结束或出错:", action) def run(instruction, max_steps=5): for step in range(max_steps): screenshot = get_screenshot() response = ask_model(screenshot, instruction) print(f"步骤{step + 1}: {response['reason']}") if response["action"] == "done": print("任务完成") break execute_action(response) time.sleep(2) if __name__ == "__main__": run("帮我把屏幕亮度调到最高")这段代码的思路非常直接:截图送给模型,模型返回 tap/swipe/input 指令,程序用 ADB 执行,然后截图再看结果,循环直到模型认为任务完成。
实际运行时,有几个参数需要重点调:每步之间的等待时间(截图后要等界面渲染稳定)、最大步数(防止模型陷入死循环)、以及 prompt 里对 JSON 格式的严格约束。我建议把max_steps设置成 5 到 8 步,步数太少任务做不完,太多容易失控。
4.3 参数细节与容错设计
最容易被忽略的是“屏幕坐标精度”问题。大模型看到的截图分辨率,和手机屏幕实际分辨率不一定一致。比如截图是 1080x2400,模型输出的坐标也是在这个坐标系里的,但某些设备有系统导航栏占位。我建议在执行点击前,先做一次坐标比例校准:模型输出的坐标除以截图宽高,再乘以实际屏幕宽高。
容错设计绝对不能少。我给这个 Demo 加了三层保险:第一层是“动作前的状态检查”,截图给模型的同时,附带一个提示词:“如果目标已经在当前屏幕,请不要重复点击”。这能显著减少连续点击同一个位置的蠢问题。第二层是“重复动作检测”,记录最近三个动作,如果模型连续输出完全相同的 tap 坐标,直接判定异常并停止。第三层是人工确认开关,在execute_action里加一个--dry-run参数,只打印动作不真正执行,用于测试阶段调试。
5. 常见问题与排查技巧实录
5.1 坐标偏差导致点不准
坐标偏差是新手最常遇到的问题。表现是:模型明明看到了按钮在“中间”,点击后却没有任何反应。原因通常有几种:截图分辨率与执行坐标不一致、系统导航栏和状态栏让有效区域偏移、部分 App 有顶栏悬浮球会压住真实按钮。
我的排查顺序是:先确认截图尺寸与手机实际分辨率是否一致;再看 UI 缩放比例,开发者选项里的“最小宽度”设置对坐标影响很大;最后在代码里把点击坐标可视化,点完立刻截一张图,用红点标注点击位置,一眼就能看出偏到哪里。大部分坐标问题都是缩放造成的,校准一次即可根治。
5.2 页面异步加载导致状态误判
第二个高频问题出现在含网络请求的页面。模型点击了“查询”按钮,截图时页面还在转圈,模型认定“没有反应”,于是又点一次。连续点击导致重复提交,结果查询了两次甚至弹出了重复数据。这个问题在跑实际项目时特别常见。
解决方案是引入“等待机制”:每执行完一个动作,不要立刻截图,先调用adb shell dumpsys activity或者简单粗暴地sleep 1.5秒。更项目的做法是,在截图后让模型多判断一个字段“页面是否处于加载状态”,如果是加载状态就直接返回“待定”,不执行任何操作。加载状态识别可以通过元素检测或者视觉判断来完成。
5.3 模型幻觉:声称点击了,实际没有执行
有一次测试中,模型返回的 JSON 里action字段是done,理由是“亮度已经调到最大”。我看了截图,亮度根本没变。这就是典型的模型幻觉——它根据屏幕元素的视觉特征,自己“脑补”了执行结果。
这种问题没法完全消除,只能通过工程手段缓解。我目前的做法是,在模型决策前给它一个“状态对比”提示词:把上一步截图和当前截图都发过去,让它先判断“从上一帧到这一帧,界面有没有变化”,再决定下一步。因为大模型对图片前后的差异判断能力很强,一旦意识到“图片没变”,就不会再幻想操作已经完成。这个技巧帮我把这类幻觉降低了七八成。
5.4 自动化操作的安全自查清单
不管项目规模大小,上线前都要过一遍安全自查。我整理了一份固定检查清单:
| 检查项 | 具体要求 |
|---|---|
| 权限范围 | 只申请当前任务必需权限,敏感权限能免则免 |
| 高风险操作 | 删除、发送、支付类操作必须强制人工确认 |
| 执行日志 | 每一步动作都留日志,包括坐标、原因、时间戳 |
| 失败熔断 | 连续失败或异常动作达到阈值立即停止 |
| 数据隐私 | 截图和文字内容不做持久化存储,用完即删 |
| 人机退出 | 任何时候用户说“停止”都要能立刻终止任务 |
这份清单看起来简单,实际每一行都踩过坑。比如“执行日志”这条,最开始我嫌冗余没加,后来一个自动操作出错,用户质疑是软件点了删除按钮,翻了半天没有任何记录,根本没法排查。从那以后我宁可多写日志,也不能让操作变成一个黑盒。安全不是锦上添花,是这类项目的底线。
6. 实操之后的经验沉淀
跑完这几个方向的 Demo,我对“AI 接管手机和办公软件”这件事有了更具体的判断。先说一个比较反直觉的体会:技术难点不在 AI 模型本身,而在“工程缝合”。模型的理解能力现在已经够用了,真正花时间的是把截图、坐标、控件树、文档接口这些零散工程组件稳妥地串起来,并做好容错。哪一环不稳,整个链路就垮掉。
另一个深刻体会是:不要贪心。刚开始做这类项目,最容易犯的错是想一步到位做一个“万能助手”,什么任务都能接。我做第一个 Demo 时也是这样,结果各个场景互相干扰,稳定性差到没法用。后来改成“单任务深度优化”,先只做“整理验证码并归档”这一个场景,把准确率做到能接受,再横向扩展,效果立刻不一样。
如果你现在正准备上手,我的建议非常明确:先挑一个频率高、风险低、边界清楚的小场景,比如“把网页表格导出成本地文件”或者“把会议录音生成待办清单”,跑通一遍完整的感知-理解-执行闭环。跑通之后你自然会理解哪些环节有坑、哪些参数要调,再决定要不要扩大到更复杂的任务。方向是对的,剩下的就是动手把脏活累活干一遍。