最近几个月,AI Agent 的概念火得一塌糊涂。从 Devin 到各种开源项目,仿佛一夜之间,我们离“让 AI 自己写代码、自己工作”的未来又近了一步。作为一个喜欢折腾的技术爱好者,我自然是心痒难耐,决定亲手搭建一个属于自己的、小而美的 AI Agent,看看它到底能不能“自己跑起来”。
我的目标:自动化一个烦人的小任务
我给自己设定的目标很简单:我有很多个人项目和网站,部署在不同的服务器上。我需要定期检查这些网站是否都能正常访问。这个任务虽然不复杂,但很琐碎,每次手动检查都很浪费时间。
于是,我的 AI Agent 的任务就是:
- 读取一个包含我所有网站地址的列表。
- 自动编写一个脚本,去检查每个网站的 HTTP 状态码。
- 如果发现有网站访问不了(比如超时、返回404或500错误),就把异常的网址记录下来。
- 最后,生成一份报告,通过邮件发送给我。
工具选择:大道至简
虽然现在有很多成熟的 Agent 框架(比如 LangChain、AutoGen),但我决定返璞归真,直接用 Python + OpenAI 的 API 来实现。原因有二:
- 我想理解核心原理:我想弄清楚一个 Agent 的思考链路到底是怎样的,而不是被框架的复杂性所迷惑。
- 任务相对简单:我的目标不需要多智能体协作那么复杂,一个简单的循环调用 LLM 的结构就足够了。
构建过程:与 AI 的“对话”
我的核心思路是,让一个“主管”Agent 来拆解任务,然后一步步地调用 LLM(我称之为“程序员”Agent)来生成并执行代码。
第一步:定义“主管”Agent
我写了一个 Python 脚本,作为整个流程的控制器。它的职责是:
- 定义好最终目标。
- 将目标拆解成一个个具体的、可执行的小步骤。
- 循环执行这些步骤,把每一步的结果作为下一步的输入。
# 一个极简的 Agent 伪代码
goal = "检查网站状态并发送邮件报告"
sub_tasks = [
"1. 读取 'websites.txt' 文件中的网址列表。",
"2. 编写一个 Python 函数,该函数接收一个 URL,并返回其 HTTP 状态码。",
"3. 遍历所有网址,调用步骤2的函数,筛选出有问题的网址。",
"4. 编写一个函数,将有问题的网址列表格式化成一份 HTML 报告。",
"5. 编写一个函数,通过 SMTP 发送这份 HTML 报告到我的邮箱。"
]
context = {} # 用于存储每一步的上下文,比如代码、变量等
for task in sub_tasks:
# 调用 LLM 来完成每个子任务
result = execute_task(task, context)
# 将结果更新到上下文中,供后续任务使用
context.update(result)
第二步:与“程序员”Agent 互动
execute_task
函数是关键,它会把每个子任务的描述发送给 GPT-4,并要求它返回可执行的 Python 代码。
例如,对于任务“2. 编写一个 Python 函数…”,我发送的 Prompt 大概是这样的:
你是一个 Python 编程专家。请编写一个名为
check_website_status
的函数,它接收一个url
参数,使用requests
库检查该网址的健康状况。如果请求成功(状态码200),函数返回None
。如果请求失败(例如超时、连接错误或HTTP错误码),函数应捕获异常并返回包含错误信息的字符串。
LLM 会返回一段代码,然后我的主管脚本会使用 exec()
来动态执行这段代码,并将 check_website_status
这个函数存入上下文 context
中,供后续步骤使用。
第三步:“Aha!” 时刻
最让我兴奋的时刻,是当 Agent 跑完所有流程,我的收件箱里真的收到了一封格式精美的报告邮件时。整个过程完全自动化,我没有手动写一行检查逻辑或发送邮件的代码。
虽然我写的“主管”脚本很简单,甚至有些简陋,但它确实 work 了!我体会到了那种“指挥若定”,看着 AI 小弟勤勤恳恳地把活干完的快感。
一些思考和展望
这次小小的尝试,让我对 AI Agent 有了更深的理解:
- 任务拆解是关键:Agent 的“智商”很大程度上取决于我们如何将一个大目标拆解成清晰、明确、无歧义的小任务。喂给它一个模糊的目标,它也会还给你一堆垃圾代码。
- 成本与效益:完成这个任务,我大概调用了十几次 GPT-4 API,花费了几毛钱。但它帮我节省了未来无数次手动检查的时间。对于重复性劳动,AI Agent 的效益是显而易见的。
- 局限性依然存在:我这个简陋的 Agent 还不具备自我调试的能力。如果 LLM 生成的代码有 bug,或者执行环境有问题,整个流程就会中断。这是未来需要改进的方向。
总的来说,AI Agent 不是银弹,它更像是一个能力被放大了无数倍的“实习生”。你需要清晰地给它布置任务,它才能高效地完成工作。但我相信,随着技术的进步,未来的程序员将花更多的时间在“定义问题”和“设计系统”上,而不是埋头于具体的代码实现。
这确实是一个令人兴奋的时代,不是吗?拥抱 AI,让代码自己跑起来,这感觉真的很酷。
...