
构建 AI Agent 听起来很复杂——如果你试图从零开始构建所有东西,确实如此。但核心模式很简单:给语言模型访问工具的权限,让它决定何时使用哪个工具,然后不断循环直到目标达成。
本指南将一步步带你构建一个 AI Agent,从架构设计到可运行代码。结束时,你将拥有一个功能齐全的 Agent,能够搜索网页、生成图像并交付结果——全部通过一个统一的 CLI 完成。
什么是 AI Agent?
在写代码之前,先定义我们要构建的东西。
AI Agent 是一个接收目标、规划一系列行动、使用工具执行这些行动、观察结果并自我调整的系统。与仅响应单次提示的聊天机器人不同,Agent 会自主朝着目标推进——可能跨越数十次工具调用。
聊天机器人:"总结这篇文章。" → 返回摘要。 AI Agent:"研究这个主题,找到最佳来源,撰写报告并发布。" → 规划、搜索、阅读、撰写、发布。
Agent 的力量来自它的工具——它能调用的能力。没有工具,Agent 只是一个带着长提示的语言模型。有了工具,它就能与外部世界交互。
AI Agent 的架构
每个 Agent 都遵循同一个基本循环:
┌─────────────────────────────────────────┐
│ AGENT 循环 │
│ │
│ 1. 接收目标 │
│ 2. 思考:接下来该做什么? │
│ 3. 行动:选择并调用一个工具 │
│ 4. 观察:结果是什么? │
│ 5. 判断:目标达成了吗? │
│ → 没有?回到第 2 步。 │
│ → 达成了?返回结果。 │
└─────────────────────────────────────────┘
这就是所谓的 ReAct 模式(推理 + 行动)。每个 Agent 框架——LangChain、CrewAI、AutoGen、OpenAI Agents SDK——都以某种形式实现了这个循环。
你需要的三个组件:
- 语言模型——推理引擎(Claude、GPT-4o、Gemini)
- 一组工具——Agent 能做什么(搜索、爬取、生成、存储、发布)
- 编排器——决定接下来调用哪个工具的循环
第一步:选择你的工具
工具决定了你的 Agent 能做到什么。从这个问题开始:"我的 Agent 在现实世界中需要做什么?"
常见的 Agent 工具:
| 能力 | 为什么重要 |
|---|---|
| 网页搜索 | 研究、事实核查、竞品分析 |
| 网页爬取 | 深度阅读特定页面、数据提取 |
| 图像生成 | 创建视觉内容、图表、素材 |
| 文件存储 | 持久化输出、分享、资产管理 |
| 网页发布 | 将完成的工作交付为在线页面 |
| 代码执行 | 运行脚本、数据处理、自动化 |
大多数初学者犯的错误是:给 Agent 的工具太少,然后困惑为什么它什么都做不了。只具备搜索能力的 Agent 只能返回链接。而搜索 + 爬取 + 存储 + 发布能力的 Agent 可以产出完整的、可交付的成果。
最简单的工具配置方法:使用统一的能力层,将搜索、爬取、图像生成、存储和发布整合在一个接口背后。你不需要配置五个独立的 API、管理五套凭证,你的 Agent 只需调用一个 CLI、使用一个认证流程。这保持了 Agent 循环的简洁,也降低了 token 开销。
第二步:定义 Agent 的系统提示
系统提示是 Agent 的"操作手册"。它告诉模型自己是什么、有哪些工具以及如何使用它们。
一个好的系统提示包含四个部分:
- 身份:Agent 是什么
- 目标:它应该完成什么
- 工具:它能使用什么、什么时候用
- 约束:它不应该做什么
示例:
你是一个研究型 Agent。你的目标是对给定主题进行深入研究,
并生成一份全面的报告。
你可以使用以下工具:
- search:在网页上查找信息。用于广泛研究。
- crawl:完整阅读特定网页。在找到有前景的来源后使用。
- drive upload:持久保存报告和素材。
- page deploy:将最终报告发布为网页。
工作流程:
1. 从广泛搜索查询开始,了解全局状况。
2. 识别最权威的来源并进行爬取。
3. 将发现综合整理成结构化报告。
4. 将报告上传到 Drive 安全保存。
5. 将报告部署为已发布页面。
约束:
- 始终引用来源。
- 如果某个来源与另一个来源矛盾,进一步调查。
- 绝不编造信息。
第三步:实现 Agent 循环
以下是一个最小化的 Python Agent 循环。这个模式可直接用于生产——思考、行动、观察、重复:
import subprocess
import json
def call_tool(tool_name, **params):
"""执行工具并返回结果。"""
if tool_name == "search":
result = subprocess.run(
["anycap", "search", "--prompt", params["query"]],
capture_output=True, text=True
)
return json.loads(result.stdout)
elif tool_name == "crawl":
result = subprocess.run(
["anycap", "crawl", params["url"]],
capture_output=True, text=True
)
return result.stdout
elif tool_name == "drive_upload":
subprocess.run(
["anycap", "drive", "upload", params["file"]],
capture_output=True
)
return {"status": "uploaded", "file": params["file"]}
elif tool_name == "page_deploy":
result = subprocess.run(
["anycap", "page", "deploy", params["file"]],
capture_output=True, text=True
)
return json.loads(result.stdout)
# Agent 循环
def agent_loop(goal, tools, max_steps=20):
memory = [{"role": "system", "content": SYSTEM_PROMPT}]
memory.append({"role": "user", "content": goal})
for step in range(max_steps):
response = llm_call(memory, tools)
if response.get("done"):
return response["result"]
tool_name = response["tool"]
tool_params = response["params"]
result = call_tool(tool_name, **tool_params)
memory.append({"role": "assistant", "content": str(response)})
memory.append({"role": "tool", "content": str(result)})
return "Agent 达到最大步数但未完成目标。"
第四步:处理失败
Agent 会失败。问题在于它如何处理。从一开始就构建以下安全机制:
超时保护
不要让 Agent 无限循环。设置最大步数和时间限制。如果 Agent 超出任一限制,它应该返回当前已有的结果——而不是静默崩溃。
工具失败恢复
当工具调用失败时——URL 无法访问、API 返回错误——Agent 应该收到错误消息并决定下一步怎么做。不要对 Agent 隐藏错误。它需要知道什么时候出了问题。
try:
result = call_tool(tool_name, **tool_params)
except Exception as e:
result = {"error": str(e), "suggestion": "尝试替代方案"}
成本意识
每次搜索、每次爬取、每次图像生成都会消耗额度。给 Agent 设定预算,并让它意识到成本。一个为了回答简单问题而消耗 100 次搜索的 Agent 是设计不良的。
第五步:Demo 与生产的区别
Demo Agent 和有用 Agent 之间的区别在于现实世界的工具访问能力。Demo Agent 返回文本。有用的 Agent 返回已发布的报告、生成好的图像或已部署的网页。
生产级 Agent 需要五种能力:搜索网页、阅读特定页面、生成视觉内容、持久存储输出、发布完成的工作。Agent 的代码保持简单——它只调用所需的工具。API 集成、认证和错误处理的复杂性存在于运行时中,而不是你的 Agent 循环里。
构建 Agent 时的常见错误
错误一:没有退出条件
没有明确"完成"信号的 Agent 会永远循环。明确定义成功:当 Agent 生成特定输出(报告、已部署的页面)或确认目标不可达成时,即视为完成。
错误二:工具太少
"仅搜索"型 Agent 只是美化的搜索引擎。给你的 Agent 完整的管道:查找 → 阅读 → 创建 → 存储 → 交付。
错误三:忽略工具结果
Agent 有时会调用工具后忽略其输出,基于自己对结果的假设继续推进。强制 Agent 将每个工具结果纳入下一步决策。
错误四:过度设计循环
大多数场景下你不需要自定义编排框架。一个有良好系统提示和强大工具的简单 ReAct 循环,在 80% 的任务中表现优于复杂的多 Agent 设置。
从教程到生产
你在这里构建的 Agent 是一个起点。要让它达到生产就绪状态:
- 添加日志:记录每次工具调用、其结果以及 Agent 的推理过程,便于调试。
- 添加人机协作:对于高风险操作(发布、发送邮件),需要人工审批。
- 添加监控:跟踪成功率、每次任务的平均步数和工具调用分布,以识别瓶颈。
- 迭代系统提示:提示是 Agent 的大脑。根据实际使用模式进行调整。
构建 AI Agent 不在于复杂架构,而在于给推理引擎配备合适的工具和清晰的目标。从简单开始:一个模型、3-5 个工具、一个基本循环。只有在简单版本确实不够用时,才增加复杂性。