最近几个月,AI Agent 的概念火得一塌糊涂。从 Devin 到各种开源项目,仿佛一夜之间,我们离“让 AI 自己写代码、自己工作”的未来又近了一步。作为一个喜欢折腾的技术爱好者,我自然是心痒难耐,决定亲手搭建一个属于自己的、小而美的 AI Agent,看看它到底能不能“自己跑起来”。

我的目标:自动化一个烦人的小任务

我给自己设定的目标很简单:我有很多个人项目和网站,部署在不同的服务器上。我需要定期检查这些网站是否都能正常访问。这个任务虽然不复杂,但很琐碎,每次手动检查都很浪费时间。

于是,我的 AI Agent 的任务就是:

  1. 读取一个包含我所有网站地址的列表。
  2. 自动编写一个脚本,去检查每个网站的 HTTP 状态码。
  3. 如果发现有网站访问不了(比如超时、返回404或500错误),就把异常的网址记录下来。
  4. 最后,生成一份报告,通过邮件发送给我。

工具选择:大道至简

虽然现在有很多成熟的 Agent 框架(比如 LangChain、AutoGen),但我决定返璞归真,直接用 Python + OpenAI 的 API 来实现。原因有二:

  • 我想理解核心原理:我想弄清楚一个 Agent 的思考链路到底是怎样的,而不是被框架的复杂性所迷惑。
  • 任务相对简单:我的目标不需要多智能体协作那么复杂,一个简单的循环调用 LLM 的结构就足够了。

构建过程:与 AI 的“对话”

我的核心思路是,让一个“主管”Agent 来拆解任务,然后一步步地调用 LLM(我称之为“程序员”Agent)来生成并执行代码。

第一步:定义“主管”Agent

我写了一个 Python 脚本,作为整个流程的控制器。它的职责是:

  1. 定义好最终目标。
  2. 将目标拆解成一个个具体的、可执行的小步骤。
  3. 循环执行这些步骤,把每一步的结果作为下一步的输入。
# 一个极简的 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,让代码自己跑起来,这感觉真的很酷。