一、AI Agent 概述
1.1 什么是 Agent?
AI Agent(人工智能代理)是一种能够自主感知环境、做出决策并执行行动的智能系统。与传统的简单问答不同,Agent 具有目标导向 、自主规划 和工具使用能力,可以完成复杂的多步骤任务。
1.2 Agent 与普通 AI 对话的区别
| 特性 | 普通 AI 对话 | AI Agent |
|---|---|---|
| 交互模式 | 被动响应 | 主动规划 |
| 任务执行 | 仅生成文本 | 调用工具执行 |
| 记忆能力 | 无状态 | 持续记忆 |
| 复杂任务 | 难以处理 | 分解执行 |
| 自主性 | 完全依赖用户 | 半自主/全自主 |
1.3 核心架构:感知-决策-行动
AI Agent 的核心是一个闭环反馈系统:

- 感知层:接收用户输入、外部环境数据
- 决策层:LLM 大脑进行理解、规划、推理
- 行动层:调用工具、执行操作、生成响应
二、Agent 核心组件
2.1 LLM 大脑
大型语言模型是 Agent 的核心决策引擎,负责:
- 理解用户意图
- 生成执行计划
- 处理和响应信息
2.2 记忆系统
Agent 的记忆分为两类:
- 短期记忆:当前对话上下文,通常通过消息历史实现
- 长期记忆:持久化存储的知识和经验
2.3 工具调用(Tools)
Agent 通过调用外部工具扩展能力:
- 搜索工具(搜索网络、查询数据库)
- 计算工具(执行数学运算)
- API 工具(调用第三方服务)
- 文件操作(读写文件)
2.4 规划能力
Agent 需要具备任务分解能力,将复杂任务拆解为可执行的子任务。
三、从零搭建一个简单 Agent
下面我们用 Python 从零构建一个基础 Agent 框架:
python
"""
AI Agent 基础框架
实现核心组件:LLM 调用、工具注册、对话循环
"""
import json
import os
from typing import List, Dict, Any, Callable
from dataclasses import dataclass, field
from openai import OpenAI
# ============ 1. 工具定义 ============
@dataclass
class Tool:
"""工具定义类"""
name: str # 工具名称
description: str # 工具描述(供 LLM 理解何时使用)
func: Callable # 工具执行函数
params_schema: Dict[str, Any] = field(default_factory=dict) # 参数模式
# 工具注册表
TOOLS: List[Tool] = []
def register_tool(name: str, description: str, params_schema: Dict = None):
"""装饰器:注册工具到工具表"""
def decorator(func: Callable):
tool = Tool(
name=name,
description=description,
func=func,
params_schema=params_schema or {}
)
TOOLS.append(tool)
return func
return decorator
def get_tools_json() -> List[Dict]:
"""获取工具列表(用于 Function Calling)"""
return [
{
"name": tool.name,
"description": tool.description,
"parameters": tool.params_schema
}
for tool in TOOLS
]
# ============ 2. 定义几个实用工具 ============
@register_tool(
name="calculator",
description="执行数学计算,支持加减乘除、幂运算等",
params_schema={
"type": "object",
"properties": {
"expression": {"type": "string", "description": "数学表达式,如 2+3*5"}
},
"required": ["expression"]
}
)
def calculator(expression: str) -> str:
"""计算器工具"""
try:
# 安全计算:仅允许基本数学运算
allowed_chars = set('0123456789+-*/.() ')
if all(c in allowed_chars for c in expression):
result = eval(expression)
return f"计算结果:{expression} = {result}"
return "错误:表达式包含非法字符"
except Exception as e:
return f"计算错误:{str(e)}"
@register_tool(
name="weather",
description="查询指定城市的天气信息",
params_schema={
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"}
},
"required": ["city"]
}
)
def weather(city: str) -> str:
"""天气查询工具(模拟)"""
# 实际项目中这里会调用真实的天气 API
weather_data = {
"北京": "晴,25°C",
"上海": "多云,28°C",
"广州": "雷阵雨,30°C"
}
return weather_data.get(city, f"未知城市 {city} 的天气信息")
# ============ 3. Agent 核心类 ============
class SimpleAgent:
"""简单 Agent 实现"""
def __init__(self, api_key: str = None, model: str = "gpt-4o-mini"):
"""
初始化 Agent
Args:
api_key: OpenAI API 密钥
model: 使用的模型
"""
self.client = OpenAI(api_key=api_key or os.getenv("OPENAI_API_KEY"))
self.model = model
self.messages = [] # 对话历史
self.max_turns = 10 # 最大交互轮次(防止无限循环)
def add_system_prompt(self, prompt: str):
"""添加系统提示词"""
self.messages.append({"role": "system", "content": prompt})
def chat(self, user_input: str) -> str:
"""
核心对话方法:处理用户输入并返回响应
采用 ReAct 模式(Reasoning + Acting)
"""
# 添加用户消息
self.messages.append({"role": "user", "content": user_input})
# 限制对话长度
if len(self.messages) > 50:
self.messages = [self.messages[0]] + self.messages[-49:]
turn = 0
while turn < self.max_turns:
turn += 1
# 调用 LLM
response = self.client.chat.completions.create(
model=self.model,
messages=self.messages,
tools=get_tools_json(),
tool_choice="auto"
)
assistant_msg = response.choices[0].message
self.messages.append(assistant_msg.model_dump())
# 判断是否需要调用工具
if assistant_msg.tool_calls:
# 执行工具调用
for tool_call in assistant_msg.tool_calls:
tool_result = self._execute_tool(tool_call)
# 添加工具结果到对话
self.messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": tool_result
})
# 继续循环,让 LLM 根据工具结果生成回复
continue
else:
# 无工具调用,返回最终回复
return assistant_msg.content
return "已达到最大交互次数,请重新开始对话"
def _execute_tool(self, tool_call) -> str:
"""执行单个工具调用"""
tool_name = tool_call.function.name
tool_args = json.loads(tool_call.function.arguments)
# 查找并执行工具
for tool in TOOLS:
if tool.name == tool_name:
try:
return tool.func(**tool_args)
except Exception as e:
return f"工具执行错误:{str(e)}"
return f"未找到工具:{tool_name}"
# ============ 4. 使用示例 ============
if __name__ == "__main__":
# 创建 Agent 实例
agent = SimpleAgent()
# 设置系统提示词
agent.add_system_prompt(
"你是一个智能助手,可以帮助用户完成各种任务。"
"当你需要执行计算或查询天气时,可以使用相应的工具。"
)
# 对话示例
print("=" * 50)
print("Agent 对话演示")
print("=" * 50)
# 测试计算功能
response = agent.chat("帮我计算 (25 + 15) * 2 等于多少?")
print(f"\n用户:帮我计算 (25 + 15) * 2 等于多少?")
print(f"Agent:{response}")
# 测试天气功能
response = agent.chat("北京今天天气怎么样?")
print(f"\n用户:北京今天天气怎么样?")
print(f"Agent:{response}")
运行上述代码前,请确保设置环境变量:
bash
export OPENAI_API_KEY="your-api-key"
四、工具调用实战
4.1 Function Calling 机制
主流大模型(如 GPT-4、Claude、GLM 等)都支持 Function Calling,这是一种让模型「决定」调用外部工具的能力:
- 工具描述:定义工具的名称、描述、参数
- 模型决策:模型根据用户意图选择合适的工具
- 参数生成:模型生成工具调用的参数
- 执行与反馈:执行工具并返回结果给模型
4.2 多工具协作示例
下面是一个更复杂的多工具协作场景:
python
"""
多工具协作 Agent 示例
集成搜索、计算、文件操作等多种工具
"""
import json
from datetime import datetime
from typing import List, Dict
# ============ 扩展工具集 ============
@register_tool(
name="web_search",
description="搜索互联网获取最新信息",
params_schema={
"type": "object",
"properties": {
"query": {"type": "string", "description": "搜索关键词"},
"max_results": {"type": "integer", "description": "返回结果数量", "default": 5}
},
"required": ["query"]
}
)
def web_search(query: str, max_results: int = 5) -> str:
"""
模拟网络搜索功能
实际项目中可接入 SerpAPI、Google Search 等服务
"""
# 这里返回模拟数据,实际项目请接入真实搜索 API
results = [
f"搜索结果 1:关于「{query}」的最新资讯(来源:新闻网站)",
f"搜索结果 2:「{query}」的相关讨论(来源:社区论坛)",
f"搜索结果 3:「{query}」的百科介绍(来源:维基百科)"
]
return "\n".join(results[:max_results])
@register_tool(
name="save_to_file",
description="将内容保存到文件",
params_schema={
"type": "object",
"properties": {
"filename": {"type": "string", "description": "文件名"},
"content": {"type": "string", "description": "要保存的内容"}
},
"required": ["filename", "content"]
}
)
def save_to_file(filename: str, content: str) -> str:
"""文件保存工具"""
try:
with open(filename, 'w', encoding='utf-8') as f:
f.write(content)
return f"文件已保存:{filename}"
except Exception as e:
return f"保存失败:{str(e)}"
@register_tool(
name="read_file",
description="读取文件内容",
params_schema={
"type": "object",
"properties": {
"filename": {"type": "string", "description": "要读取的文件名"}
},
"required": ["filename"]
}
)
def read_file(filename: str) -> str:
"""文件读取工具"""
try:
with open(filename, 'r', encoding='utf-8') as f:
return f.read()
except FileNotFoundError:
return f"文件不存在:{filename}"
except Exception as e:
return f"读取失败:{str(e)}"
@register_tool(
name="get_current_time",
description="获取当前日期和时间",
params_schema={
"type": "object",
"properties": {}
}
)
def get_current_time() -> str:
"""获取当前时间"""
return f"当前时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
# ============ Agent 增强版 ============
class EnhancedAgent(SimpleAgent):
"""增强版 Agent,支持更多功能"""
def __init__(self, api_key: str = None, model: str = "gpt-4o-mini"):
super().__init__(api_key, model)
self.conversation_history = [] # 持久化对话历史
def chat(self, user_input: str) -> str:
"""对话方法,添加上下文管理"""
# 添加时间上下文
time_context = f"\n\n[系统信息] 当前时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
enhanced_input = user_input + time_context
response = super().chat(enhanced_input)
# 保存对话历史
self.conversation_history.append({
"user": user_input,
"assistant": response,
"timestamp": datetime.now().isoformat()
})
return response
def get_history(self, limit: int = 10) -> List[Dict]:
"""获取对话历史"""
return self.conversation_history[-limit:]
def clear_history(self):
"""清空对话历史"""
self.conversation_history = []
self.messages = []
# ============ 使用示例 ============
if __name__ == "__main__":
# 创建增强版 Agent
agent = EnhancedAgent()
agent.add_system_prompt(
"""你是一个功能强大的 AI 助手。
你可以使用以下工具:
- calculator: 执行数学计算
- weather: 查询城市天气
- web_search: 搜索互联网
- save_to_file: 保存内容到文件
- read_file: 读取文件内容
- get_current_time: 获取当前时间
请根据用户需求选择合适的工具来完成任务。"""
)
print("=" * 50)
print("增强版 Agent 对话演示")
print("=" * 50)
# 测试搜索功能
response = agent.chat("帮我搜索一下 AI Agent 最新的发展趋势")
print(f"\nAgent:{response}")
# 测试时间功能
response = agent.chat("现在几点了?")
print(f"\nAgent:{response}")
# 查看对话历史
print("\n--- 对话历史 ---")
for item in agent.get_history():
print(f"用户: {item['user']}")
print(f"助手: {item['assistant'][:50]}...")
print("---")
五、记忆与上下文管理
5.1 短期记忆(对话上下文)
短期记忆通过维护消息历史实现:
python
class MemoryManager:
"""记忆管理器"""
def __init__(self, max_history: int = 50):
self.short_term_memory = [] # 短期记忆:对话历史
self.long_term_memory = [] # 长期记忆:重要信息
self.max_history = max_history
def add_turn(self, role: str, content: str):
"""添加一轮对话"""
self.short_term_memory.append({
"role": role,
"content": content
})
# 自动裁剪过长的历史
if len(self.short_term_memory) > self.max_history:
self.short_term_memory = self.short_term_memory[-self.max_history:]
def add_to_long_term(self, key: str, value: str):
"""添加到长期记忆"""
self.long_term_memory.append({"key": key, "value": value})
def get_context_window(self, window_size: int = 10) -> List[Dict]:
"""获取最近的上下文窗口"""
return self.short_term_memory[-window_size:]
def summarize_if_needed(self, threshold: int = 20) -> str:
"""当历史过长时进行摘要"""
if len(self.short_term_memory) > threshold:
# 简单的摘要逻辑:保留首尾消息
summary = f"[摘要:对话共 {len(self.short_term_memory)} 轮]"
return summary
return ""
5.2 长期记忆策略
- 向量数据库:使用 Embedding 将重要信息向量化存储
- 关键信息提取:从对话中提取用户偏好、任务状态等
- 定期总结:定期将对话精华压缩存储
六、完整实战案例
下面是一个可运行的多工具 Agent 系统,具备完整的对话循环和错误处理:
python
"""
完整的多工具 Agent 系统
包含:搜索 + 计算 + 天气 + 文件操作
可直接运行(需要配置 API Key)
"""
import json
import os
from typing import List, Dict, Optional
from openai import OpenAI
from datetime import datetime
# ============ 工具定义 ============
class ToolRegistry:
"""工具注册表"""
def __init__(self):
self.tools: List[Dict] = []
self.functions: Dict = {}
def register(self, name: str, description: str, parameters: Dict, func: callable):
"""注册工具"""
self.tools.append({
"type": "function",
"function": {
"name": name,
"description": description,
"parameters": parameters
}
})
self.functions[name] = func
def get_tools(self) -> List[Dict]:
return self.tools
def execute(self, name: str, arguments: str) -> str:
"""执行工具"""
if name not in self.functions:
return f"错误:未找到工具 {name}"
try:
args = json.loads(arguments) if isinstance(arguments, str) else arguments
result = self.functions[name](**args)
return str(result)
except Exception as e:
return f"执行错误:{str(e)}"
# 全局工具注册表
registry = ToolRegistry()
# ============ 实现工具函数 ============
def search_web(query: str, max_results: int = 3) -> str:
"""模拟网络搜索"""
results = [
f"1. 「{query}」权威解释 - 来源:Wikipedia",
f"2. 「{query}」最新动态 - 来源:技术博客",
f"3. 「{query}」实践指南 - 来源:开发者社区"
]
return "\n".join(results[:max_results])
def calculate(expression: str) -> str:
"""安全计算器"""
allowed = set('0123456789+-*/.()e ')
if all(c in allowed for c in expression):
try:
result = eval(expression)
return f"结果:{expression} = {result}"
except:
return "计算表达式无效"
return "表达式包含非法字符"
def query_weather(city: str) -> str:
"""查询天气"""
weather_db = {
"北京": "晴 26°C 适宜出行",
"上海": "多云 28°C 略有闷热",
"深圳": "阵雨 31°C 记得带伞",
"成都": "阴 24°C 体感舒适"
}
if city in weather_db:
return f"{city}今日天气:{weather_db[city]}"
return f"暂无{city}的天气数据"
def save_file(filename: str, content: str) -> str:
"""保存文件"""
try:
with open(filename, 'w', encoding='utf-8') as f:
f.write(content)
return f"✅ 文件已保存至:{filename}"
except Exception as e:
return f"❌ 保存失败:{str(e)}"
def read_file_content(filename: str) -> str:
"""读取文件"""
try:
with open(filename, 'r', encoding='utf-8') as f:
return f.read()
except FileNotFoundError:
return f"❌ 文件不存在:{filename}"
except Exception as e:
return f"❌ 读取失败:{str(e)}"
def get_date() -> str:
"""获取日期"""
return datetime.now().strftime("%Y年%m月%d日 %H:%M:%S")
# 注册所有工具
registry.register(
name="web_search",
description="搜索互联网获取信息,适用于回答实时性问题或查询最新资讯",
parameters={
"type": "object",
"properties": {
"query": {"type": "string", "description": "搜索关键词"},
"max_results": {"type": "integer", "description": "最大结果数", "default": 3}
},
"required": ["query"]
},
func=search_web
)
registry.register(
name="calculator",
description="执行数学计算,支持加减乘除和括号",
parameters={
"type": "object",
"properties": {
"expression": {"type": "string", "description": "数学表达式,如 2+3*4"}
},
"required": ["expression"]
},
func=calculate
)
registry.register(
name="weather_query",
description="查询城市天气情况",
parameters={
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"}
},
"required": ["city"]
},
func=query_weather
)
registry.register(
name="file_save",
description="将内容保存到文件",
parameters={
"type": "object",
"properties": {
"filename": {"type": "string", "description": "文件名"},
"content": {"type": "string", "description": "文件内容"}
},
"required": ["filename", "content"]
},
func=save_file
)
registry.register(
name="file_read",
description="读取文件内容",
parameters={
"type": "object",
"properties": {
"filename": {"type": "string", "description": "要读取的文件名"}
},
"required": ["filename"]
},
func=read_file_content
)
registry.register(
name="get_time",
description="获取当前日期和时间",
parameters={"type": "object", "properties": {}},
func=get_date
)
# ============ MultiToolAgent 主类 ============
class MultiToolAgent:
"""多工具 Agent"""
def __init__(self, api_key: str = None):
self.client = OpenAI(api_key=api_key or os.getenv("OPENAI_API_KEY"))
self.model = "gpt-4o-mini"
self.messages = []
self.max_turns = 8
# 系统提示词
self.messages.append({
"role": "system",
"content": """你是一个智能助手,名为「小智」。你的职责是:
1. 准确理解用户问题
2. 必要时调用工具获取信息或执行操作
3. 以友好、专业的方式回答问题
可用工具:web_search(搜索)、calculator(计算)、weather_query(查天气)、
file_save(保存文件)、file_read(读取文件)、get_time(获取时间)"""
})
def chat(self, user_input: str) -> str:
"""对话入口"""
self.messages.append({"role": "user", "content": user_input})
for _ in range(self.max_turns):
response = self.client.chat.completions.create(
model=self.model,
messages=self.messages,
tools=registry.get_tools(),
tool_choice="auto"
)
msg = response.choices[0].message
self.messages.append(msg.model_dump())
if msg.tool_calls:
# 执行所有工具调用
for call in msg.tool_calls:
result = registry.execute(
call.function.name,
call.function.arguments
)
self.messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result
})
continue
return msg.content
return "已达到最大交互次数"
def reset(self):
"""重置对话"""
self.messages = [self.messages[0]] # 保留系统提示词
# ============ 运行演示 ============
if __name__ == "__main__":
print("🤖 MultiToolAgent 系统演示")
print("=" * 50)
# 创建 Agent(请先设置 OPENAI_API_KEY 环境变量)
agent = MultiToolAgent()
# 演示对话
queries = [
"今天几号了?",
"北京天气怎么样?",
"帮我算一下 128 * 256 + 1024",
"帮我把 'Hello, AI Agent!' 保存到 hello.txt 文件",
"用几句话介绍一下 AI Agent 的发展趋势"
]
for q in queries:
print(f"\n👤 用户:{q}")
print(f"🤖 助手:{agent.chat(q)}")
print("-" * 50)
七、进阶方向

7.1 ReAct 模式
ReAct(Reasoning + Acting)是一种让 Agent 显式进行推理并行动的框架:
python
"""
ReAct 模式实现
让 Agent 显式展示思考过程
"""
class ReActAgent:
"""ReAct 模式的 Agent"""
SYSTEM_PROMPT = """你是一个采用 ReAct 模式的智能助手。
对于每个问题,你需要按以下格式思考:
Thought: 分析当前情况,考虑是否需要调用工具
Action: 工具名称(如有需要)
Action Input: 工具参数(如有需要)
Observation: 工具执行结果
... (重复 Thought/Action/Action Input/Observation 直到完成任务)
Final Answer: 最终回答
"""
def __init__(self, api_key: str = None):
self.client = OpenAI(api_key=api_key or os.getenv("OPENAI_API_KEY"))
self.messages = [{"role": "system", "content": self.SYSTEM_PROMPT}]
def chat(self, question: str) -> str:
self.messages.append({"role": "user", "content": question})
# 连续对话直到得到最终答案
max_iterations = 10
for _ in range(max_iterations):
response = self.client.chat.completions.create(
model="gpt-4o-mini",
messages=self.messages,
tools=registry.get_tools()
)
msg = response.choices[0].message
self.messages.append(msg.model_dump())
# 检查是否有工具调用
if msg.tool_calls:
for call in msg.tool_calls:
result = registry.execute(call.function.name, call.function.arguments)
self.messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": f"Observation: {result}"
})
continue
# 检查是否包含最终答案
if "Final Answer:" in msg.content:
return msg.content
else:
return msg.content
return "无法完成推理"
7.2 Multi-Agent 协作
多个 Agent 协同工作,各司其职:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 规划 Agent │ ──▶ │ 执行 Agent │ ──▶ │ 审核 Agent │
└─────────────┘ └─────────────┘ └─────────────┘
分解任务 调用工具 质量把控
7.3 RAG 增强
结合检索增强生成(Retrieval-Augmented Generation),让 Agent 具备知识库查询能力。
7.4 主流框架简介
| 框架 | 特点 | 适用场景 |
|---|---|---|
| LangChain | 功能全面,组件丰富 | 快速原型开发 |
| AutoGen | 微软出品,Multi-Agent 强 | 多 Agent 协作 |
| CrewAI | 角色驱动,易上手 | 任务编排 |
| Dify | 低代码,平台化 | 快速部署上线 |
八、总结
本文从核心概念出发,详细介绍了 AI Agent 的架构设计和实现方法:
- 核心架构:感知层 → 决策层 → 行动层的闭环系统
- 关键组件:LLM 大脑、记忆系统、工具调用、规划能力
- 实战代码:从简单框架到完整的多工具 Agent
- 进阶方向:ReAct 模式、Multi-Agent、RAG 增强
AI Agent 是大模型应用的重要方向,掌握其核心原理和实现方法,将帮助你在 AI 时代占据先机。建议从本文的示例代码入手,逐步扩展功能,最终构建满足自己需求的智能 Agent 系统。