Open-AutoGLM部署日记:从环境配置到成功运行
这是一篇真实、不加修饰的部署手记。没有“开箱即用”的幻觉,也没有“一键部署”的捷径——只有我在Windows台式机上连接一台旧款安卓手机、反复调试ADB权限、核对端口映射、修正模型路径后,最终看到AI自动打开小红书并输入“川菜探店”那一刻的截图。如果你正站在部署门槛前犹豫要不要试,这篇文章会告诉你:它可行,但需要你亲手拧紧每一颗螺丝。
1. 理解Open-AutoGLM到底是什么
Open-AutoGLM不是传统意义上的“大模型推理服务”,而是一个手机端AI Agent框架。它的核心能力不是生成一段文字或一张图,而是看懂你的手机屏幕,并替你点、滑、输、搜、确认。
它由三部分协同工作:
- 视觉理解层:把手机实时截屏变成可读的文本描述(比如“当前页面是小红书首页,顶部有搜索框,下方是推荐流,左下角是‘发现’图标”);
- 意图规划层:将你的自然语言指令(如“帮我找最近3天发布的北京烤鸭探店视频”)拆解为原子动作序列(点击搜索框→输入文字→点击搜索→向下滚动→识别视频卡片→点击播放);
- 执行控制层:通过ADB向设备发送精确的坐标点击、滑动、按键指令,真实模拟人类操作。
关键区别在于:它不依赖App内部API,也不需要你提前给每个App写自动化脚本。只要屏幕可见,它就能理解并行动——这才是真正意义上的“所见即所得”智能助理。
注意:Open-AutoGLM本身不包含大模型。它是一个框架,需配合云端部署的AutoGLM-Phone模型(如
autoglm-phone-9b)使用。镜像中提供的是控制端代码,模型服务需单独部署在有GPU的服务器上。
2. 硬件与系统准备:别跳过这一步
很多失败源于这里被轻视。这不是“装个Python就行”的任务,而是一场软硬件协同的实操。
2.1 你的电脑要能“看见”手机
- 操作系统:Windows 10/11 或 macOS Monterey 及以上(Linux同理,但本文以Windows为主)
- Python版本:必须是3.10.x(实测3.11+在某些ADB库上有兼容问题,3.9则缺少asyncio新特性)
- ADB工具:下载Android SDK Platform-Tools,解压后得到
adb.exe、fastboot.exe等文件
验证方式:打开命令提示符,输入
adb version。若返回类似Android Debug Bridge version 1.0.41,说明环境变量已正确配置;若提示“不是内部或外部命令”,请回看镜像文档中的环境变量设置步骤——这是最常卡住的第一关。
2.2 手机端设置:三步缺一不可
很多用户卡在“adb devices无响应”,问题几乎全出在这里:
开启开发者模式:
设置 → 关于手机 → 连续点击“版本号”7次 → 输入锁屏密码 → 出现“您现在处于开发者模式”。启用USB调试:
设置 → 系统 → 开发者选项 → 打开“USB调试”开关 →同时勾选“USB调试(安全设置)”(此选项常被忽略,导致ADB授权弹窗不出现)。安装并启用ADB Keyboard(关键!):
- 下载 ADB Keyboard APK(推荐v1.3)
- 在手机上安装 → 设置 → 语言与输入法 → 当前键盘 → 选择“ADB Keyboard”并设为默认
- 为什么必须?Open-AutoGLM需通过ADB向任意App输入文字,系统自带键盘无法跨应用注入,ADB Keyboard是唯一稳定方案。
小技巧:首次连接时,手机会弹出“允许USB调试吗?”授权窗口。务必勾选“始终允许”,否则每次重启ADB都会重新弹窗,中断自动化流程。
3. 控制端部署:克隆、安装、验证
一切就绪后,我们开始本地控制端的搭建。
3.1 获取并初始化代码
# 克隆官方仓库(注意:不是zhipuai官方主库,而是Open-AutoGLM独立项目) git clone https://github.com/zai-org/Open-AutoGLM cd Open-AutoGLM # 创建虚拟环境(强烈推荐,避免包冲突) python -m venv venv venv\Scripts\activate # Windows # source venv/bin/activate # macOS/Linux # 安装依赖(requirements.txt已适配最新库) pip install -r requirements.txt pip install -e .注意:
pip install -e .是关键。它将当前目录作为可编辑包安装,使phone_agent模块能在Python中直接导入。跳过此步会导致后续import phone_agent.adb报错。
3.2 连接设备:USB与WiFi双路径
USB直连(推荐新手首选)
adb devices正常输出应为:
List of devices attached ABCDEF1234567890 device若显示unauthorized,检查手机是否弹出授权窗口;若为空,重插USB线并尝试更换接口(部分USB 3.0接口供电不稳)。
WiFi远程连接(适合长期运行)
需先用USB完成初始授权:
# 1. USB连接后,开启TCP/IP模式 adb tcpip 5555 # 2. 拔掉USB线,确保手机与电脑在同一局域网 # 3. 查找手机IP(设置 → 关于手机 → 状态信息 → IP地址) adb connect 192.168.1.105:5555提示:WiFi连接后,
adb devices会显示192.168.1.105:5555 device。此时你已摆脱数据线束缚,可在客厅沙发用笔记本遥控卧室里的手机。
4. 启动AI代理:让指令落地
此时,云端模型服务(如vLLM部署的autoglm-phone-9b)必须已就绪,且可通过http://<server-ip>:8800/v1访问。我们只负责“下达命令”和“执行动作”。
4.1 命令行快速启动
在Open-AutoGLM根目录下执行:
python main.py \ --device-id ABCDEF1234567890 \ --base-url http://192.168.1.200:8800/v1 \ --model "autoglm-phone-9b" \ "打开小红书,搜索'杭州龙井茶体验馆',进入第一个笔记,截图保存"参数说明:
--device-id:adb devices返回的设备ID(USB)或IP:端口(WiFi)--base-url:指向你部署的模型API地址(必须带/v1后缀)- 最后字符串:你的自然语言指令,无需任何特殊格式
成功标志:终端开始滚动日志,显示
[INFO] Capturing screenshot...→Parsing screen with VLM...→Planning action: TAP at (x=520, y=310)→Executing ADB command: input tap 520 310→ 最终在手机上看到小红书被打开、搜索框被点击、文字被输入。
4.2 Python API调用:嵌入你自己的程序
如果你希望将此能力集成进现有系统,而非仅用命令行,phone_agent提供了清晰的Python接口:
from phone_agent.adb import ADBConnection from phone_agent.agent import PhoneAgent # 1. 建立ADB连接 conn = ADBConnection() success, msg = conn.connect("ABCDEF1234567890") # 或 "192.168.1.105:5555" print(f"ADB连接: {msg}") # 2. 初始化AI代理(指定模型服务地址) agent = PhoneAgent( device_id="ABCDEF1234567890", base_url="http://192.168.1.200:8800/v1", model_name="autoglm-phone-9b" ) # 3. 发送指令(同步阻塞,等待任务完成) result = agent.run("打开微信,找到'张三',发送'周末聚餐?'") # 4. 获取结构化结果 print(f"任务状态: {result.status}") # success / failed print(f"执行步骤数: {len(result.steps)}") print(f"耗时: {result.duration:.2f}秒")优势:
agent.run()返回完整执行轨迹(每一步的截图、VLM解析文本、规划动作、ADB命令),便于调试与审计。你甚至可以基于result.steps做二次分析,比如统计“平均点击准确率”。
5. 排查高频问题:那些让你抓狂的5分钟
部署中最耗时的往往不是配置,而是定位一个隐藏的细节错误。以下是我在实测中踩过的坑:
5.1 “Connection refused” 错误
- 现象:
main.py报错requests.exceptions.ConnectionError: HTTPConnectionPool(host='192.168.1.200', port=8800): Max retries exceeded... - 原因:不是网络不通,而是云服务器防火墙未放行8800端口。
- 解决:
- Linux服务器:
sudo ufw allow 8800 - 云厂商(阿里云/腾讯云):在安全组规则中添加入方向TCP 8800端口放行
- 本地测试:若模型也部署在本机,
--base-url应改为http://127.0.0.1:8800/v1
- Linux服务器:
5.2 ADB连接不稳定,频繁断连
- 现象:
adb devices偶尔显示offline,或执行中突然报错device not found - 原因:WiFi连接受路由器信道干扰或手机省电策略限制。
- 解决:
- 优先改用USB连接(稳定性100%)
- 若必须WiFi,在手机设置中关闭“WLAN休眠策略”(设置 → WLAN → 高级 → 保持WLAN连接)
- 在
main.py中增加重连逻辑(源码第127行附近可插入conn.reconnect())
5.3 模型返回乱码或空响应
- 现象:终端打印出
{"choices":[{"message":{"content":""}}]}或长时间无输出 - 原因:vLLM服务启动参数与客户端期望不匹配,尤其是
--max-model-len。 - 解决:
- 检查vLLM启动命令中
--max-model-len是否≥2048(autoglm-phone-9b最低要求) - 确保
--dtype为auto或half,避免float32导致显存溢出 - 在
main.py中临时添加--verbose参数,查看完整HTTP请求/响应体
- 检查vLLM启动命令中
5.4 手机屏幕内容识别不准
- 现象:AI说“未找到搜索框”,但你清楚看到它在屏幕顶部
- 原因:截图分辨率过高,VLM模型输入尺寸固定(通常512×512),导致文字模糊。
- 解决:
- 修改
phone_agent/capture.py中capture_screenshot()函数,添加缩放:# 在PIL.Image.open()后添加 img = img.resize((512, 512), Image.Resampling.LANCZOS) - 或在手机设置中降低显示分辨率(设置 → 显示 → 分辨率 → 切换至“标准”)
- 修改
6. 一次真实的任务闭环:从指令到结果
让我们用一个完整案例收尾,验证整个链路:
指令:
“打开高德地图,搜索‘上海虹桥站’,点击路线规划,选择地铁,截图保存”
执行过程(简化日志):
[INFO] 截图已捕获(1080×2400) [INFO] VLM解析:当前为高德地图首页,顶部有搜索框,右下角有‘路线’按钮 [INFO] 规划动作1:TAP 搜索框(坐标 x=540, y=120) [INFO] 执行ADB:input tap 540 120 [INFO] 规划动作2:INPUT 文字 '上海虹桥站' [INFO] 执行ADB:input text 上海虹桥站 [INFO] 规划动作3:TAP 搜索结果第一项(x=540, y=380) [INFO] 规划动作4:TAP ‘路线’按钮(x=980, y=2200) [INFO] 规划动作5:TAP ‘地铁’选项(x=320, y=1100) [INFO] 规划动作6:SCREENSHOT 保存至 ./screenshots/route_20240522_143022.png [SUCCESS] 任务完成,共6步,耗时18.3秒结果:一张清晰的地铁路线规划截图,保存在本地文件夹。整个过程无需人工干预,手机全程自动操作。
这不再是概念演示,而是可复用的工作流。你可以把它封装成一个企业内网服务,让客服人员输入“帮用户查询订单物流”,AI自动打开淘宝APP、登录账号、进入订单页、截图物流信息——把重复劳动交给机器。
7. 总结:这不是终点,而是起点
部署Open-AutoGLM的过程,本质上是在搭建一座桥:一端是人类自然语言的模糊表达,另一端是机器对物理世界的精准操控。它不完美——VLM对复杂UI的识别仍有误差,ADB在部分国产ROM上权限受限,长指令的规划深度有待提升。但它的价值恰恰在于“可用”:它把前沿的多模态AI,转化成了一个.py文件、几行命令、一次真实的手机点击。
如果你完成了本文所有步骤,恭喜你已掌握:
- 如何让电脑真正“看见”并“操作”一部手机;
- 如何将大模型能力无缝接入移动端自动化场景;
- 如何排查从硬件连接到网络通信的全链路故障。
下一步,你可以:
- 尝试更换不同指令,观察规划鲁棒性;
- 将
agent.run()封装为Flask API,供其他系统调用; - 在
phone_agent/agent.py中修改plan_action()逻辑,加入业务规则约束(如“禁止点击广告区域”)。
技术的价值,永远不在炫技,而在解决那个你每天都要手动点三次的麻烦事。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。