30行Python代码实现AI Agent核心架构:从工具调用到自主决策
最近在AI应用开发中,Agent架构成为了热门话题,但很多开发者觉得这个概念过于抽象,难以真正理解其核心机制。本文将通过30行Python代码,完整复刻Agent的核心工作流程,让你从底层理解AI Agent如何调用工具、处理消息和实现自主决策。
1. Agent核心概念解析
1.1 什么是AI Agent
AI Agent(智能代理)是一个能够感知环境、自主决策并执行动作的智能系统。与传统的聊天机器人不同,Agent具备工具调用能力,可以根据任务需求选择并执行相应的工具函数,实现更复杂的业务逻辑。
在实际应用中,Agent通常包含三个核心组件:
- 感知模块 :接收用户输入和环境信息
- 决策模块 :分析需求并选择适当的工具
- 执行模块 :调用工具并处理返回结果
1.2 Agent与普通AI模型的区别
普通AI模型主要完成文本生成任务,而Agent在此基础上增加了工具调用能力。以Claude Platform为例,当模型需要调用工具时,会返回 stop_reason 为 tool_use 的响应,包含工具调用的唯一标识符和参数信息。
这种设计使得Agent能够突破纯文本生成的限制,实现文件操作、网络请求、数据分析等实际功能,为AI应用开发提供了更大的灵活性。
2. 环境准备与依赖配置
2.1 基础环境要求
为了运行本文的Agent核心代码,你需要准备以下环境:
# Python版本要求
python --version
# Python 3.8+
# 创建虚拟环境(推荐)
python -m venv agent_env
source agent_env/bin/activate # Linux/Mac
# 或 agent_env\Scripts\activate # Windows
2.2 安装必要依赖
本文示例仅使用Python标准库,无需额外安装第三方包,确保代码的简洁性和可移植性:
# 所需标准库模块
import json
import types
from typing import Dict, List, Any, Callable, Optional
这种设计选择让我们能够专注于Agent的核心逻辑,而不被复杂的依赖关系所干扰。
3. Agent核心架构设计
3.1 消息处理机制
Agent的消息系统采用类似ChatGPT的对话历史管理方式,但增加了工具调用的特殊处理。每条消息都包含角色(user/assistant/tool)和内容,工具调用结果会以特定格式添加到消息历史中。
class Message:
def __init__(self, role: str, content: str, tool_call_id: Optional[str] = None):
self.role = role
self.content = content
self.tool_call_id = tool_call_id
def to_dict(self) -> Dict[str, Any]:
result = {"role": self.role, "content": self.content}
if self.tool_call_id:
result["tool_call_id"] = self.tool_call_id
return result
3.2 工具注册与管理
工具是Agent能力的扩展,每个工具都是一个可调用的函数,具有明确的名称、描述和参数定义。工具管理器负责维护工具注册表,并根据需求调用相应的工具。
class ToolManager:
def __init__(self):
self.tools: Dict[str, Dict[str, Any]] = {}
def register_tool(self, name: str, description: str, function: Callable) -> None:
"""注册工具函数"""
self.tools[name] = {
"description": description,
"function": function,
"parameters": self._extract_parameters(function)
}
def _extract_parameters(self, func: Callable) -> List[Dict[str, str]]:
"""从函数签名提取参数信息(简化版)"""
# 实际实现中可以使用inspect模块详细解析参数
return [{"name": "input", "type": "string", "description": "输入参数"}]
4. 完整Agent核心实现
4.1 Agent主类设计
下面是完整的Agent核心实现,仅用30行代码展示了最核心的功能:
class SimpleAgent:
def __init__(self):
self.messages: List[Dict] = []
self.tool_manager = ToolManager()
self.tool_callbacks = {}
def add_message(self, role: str, content: str) -> None:
self.messages.append({"role": role, "content": content})
def register_tool(self, name: str, desc: str, func: Callable) -> None:
self.tool_manager.register_tool(name, desc, func)
self.tool_callbacks[name] = func
def process_query(self, query: str) -> str:
self.add_message("user", query)
# 模拟AI决策过程:分析是否需要工具调用
needs_tool, tool_name, tool_args = self._analyze_query(query)
if needs_tool:
result = self._call_tool(tool_name, tool_args)
self.add_message("tool", f"工具 {tool_name} 执行结果: {result}")
return f"通过工具 {tool_name} 处理完成: {result}"
else:
response = self._generate_response(query)
self.add_message("assistant", response)
return response
def _analyze_query(self, query: str) -> tuple:
# 简化的决策逻辑:检测关键词决定是否调用工具
if "计算" in query or "calculate" in query.lower():
return True, "calculator", query
elif "时间" in query or "time" in query.lower():
return True, "get_time", query
return False, None, None
def _call_tool(self, tool_name: str, args: str) -> str:
if tool_name in self.tool_callbacks:
return str(self.tool_callbacks[tool_name](args))
return f"工具 {tool_name} 未找到"
def _generate_response(self, query: str) -> str:
# 简化的文本生成逻辑
return f"收到您的查询: {query}。这是一个直接回复的示例。"
4.2 工具函数实现
为了让Agent真正具备实用功能,我们需要实现一些基础工具:
import datetime
import math
def calculator_tool(expression: str) -> float:
"""简单计算器工具"""
try:
# 安全评估:只允许基本数学运算
allowed_chars = set('0123456789+-*/.() ')
if all(c in allowed_chars for c in expression):
return eval(expression)
else:
return "表达式包含不安全字符"
except Exception as e:
return f"计算错误: {e}"
def time_tool(query: str) -> str:
"""获取当前时间工具"""
now = datetime.datetime.now()
return now.strftime("%Y-%m-%d %H:%M:%S")
def weather_tool(city: str) -> str:
"""模拟天气查询工具"""
# 实际实现中可以调用天气API
return f"{city}的天气:晴朗,25℃"
5. Agent实战演示
5.1 初始化并配置Agent
让我们创建一个完整的Agent实例,并注册前面定义的工具:
def demo_agent_workflow():
# 创建Agent实例
agent = SimpleAgent()
# 注册工具
agent.register_tool("calculator", "执行数学计算", calculator_tool)
agent.register_tool("get_time", "获取当前时间", time_tool)
agent.register_tool("get_weather", "查询天气", weather_tool)
# 测试对话
queries = [
"现在几点了?",
"请计算一下 123 + 456 等于多少",
"今天天气怎么样?",
"你好,请做个自我介绍"
]
for query in queries:
print(f"用户: {query}")
response = agent.process_query(query)
print(f"Agent: {response}")
print("-" * 50)
if __name__ == "__main__":
demo_agent_workflow()
5.2 运行结果分析
运行上述代码,你将看到类似以下的输出:
用户: 现在几点了?
Agent: 通过工具 get_time 处理完成: 2024-01-15 14:30:25
用户: 请计算一下 123 + 456 等于多少
Agent: 通过工具 calculator 处理完成: 579
用户: 今天天气怎么样?
Agent: 收到您的查询: 今天天气怎么样?。这是一个直接回复的示例。
用户: 你好,请做个自我介绍
Agent: 收到您的查询: 你好,请做个自我介绍。这是一个直接回复的示例。
从输出可以看出,Agent能够正确识别需要工具调用的查询(时间查询、数学计算),并对其他查询做出基础响应。
6. 核心机制深度解析
6.1 工具调用决策逻辑
Agent的核心智能体现在工具调用决策上。在实际的AI Agent系统中,这个决策过程通常由大语言模型完成:
def advanced_analyze_query(self, query: str, message_history: List) -> dict:
"""高级查询分析(模拟LLM决策)"""
# 模拟LLM返回的结构化决策
decision_template = {
"needs_tool": False,
"tool_name": None,
"tool_arguments": {},
"reasoning": "直接回复用户查询",
"confidence": 0.9
}
# 基于规则的模式匹配(实际中使用LLM)
tool_patterns = {
"calculator": ["计算", "等于多少", "+", "-", "*", "/"],
"get_time": ["时间", "几点", "现在几点"],
"get_weather": ["天气", "气温", "天气预报"]
}
for tool_name, patterns in tool_patterns.items():
if any(pattern in query for pattern in patterns):
decision_template.update({
"needs_tool": True,
"tool_name": tool_name,
"tool_arguments": {"query": query},
"reasoning": f"查询包含{tool_name}相关关键词",
"confidence": 0.85
})
break
return decision_template
6.2 消息流管理
专业的Agent系统需要维护完整的消息流,包括工具调用和结果整合:
class AdvancedAgent(SimpleAgent):
def __init__(self):
super().__init__()
self.conversation_history = []
def process_with_tools(self, query: str) -> str:
# 添加用户消息
self.conversation_history.append({"role": "user", "content": query})
# 决策阶段
decision = self.advanced_analyze_query(query, self.conversation_history)
if decision["needs_tool"]:
# 工具调用阶段
tool_result = self._call_tool(
decision["tool_name"],
decision["tool_arguments"]
)
# 添加工具结果到历史
self.conversation_history.append({
"role": "tool",
"content": tool_result,
"tool_call_id": f"call_{len(self.conversation_history)}"
})
# 最终响应生成
final_response = self._synthesize_response(
query, tool_result, decision
)
self.conversation_history.append({
"role": "assistant",
"content": final_response
})
return final_response
else:
# 直接生成响应
response = self._generate_response(query)
self.conversation_history.append({
"role": "assistant",
"content": response
})
return response
7. 生产环境扩展建议
7.1 错误处理与容错机制
在实际应用中,Agent需要完善的错误处理:
def safe_tool_call(self, tool_name: str, arguments: dict) -> dict:
"""安全的工具调用封装"""
try:
if tool_name not in self.tool_callbacks:
return {
"success": False,
"error": f"工具 {tool_name} 未注册",
"result": None
}
# 参数验证
if not self._validate_arguments(tool_name, arguments):
return {
"success": False,
"error": "参数验证失败",
"result": None
}
# 执行工具调用
result = self.tool_callbacks[tool_name](**arguments)
return {
"success": True,
"error": None,
"result": result
}
except Exception as e:
return {
"success": False,
"error": f"工具执行异常: {str(e)}",
"result": None
}
7.2 性能优化策略
对于高频使用的Agent系统,可以考虑以下优化:
- 工具缓存 :对纯函数工具的结果进行缓存
- 异步调用 :使用async/await提高并发性能
- 批量处理 :支持多个工具调用并行执行
- 连接池 :对数据库、API调用使用连接池管理
8. 常见问题与解决方案
8.1 工具调用失败排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 工具未找到 | 工具名称拼写错误 | 检查注册时的工具名称一致性 |
| 参数错误 | 参数格式不匹配 | 验证参数类型和必需字段 |
| 执行超时 | 工具函数执行时间过长 | 添加超时机制,优化工具性能 |
| 权限不足 | 工具需要特定权限 | 检查执行环境权限设置 |
8.2 决策准确性提升
提高Agent工具调用决策准确性的方法:
- 丰富训练数据 :收集更多工具调用示例
- 改进特征工程 :提取更有效的查询特征
- 集成多个模型 :使用模型集成提高决策可靠性
- 人工反馈循环 :通过用户反馈持续优化决策逻辑
9. 进阶开发方向
9.1 多工具协同工作
复杂的任务可能需要多个工具协同完成:
def multi_tool_workflow(self, complex_query: str) -> str:
"""多工具协同处理复杂查询"""
# 任务分解
subtasks = self._breakdown_complex_task(complex_query)
intermediate_results = []
for subtask in subtasks:
if subtask["type"] == "tool_call":
result = self._call_tool(subtask["tool"], subtask["args"])
intermediate_results.append(result)
# 结果整合
final_result = self._synthesize_results(intermediate_results)
return final_result
9.2 外部API集成
将外部服务集成到Agent工具系统中:
def register_api_tool(self, api_config: dict):
"""注册API类型的工具"""
async def api_wrapper(**kwargs):
async with aiohttp.ClientSession() as session:
async with session.request(
method=api_config["method"],
url=api_config["url"],
headers=api_config.get("headers", {}),
json=kwargs
) as response:
return await response.json()
self.register_tool(api_config["name"], api_config["description"], api_wrapper)
通过这30行核心代码的实践,我们不仅理解了Agent的基本工作原理,还掌握了扩展和优化Agent系统的关键技巧。这种从简到繁的学习路径,有助于深入理解复杂AI系统的设计思想。
更多推荐
所有评论(0)