Open-AutoGLM日志查看技巧:问题定位与调试实战
Open-AutoGLM – 智谱开源的手机端AI Agent框架。它基于视觉语言模型,结合 ADB 自动化控制能力,让 AI 能“看懂”手机屏幕并执行真实操作。用户只需用自然语言下达指令,系统即可自动解析意图、理解界面、规划动作路径,并完成点击、滑动、输入等交互行为。
AutoGLM-Phone 是一个面向移动端的智能助理框架,能够以多模态方式感知屏幕内容,通过 ADB 实现设备操控。无论是打开应用、搜索内容,还是处理复杂流程如登录验证,它都能在理解上下文的基础上自主决策。Phone Agent 在此基础上进一步封装,提供更稳定的执行逻辑和远程调试支持,适用于本地开发、远程测试以及自动化任务场景。整个系统依赖于云端运行的 vLLM 模型服务,本地仅负责图像采集、指令转发与设备控制,实现了轻量化客户端 + 高性能推理后端的架构设计。
当你在使用 Open-AutoGLM 执行任务时遇到失败、卡顿或异常行为,直接看结果是不够的——你需要深入日志,才能真正搞清楚 AI 到底“看到了什么”、“怎么想的”、“做了什么”。本文将带你掌握 Open-AutoGLM 的日志结构、关键信息提取方法,并结合真实调试案例,手把手教你如何快速定位问题根源。
1. 日志系统概览:Open-AutoGLM 的“黑匣子”记录了什么?
Open-AutoGLM 的日志贯穿从用户输入到设备操作的全链路,分布在多个模块中。要高效排查问题,首先要了解这些日志来自哪里、记录了哪些内容。
1.1 核心日志来源
| 模块 | 日志位置 | 主要内容 |
|---|---|---|
| 控制端(Open-AutoGLM) | 终端输出 /logs/目录(如有) | 用户指令解析、ADB 通信状态、截图上传、API 调用记录、动作执行反馈 |
| vLLM 推理服务端 | 启动终端或日志文件(如nohup.out) | 模型加载、请求接收、文本生成过程、错误堆栈 |
| ADB 层 | 系统级输出(adb logcat 可辅助) | 设备连接状态、权限拒绝、输入事件是否成功注入 |
| 手机端(ADB Keyboard) | 无显式日志,但可通过行为反推 | 文字输入是否生效、特殊字符处理情况 |
整个流程可以简化为:
用户指令 → 控制端打包请求 → 发送至 vLLM → 模型返回操作计划 → 控制端解析并执行 ADB 命令 → 设备响应 → 截图反馈 → 循环每一环节都可能出错,而日志就是你唯一的“现场证据”。
1.2 如何开启详细日志输出?
默认情况下,main.py输出的信息较为简洁。为了便于调试,建议启用详细模式:
python main.py \ --device-id YOUR_DEVICE_ID \ --base-url http://your-server-ip:8800/v1 \ --model "autoglm-phone-9b" \ --verbose \ "打开小红书搜索美食"添加--verbose参数后,你会看到更多中间步骤的打印信息,包括:
- 当前屏幕截图的保存路径
- 向模型发送的完整 prompt
- 模型返回的原始 JSON 输出
- 每一步 ADB 命令的具体执行情况
这是第一步——让系统“说话”。
2. 日志分析实战:从典型问题入手
我们通过几个常见的实际问题,来演示如何一步步从日志中找出线索。
2.1 问题一:AI “看不懂”当前页面,反复点击错误按钮
现象描述:
你让 AI 打开微博并刷新首页,但它一直点到了侧边栏的“消息”图标,而不是顶部刷新区域。
查看日志发现:
[INFO] Capturing screen... [DEBUG] Screenshot saved to ./screenshots/scr_20250405_142312.png [INFO] Sending image + instruction to model... [PROMPT] 你是一个手机助手。请根据当前屏幕内容判断下一步操作。 指令:下拉刷新微博首页 可选动作:CLICK, SWIPE_UP, SWIPE_DOWN, TYPE, BACK, HOME 请输出格式:{"action": "...", "reason": "...", "target": "..."} --- 模型返回: {"action": "CLICK", "reason": "用户想刷新首页,我看到左上角有消息图标,可能是入口", "target": "消息"}问题定位:
模型误判了 UI 元素的功能。虽然它“看到”了消息图标,但错误地认为那是刷新入口。
解决方案:
- 优化提示词(Prompt Engineering):增强对“刷新”动作的定义,例如加入:“通常通过下拉顶部状态栏实现”。
- 增加上下文记忆:如果前一步已在微博首页,应提醒模型保持上下文一致性。
- 人工标注反馈机制:收集此类错误样本,用于后续微调。
提示:你可以手动打开
scr_20250405_142312.png查看截图是否清晰、是否有遮挡(如弹窗),这也是排查的第一步。
2.2 问题二:模型返回乱码或非法 JSON,导致程序崩溃
现象描述:
运行过程中程序突然退出,终端报错:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes查看日志片段:
[RESPONSE] {"action": "SWIP↓E", "reason": "滑动查看更多内容", "target": "feed list"}问题定位:
模型输出中出现了非法字符↓,破坏了 JSON 结构。这通常是由于模型训练数据中混入了非标准符号,或解码过程出现偏差。
解决方法:
- 后端预处理修复:在解析模型输出前,先做一次清洗:
import re def clean_response(text): # 替换非常规符号 text = re.sub(r'[^\x00-\x7F]+', '', text) # 移除非ASCII字符 # 补全引号等常见错误(可选) return text - 设置最大重试次数:当 JSON 解析失败时,自动重新请求一次。
- 升级 vLLM 版本:确保使用最新版 vLLM,其对输出稳定性有更好的控制策略。
预防建议:
在部署 vLLM 时,添加以下参数提升输出稳定性:
--guided-decoding-backend outlines # 强制模型按 schema 输出 --max-model-len 8192 # 避免截断导致 JSON 不完整2.3 问题三:ADB 操作无响应,设备没反应
现象描述:
日志显示“执行 CLICK at (540, 960)”,但手机屏幕没有任何变化。
检查日志输出:
[INFO] Executing ADB command: input tap 540 960 [DEBUG] ADB exit code: 0看起来命令执行成功(exit code 为 0),但实际无效。
深入排查方向:
- 确认 ADB Keyboard 是否设为默认输入法
如果不是,某些输入框无法通过 ADB 正常输入文字。 - 检查手机是否处于锁屏状态
ADB 在锁屏状态下多数操作会被系统拦截。 - 查看
adb logcat输出是否有权限拒绝记录:
可能出现类似:adb logcat | grep -i "denied"InputDispatcher: channel ~ Access Denied [ Rejected Event Type: ACTION_DOWN ]
解决方案:
- 确保开发者选项中的“USB 调试”和“模拟点击”权限已开启。
- 使用
adb shell dumpsys window windows | grep mCurrentFocus查看当前焦点窗口是否合法。 - 若频繁掉线,改用 USB 连接替代 WiFi。
3. 关键日志字段解读:学会“读代码之外的信息”
除了整体流程,还有一些隐藏在细节里的关键日志信息,往往能帮你省下大量时间。
3.1 截图质量与上传延迟
日志中会记录截图获取与上传耗时:
[INFO] Capturing screen... (start) [INFO] Screenshot captured in 1.2s [INFO] Uploading image to server... (size: 1.8MB) [INFO] Upload completed in 3.5s分析要点:
- 如果截图耗时 >2s,说明设备性能较差或内存紧张。
- 如果上传耗时 >3s,可能是网络带宽不足,尤其是使用远程服务器时。
- 图片过大(>2MB)会影响模型推理速度,可考虑压缩:
from PIL import Image img = Image.open("screenshot.png") img.save("screenshot.jpg", "JPEG", quality=75)3.2 动作执行频率与循环判断
Open-AutoGLM 采用“感知-决策-执行”循环。正常情况下每轮间隔 2~5 秒。
观察日志中的时间戳:
[14:23:12] [STEP 1] 下拉刷新 [14:23:15] [STEP 2] 等待加载完成 [14:23:18] [STEP 3] 发现“推荐博主”卡片但如果出现:
[14:23:12] [STEP 1] 点击搜索框 [14:23:13] [STEP 2] 再次点击搜索框 [14:23:14] [STEP 3] 再次点击搜索框说明模型陷入了死循环,原因可能是:
- 上一步操作未生效(如输入法未切换)
- 模型未收到新的截图反馈
- 返回的动作判断逻辑缺失终止条件
应对策略:
- 设置最大执行步数(如 10 步),超限则中断。
- 添加“重复动作检测”逻辑,连续两次相同操作则告警。
4. 高级调试技巧:远程开发与日志聚合
对于团队协作或远程部署场景,仅靠本地终端日志远远不够。以下是几种进阶做法。
4.1 使用screen或tmux保持后台运行
在云服务器上启动 vLLM 时,务必使用会话管理工具,避免 SSH 断开导致服务中断:
# 创建持久会话 screen -S vllm-server # 启动服务 python -m vllm.entrypoints.openai.api_server --host 0.0.0.0 --port 8800 ... # 按 Ctrl+A+D 脱离会话重新连接:
screen -r vllm-server这样即使网络波动也不会丢失日志。
4.2 将日志写入文件以便追溯
修改main.py启动方式,将输出重定向到日志文件:
python main.py ... "打开抖音关注某博主" >> agent.log 2>&1或者使用tee同时查看和保存:
python main.py ... | tee -a session_$(date +%Y%m%d).log方便事后回溯问题发生的时间点。
4.3 构建简易监控面板(可选)
对于高频使用场景,可编写一个简单的日志解析脚本,提取关键事件:
import re def parse_log(file_path): pattern = r'\[(.*?)\] \[STEP (\d+)\] (.*)' steps = [] with open(file_path) as f: for line in f: match = re.search(pattern, line) if match: time, step, action = match.groups() steps.append({"time": time, "step": int(step), "action": action}) return steps然后生成可视化报告或报警机制。
5. 总结:建立你的调试 checklist
面对 Open-AutoGLM 的各种“迷之操作”,不要慌张。按照这个 checklist 一步步排查,绝大多数问题都能快速解决。
5.1 快速问题定位 checklist
- ✅设备连接正常?
adb devices是否列出设备且状态为device? - ✅截图能否正常获取?
查看screenshots/目录是否有最新图片,内容是否清晰? - ✅模型返回是否合法?
检查是否有乱码、非 JSON 输出、空响应? - ✅ADB 命令是否执行?
查看日志中input tap或swipe是否被调用? - ✅手机端权限是否齐全?
开发者模式、USB 调试、ADB Keyboard 默认输入法均已开启? - ✅网络是否通畅?
控制端能否 ping 通云服务器?防火墙是否放行端口?
5.2 推荐最佳实践
- 开发阶段始终使用
--verbose模式运行。 - 定期清理旧截图,避免磁盘占满影响性能。
- 对重要任务保留完整日志文件,便于复现问题。
- 使用 USB 连接进行调试,比 WiFi 更稳定。
- 在云服务器部署 vLLM 时,预留足够显存(至少 24GB for 9B 模型)。
掌握日志分析能力,是你从“会用”走向“精通”的关键一步。Open-AutoGLM 不只是一个工具,更是一个可观测的 AI 决策系统。只有读懂它的“思考痕迹”,你才能真正驾驭它,让它成为你手中最聪明的手机助手。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。