1. 从零构建ReAct Agent的核心概念解析
在当今AI技术快速发展的浪潮中,AI Agent(智能代理)已成为最受关注的技术方向之一。作为一名长期从事AI应用开发的工程师,我发现许多初学者对Agent的理解仍停留在表面。本文将带你深入ReAct Agent的实现细节,通过200+行代码的完整实现,让你掌握这一核心架构的精髓。
ReAct(Reasoning + Acting)框架之所以成为经典,是因为它完美模拟了人类解决问题的思维过程。想象一下,当你被问到"北京和上海哪座城市更适合投资房产"时,你不会直接给出答案,而是会:
- 思考需要比较哪些指标(GDP、人口流入、政策等)
- 查找相关数据
- 分析比较结果
- 最终得出结论
这正是ReAct框架的核心价值——它让大语言模型具备了"思考-行动-观察-再思考"的闭环能力。下面让我们从技术角度拆解这个框架的四大核心组件:
1.1 ReAct框架的四大支柱
大脑(LLM模型):这是Agent的决策中心。在实际项目中,我们通常会根据需求选择不同规模的模型。对于简单任务,7B参数的本地模型就足够;而对于复杂业务场景,可能需要调用GPT-4级别的大模型。本文示例使用的是通义千问的API,因其在中文场景下的优秀表现。
记忆系统(Memory):这是很多初学者容易忽视的部分。一个健壮的Memory系统不仅要存储对话历史,还应具备:
- 短期记忆(当前会话上下文)
- 长期记忆(向量数据库存储的历史知识)
- 工具使用记忆(记录过往工具调用结果)
工具集(Tools):这是Agent能力的扩展。在我的开发经验中,一个实用的Agent通常需要集成以下工具类型:
- 计算类(数学运算、单位转换等)
- 查询类(搜索引擎、数据库访问等)
- 控制类(API调用、设备控制等)
思维模板(Prompt):这是Agent的"操作系统"。好的Prompt需要明确定义:
- 思考格式(如使用"Thought:"前缀)
- 行动规范(如何调用工具)
- 输出要求(最终答案的格式)
实际开发提示:在构建生产级Agent时,建议为每个工具编写详细的描述文档(包括输入输出示例、边界条件等),这能显著提高工具调用的准确性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境配置与基础搭建
2.1 开发环境准备
在开始编码前,我们需要搭建合适的开发环境。以下是经过多个项目验证的稳定配置方案:
bash复制# 创建conda环境(推荐使用Python 3.10+)
conda create -n langgraph python=3.10 -y
conda activate langgraph
# 安装核心依赖
pip install openai requests python-dotenv
对于模型API的访问,我强烈建议将密钥存储在环境变量中,而非硬编码在代码里。这是行业内的安全最佳实践:
python复制# .env文件内容
ALIYUN_API_KEY=your_api_key_here
python复制# config.py
import os
from dotenv import load_dotenv
load_dotenv()
ALIYUN_API_KEY = os.getenv('ALIYUN_API_KEY')
2.2 基础Agent类实现
下面是经过生产环境验证的增强版Agent基类,相比示例代码增加了异常处理和日志记录:
python复制import logging
from typing import List, Dict
class Agent:
def __init__(self, system_prompt: str = ""):
self.system = system_prompt
self.messages: List[Dict] = []
self.logger = logging.getLogger(__name__)
if self.system:
self._add_message("system", self.system)
def _add_message(self, role: str, content: str) -> None:
"""安全地添加消息到历史记录"""
if not isinstance(content, str):
raise ValueError("Message content must be string")
self.messages.append({"role": role, "content": content.strip()})
def __call__(self, message: str) -> str:
try:
self._add_message("user", message)
response = self._execute()
self._add_message("assistant", response)
return response
except Exception as e:
self.logger.error(f"Agent call failed: {str(e)}")
raise
def _execute(self) -> str:
"""执行LLM调用"""
# 实际项目中这里可以添加重试机制、限流等
response = client.chat.completions.create(
model="qwen-max",
messages=self.messages,
temperature=0.7 # 推荐值,平衡创造性和稳定性
)
return response.choices[0].message.content
关键改进点:
- 类型注解(Type Hints)提高代码可维护性
- 输入验证防止注入攻击
- 完善的错误处理和日志记录
- 可配置的温度参数控制输出随机性
3. 工具系统设计与实现
3.1 计算器工具的安全增强
原始示例中的eval()使用存在严重安全隐患。以下是经过生产级加固的计算器工具:
python复制import ast
import operator
from typing import Union
# 安全允许的操作符
ALLOWED_OPERATORS = {
ast.Add: operator.add,
ast.Sub: operator.sub,
ast.Mult: operator.mul,
ast.Div: operator.truediv,
ast.Pow: operator.pow,
ast.USub: operator.neg
}
def safe_calculate(expression: str) -> Union[float, int]:
""
