什么是 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

# 工具1:搜索网页
def web_search(query: str) -> str:
"""搜索互联网,返回相关结果"""
# 示例:使用 DuckDuckGo 的免费接口
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)

# 工具2:数学计算
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() # 也可以用任何兼容 OpenAI API 的服务

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()) # assistant 消息

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%,价格约为......
- 特斯拉股价昨日收于......

进阶模式

Tool Use 的三种范式

范式 说明 适用场景
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,建议的路径是:

  1. 先手写一个极简 Agent(就上面那个 100 行代码)→ 理解底层循环
  2. 用 Claude Agent SDK 跑一遍 → 理解工业级实现要考虑什么(重试、错误处理、token管理)
  3. 看 LangChain 源码的 AgentExecutor → 理解抽象层设计
  4. 写一个解决自己实际问题的 Agent → 掌握的终点是能落地

最后送上一句话:不要只调框架 API,理解循环就是理解了一切。Agent 的本质就是一个 while 循环里调用 LLM,外层包装工具执行和错误处理——仅此而已。


本文代码仅用于学习交流,生产环境请使用成熟的 Agent 框架。