引言
2024 年被称为 "Agent 元年"。从 OpenAI 的 GPTs 到 Anthropic 的 Computer Use,从 AutoGPT 的爆火到各类 Agent 框架的百花齐放,AI Agent 正在从概念走向落地。然而,很多开发者在实践中发现:写好 Prompt 只是第一步,构建一个可靠、可扩展的 Agent 系统需要全新的工程思维。
本文将带你从 Prompt Engineering 进化到 Agent Engineering,深入探讨 AI Agent 的核心架构设计模式与工程实践。
一、为什么需要 Agent Engineering?
1.1 从简单对话到复杂任务
早期的 LLM 应用主要是单轮问答或多轮对话,核心技巧在于 Prompt Engineering:
- 角色设定(System Prompt)
- 少样本示例(Few-shot)
- 思维链(Chain-of-Thought)
- 输出格式约束(JSON Mode)
但当任务复杂度提升——需要调用工具、访问外部数据、执行多步骤推理、处理错误恢复时,单纯的 Prompt 技巧就显得力不从心。
1.2 Agent 的核心特征
一个真正的 AI Agent 具备以下特征:
| 特征 | 说明 | 示例 |
|---|---|---|
| 自主性 | 能独立决策下一步行动 | 根据任务目标自主规划步骤 |
| 工具使用 | 能调用外部 API/工具 | 查天气、写文件、调用数据库 |
| 记忆能力 | 能维护短期和长期记忆 | 记住用户偏好、对话历史 |
| 反思能力 | 能自我纠错和优化 | 发现错误后重新尝试 |
二、Agent 架构的核心组件
2.1 ReAct 模式:思考-行动-观察循环
ReAct(Reasoning + Acting)是目前最主流的 Agent 架构:
思考(Thought) → 行动(Action) → 观察(Observation) → 思考(Thought) → ...
核心代码示例:
class ReActAgent:
def run(self, query: str) -> str:
context = []
for step in range(max_steps):
# 1. 思考
thought = self.llm.think(query, context)
# 2. 决定行动
action = self.llm.decide_action(thought)
if action.type == "finish":
return action.result
# 3. 执行工具
observation = self.tools.execute(action)
# 4. 更新上下文
context.append({
"thought": thought,
"action": action,
"observation": observation
})
2.2 规划层:从简单循环到复杂规划
根据任务复杂度,Agent 的规划能力可分为三个层级:
Level 1: 单步 ReAct
- 适合:简单查询、单工具调用
- 代表:基础 ChatGPT、简单 RAG
Level 2: 多步规划
- 适合:需要多步骤的任务
- 代表:LangChain Agent、AutoGPT
- 关键:任务分解(Task Decomposition)
Level 3: 分层规划
- 适合:复杂项目、长期任务
- 代表:MetaGPT、OpenAI 的 Swarm
- 关键:高层规划 + 低层执行
2.3 记忆系统:让 Agent 有"记忆"
Agent 的记忆通常分为两类:
短期记忆(Working Memory)
- 当前对话上下文
- 最近的思考过程
- 实现:滑动窗口、Token 限制
长期记忆(Long-term Memory)
- 用户画像和偏好
- 历史任务经验
- 领域知识库
- 实现:向量数据库(RAG)
class MemorySystem:
def __init__(self):
self.short_term = [] # 短期记忆
self.vector_store = VectorStore() # 长期记忆
def retrieve(self, query: str, k: int = 5) -> List[str]:
# 检索相关记忆
return self.vector_store.similarity_search(query, k)
def store(self, experience: str):
# 存储经验到长期记忆
self.vector_store.add_texts([experience])
三、工程实践:构建生产级 Agent
3.1 工具设计原则
好的工具设计是 Agent 成功的关键:
- 原子性:每个工具只做一件事
- 自描述:工具名称和描述要清晰
- 容错性:工具调用失败要有降级方案
- 可观测:记录所有工具调用日志
@tool
def search_database(query: str, limit: int = 10) -> str:
"""
搜索产品数据库,返回匹配的产品列表。
Args:
query: 搜索关键词
limit: 返回结果数量,默认10条
Returns:
JSON 格式的产品列表
"""
try:
results = db.search(query, limit)
return json.dumps(results)
except Exception as e:
return f"搜索失败: {str(e)}"
3.2 错误处理与重试机制
生产环境的 Agent 必须具备鲁棒性:
class RobustAgent:
def execute_with_retry(self, action, max_retries=3):
for attempt in range(max_retries):
try:
result = self.tools.execute(action)
return result
except ToolError as e:
if attempt == max_retries - 1:
return self.fallback_handler(e)
# 让 LLM 分析错误并调整策略
reflection = self.llm.reflect(error=e)
action = self.adjust_action(action, reflection)
3.3 人机协作:Human-in-the-Loop
不是所有决策都应该交给 Agent:
class HumanAssistedAgent:
def run(self, task):
while not task.completed:
action = self.plan_next_action(task)
# 高风险操作需要人工确认
if action.risk_level > 0.7:
approval = self.request_human_approval(action)
if not approval:
continue
result = self.execute(action)
task.update(result)
四、主流 Agent 框架对比
| 框架 | 特点 | 适用场景 |
|---|---|---|
| LangChain | 生态丰富、文档完善 | 快速原型、通用 Agent |
| LlamaIndex | 专注 RAG、数据连接 | 知识库问答、文档分析 |
| AutoGen | 多 Agent 协作 | 复杂任务分解、团队模拟 |
| CrewAI | 角色扮演、流程编排 | 业务流程自动化 |
| OpenAI Swarm | 轻量、官方支持 | 简单多 Agent 系统 |
五、未来展望
5.1 从 Agent 到 Multi-Agent
单个 Agent 的能力有限,未来的趋势是多 Agent 协作:
- 规划 Agent:负责任务分解
- 执行 Agent:负责具体工具调用
- 验证 Agent:负责结果检查
- 学习 Agent:负责经验总结
5.2 从工程到科学
Agent Engineering 正在从经验驱动走向科学驱动:
- 可解释性:理解 Agent 的决策过程
- 可评估性:建立 Agent 能力基准测试
- 可优化性:自动优化 Prompt 和工具链
结语
从 Prompt Engineering 到 Agent Engineering,我们见证了大模型应用从"玩具"走向"工具"再到"伙伴"的进化。构建一个好的 Agent 不仅需要掌握 LLM 的调用技巧,更需要系统性的工程思维:模块化设计、错误处理、可观测性、人机协作。
Agent 时代才刚刚开始,希望本文能为你的 Agent 开发之旅提供一些启发。
参考资源:
- ReAct: Synergizing Reasoning and Acting in Language Models
- LangChain Documentation
- OpenAI Function Calling Guide
本文首发于稀土掘金,转载请注明出处。