什么是 AI Agent
AI Agent(智能体)是一个能够自主感知环境、做出决策、执行动作的AI系统。不同于传统的”一问一答”聊天机器人,Agent 具备以下核心能力:
| 能力 |
说明 |
举例 |
| 工具调用 |
调用外部函数/API 执行操作 |
查数据库、发邮件、读写文件 |
| 规划推理 |
将复杂任务拆解为多步执行 |
先搜索→再分析→最后汇总 |
| 记忆系统 |
持久化上下文,跨对话保留信息 |
记住用户偏好、历史决策 |
| 反思纠错 |
检查执行结果,修正错误 |
代码报错后自动调试重试 |
简单来说:Agent = LLM + 工具 + 循环控制。
核心架构
一个经典的 Agent 运行流程如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| ┌──────────────┐ │ User Input │ └──────┬───────┘ ▼ ┌──────────────────┐ │ LLM (大脑) │◄─── 系统提示词 + 工具描述 + 历史消息 └──────┬───────────┘ ▼ ┌───┴───┐ │ 决策 │ └───┬───┘ ┌───┴──────┐ ▼ ▼ ┌─────┐ ┌──────┐ │工具调用│ │文本回复│ └──┬──┘ └──┬───┘ ▼ ▼ ┌──────────────────┐ │ 结果 → 下一轮循环 │ └──────────────────┘
|
用伪代码表示就是这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| def agent_loop(user_input): messages = [system_prompt, user_input] while True: response = llm.chat(messages) if response.has_tool_call(): result = execute_tool(response.tool_call) messages.append(response) messages.append(tool_result_to_message(result)) else: return response.text
|
动手实现一个简单的 Agent
下面用 Python 从零实现一个带工具调用的 Agent,帮助你理解底层原理。
1. 定义工具
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import json import requests
def web_search(query: str) -> str: """搜索互联网,返回相关结果""" url = f"https://api.duckduckgo.com/?q={query}&format=json" resp = requests.get(url, timeout=10) data = resp.json() results = data.get("RelatedTopics", [])[:3] return json.dumps([r.get("Text", "") for r in results], ensure_ascii=False)
def calculator(expression: str) -> str: """安全计算数学表达式""" try: import re if not re.match(r'^[\d\s+\-*/().%]+$', expression): return "Error: 包含非法字符" return str(eval(expression)) except Exception as e: return f"Error: {e}"
|
2. 定义工具 Schema
LLM 需要知道有哪些工具、何时调用它们。工具描述用 JSON Schema 定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| TOOLS = [ { "type": "function", "function": { "name": "web_search", "description": "搜索互联网获取信息,当需要查找实时资料时使用", "parameters": { "type": "object", "properties": { "query": { "type": "string", "description": "搜索关键词" } }, "required": ["query"] } } }, { "type": "function", "function": { "name": "calculator", "description": "计算数学表达式,当需要精确计算时使用", "parameters": { "type": "object", "properties": { "expression": { "type": "string", "description": "数学表达式,如 '(2+3)*4'" } }, "required": ["expression"] } } } ]
TOOL_MAP = { "web_search": web_search, "calculator": calculator }
|
3. 实现 Agent 循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| from openai import OpenAI
client = OpenAI()
SYSTEM_PROMPT = """你是一个智能助手,可以: 1. 使用 web_search 搜索最新信息 2. 使用 calculator 进行精确计算
遇到需要查资料的问题先搜索;遇到计算问题先算再回答。 不要编造没有搜索过的信息。"""
def run_agent(user_input: str, max_turns: int = 5) -> str: messages = [ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": user_input} ] for turn in range(max_turns): response = client.chat.completions.create( model="claude-sonnet-5-20251001", messages=messages, tools=TOOLS, tool_choice="auto" ) msg = response.choices[0].message if not msg.tool_calls: return msg.content messages.append(msg.model_dump()) for tool_call in msg.tool_calls: func_name = tool_call.function.name func_args = json.loads(tool_call.function.arguments) print(f"[Agent] 调用工具: {func_name}({func_args})") result = TOOL_MAP[func_name](**func_args) messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": result }) return "达到最大轮次限制"
if __name__ == "__main__": result = run_agent("昨天BTC涨了多少?特斯拉股价是多少?") print(f"[回复] {result}")
|
4. 运行效果
1 2 3 4 5
| [Agent] 调用工具: web_search({'query': 'BTC price change yesterday 2026-07-08'}) [Agent] 调用工具: web_search({'query': 'Tesla stock price 2026-07-08'}) [回复] 根据搜索结果显示: - BTC 昨日上涨约X%,价格约为...... - 特斯拉股价昨日收于......
|
进阶模式
| 范式 |
说明 |
适用场景 |
| ReAct |
思考→行动→观察→循环 |
需要多步推理的任务 |
| Plan-Execute |
先生成完整计划,再逐步执行 |
复杂、可预见的任务 |
| Router |
根据输入类型路由到不同处理器 |
多分支的业务系统 |
ReAct 模式示例
ReAct(Reasoning + Acting)是最经典的 Agent 模式,核心思想是边思考边行动:
1 2 3 4 5 6 7 8 9 10 11 12
| User: 旧金山今天的温度是多少华氏度?
Thought: 我需要查旧金山今天的气温,应该用搜索工具 Action: web_search("San Francisco temperature today") Observation: 旧金山今天 15°C
Thought: 用户要华氏度,需要转换:F = C × 9/5 + 32 Action: calculator("15 * 9 / 5 + 32") Observation: 59
Thought: 现在可以回答用户了 Answer: 旧金山今天气温 59°F (15°C)
|
多 Agent 协作
复杂任务可以通过多个专业 Agent 分工协作完成:
1 2 3 4 5 6 7 8 9 10 11 12 13
| ┌──────────┐ │ Orchestrator│ ← 任务分配与调度 └─────┬─────┘ ┌──────┼──────┐ ▼ ▼ ▼ ┌──────┐┌──────┐┌──────┐ │Coder ││Review││Test │ │Agent ││Agent ││Agent │ └──┬───┘└──┬───┘└──┬───┘ ▼ ▼ ▼ ┌────────────────────┐ │ 共享工作区 │ └────────────────────┘
|
关键原则:
- 每个 Agent 职责单一、提示词不同
- 通过共享状态(文件/消息)通信
- Orchestrator 负责最终决策
主流框架对比
| 框架 |
特点 |
适合 |
| Claude Agent SDK |
Claude 原生支持,worktree隔离,结构化输出 |
Claude 深度用户 |
| LangChain |
生态完善,组件丰富 |
需要快速搭建多模型 |
| CrewAI |
多 Agent 角色扮演 |
团队协作式任务 |
| AutoGen |
微软出品,对话驱动 |
研究实验、多 Agent 对话 |
| 自实现 |
完全可控,代码精简 |
学习原理、定制需求 |
个人推荐
如果刚开始学习 AI Agent,建议的路径是:
- 先手写一个极简 Agent(就上面那个 100 行代码)→ 理解底层循环
- 用 Claude Agent SDK 跑一遍 → 理解工业级实现要考虑什么(重试、错误处理、token管理)
- 看 LangChain 源码的 AgentExecutor → 理解抽象层设计
- 写一个解决自己实际问题的 Agent → 掌握的终点是能落地
最后送上一句话:不要只调框架 API,理解循环就是理解了一切。Agent 的本质就是一个 while 循环里调用 LLM,外层包装工具执行和错误处理——仅此而已。
本文代码仅用于学习交流,生产环境请使用成熟的 Agent 框架。