2.2 第一段自动化脚本:跑通并读懂日志


文档摘要

2.2 第一段自动化脚本:跑通并读懂日志 本节摘要:本节带你完整跑通第一个真实任务——查天气并做一次页面交互,重点不在代码(只有十几行),而在读懂运行日志:每一行对应指挥循环的哪一拍、模型看到什么、框架做什么。跑通是表,读懂日志是里,这份读日志的能力是第 3 章原理章的入场券。 从一次"成功但看不懂"说起 很多人的第一段智能体脚本是跑通了,终端滚过一大屏输出,扫一眼最终答案对了,就心满意足关掉窗口。这等于命令台打了胜仗,参谋部却没复盘——下一次模型绕远路、点错按钮,你完全说不出问题出在哪一拍。本节把"跑通"和"复盘"绑在一起做:先跑,再逐行读。

2.2 第一段自动化脚本:跑通并读懂日志

本节摘要:本节带你完整跑通第一个真实任务——查天气并做一次页面交互,重点不在代码(只有十几行),而在读懂运行日志:每一行对应指挥循环的哪一拍、模型看到什么、框架做什么。跑通是表,读懂日志是里,这份读日志的能力是第 3 章原理章的入场券。

从一次"成功但看不懂"说起

很多人的第一段智能体脚本是跑通了,终端滚过一大屏输出,扫一眼最终答案对了,就心满意足关掉窗口。这等于命令台打了胜仗,参谋部却没复盘——下一次模型绕远路、点错按钮,你完全说不出问题出在哪一拍。本节把"跑通"和"复盘"绑在一起做:先跑,再逐行读。

图:一段任务的执行时序——日志行与指挥循环的对应

图:一段任务的执行时序——日志行与指挥循环的对应

完整任务脚本

任务设计成"一查一交互":查一个城市的天气,再把结果里最高气温提取出来。它短,却覆盖了导航、读取、提取三种基本动作。

from browser_use import Agent, Browser from langchain_openai import ChatOpenAI agent = Agent( # 任务单要一句话说清目标与产出,别写成流水账 task="打开天气站点,查询杭州今天天气,只回答最高气温是多少度", llm=ChatOpenAI(model="gpt-4o", temperature=0.1), # 低温度保证操作稳定 browser=Browser(), # 默认无头,看不见窗口 ) result = agent.run(max_steps=12) # 步数上限:短任务十二拍足够 print("最终答复:", result)

预期终端输出(简化示意,实际字样因版本而异):

Step 1: 📄 开启页面 天气站点首页 Step 2: 📍 评估:需找到城市搜索框,候选元素已列出 Step 3: 🖱️ 点击元素 索引 9 搜索框 Step 4: ⌨️ 输入文本 杭州 Step 5: 🖱️ 点击元素 索引 15 搜索按钮 Step 6: 📍 评估:结果页已出现,定位今日卡片 Step 7: ✅ 任务完成 最终答复: 最高气温 31 度

逐行复盘这份日志

Step 1 的开启页面:这不是简单导航。框架在此刻抓取了页面的可交互元素清单——每个元素编上号、标注类型(输入框、按钮、链接)。这份"情报简报"就是 3.1 节的主角,此刻你只需要知道:模型看到的不是花花绿绿的页面,而是一张编号清单。

Step 2 与 Step 6 的评估行:模型在回答两个问题——离目标还差什么、刚才那步达没达成分。这就是复核拍。看到评估行频繁出现"评估失败""重试",就是任务要翻车的信号。

Step 3 至 Step 5 的动作行:决策已下,内核执行。注意"索引 9"这种写法——动作指向的是编号而不是选择器,这是第 1 章说的"按语义认路"在日志里的样子。

最后的完成行agent.run() 的返回值装着最终答复和完整轨迹。result 不只是个字符串,轨迹数据在后续排错(第 6 章)时会被反复回看。

首调两个参数

跑通之后立刻做两件事。其一,把 headless=False 打开看一次全程——肉眼盯着页面自己动,是建立直觉最快的方式。其二,故意把任务单写坏:把"只回答最高气温"改成"查一下天气"再看日志,你会发现模型多绕了两步才停下来。这个对照实验说明:任务单的产出约定越明确,复核拍越好判定,步数越省。任务单写作是命令台指挥官的基本功,第 4 章的提取任务里会再练。

任务单写作三要素,逐个拆开

第一要素目标:动名词结构,一个任务单只办一件事。"查天气并顺便把汇率也看看"是两个目标,模型会给你两份掺在一起的答案,复核拍无从判定。第二要素产出:明确到数据形态。"查一下"和"只回答最高气温数字"是两个难度级——前者模型自己决定给你一段话还是一句话,后者复核拍一锤定音。第三要素禁区:写"不要做什么"比写"要做什么"更能防事故,因为模型的默认倾向是"多做一步帮你办完",禁区是给它套缰绳。

三要素齐不齐,可以用一个清单式检查跑一遍:

自查清单: [ ] 目标是否只有一个动词短语? [ ] 产出是否写明了形态(数字/列表/是或否)? [ ] 是否写了至少一条"不要做"? [ ] 找不到目标时怎么办,有没有说?

第四条最容易被忽略。"找不到就明确回答未找到"这句保命话,能防止模型在目标缺失时自由发挥——它硬凑一个答案的场面,你迟早会遇到,有这句话它就只能老实交白卷。

首跑翻车两例,对着日志看病

**例一:无限翻页。**任务"看看新闻列表"烧满十二步触顶。日志里连续的"点击下一页"暴露病因:任务没有产出约定,模型以为"看"就是尽量多看。改写为"看第一页前三条标题"立即两步收兵——这是产出要素缺失的典型病。

**例二:空手而归。**任务"查一下这家公司的地址",模型答"未找到"。肉眼看页面明明有联系信息栏。回放黑匣子发现它把"地址"理解成了"办公地址",而页面写的是"门店位置"。改写为"找出页面上任何形式的地址或门店位置信息"即命中——这是目标要素的语义没有对上页面用词,换词重试比换模型管用。

两个病例指向同一个结论:首跑翻车,八成先改任务单再怀疑别的。这条经验到了 6.3 的速查表里还会被重复一次,因为它实在是最常见的病因。

返回值里还有什么:把 result 当档案读

result 不只是最终答案,它是一份完整案卷。除了答复文本,里面还有每一步的轨迹记录:动作、思考、页面地址、耗时。任务成功时没人看档案,任务翻车时档案就是全部真相——建议从第一天就养成跑完打两行的习惯:

print("最终答复:", result) print("总步数:", len(result.history() if hasattr(result, "history") else [])) # 预期输出形如: # 最终答复: 最高气温 31 度 # 总步数: 7

总步数这个数字值得长期记录:同一任务、不同日期、不同模型跑出来的步数曲线,是任务健康度最便宜的仪表盘——步数稳步上涨往往是页面在变、模型在换、或者任务单被改坏了,三种病都能从这个数字上先看出来。5.3 的巡检体系里,它会成为心跳日志的常驻字段。

环境通了,日志会读了。下一节处理真实业务的拦路虎——登录:让智能体开着你已经登好的本机 Chrome 出车。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U