1. ReAct智能体初探:从理论到第一个Demo实现
智能体(Agent)技术正在重塑我们与AI系统的交互方式。作为一名长期关注AI落地的开发者,我发现ReAct(Reasoning and Acting)范式正在成为构建实用智能体的黄金标准。这个模式巧妙地将大语言模型的推理能力与外部工具调用结合起来,让AI不再只是"纸上谈兵"。
今天要分享的hello-agent项目,正是我最近实践ReAct范式的入门案例。通过这个Demo,你不仅能理解智能体如何"思考-行动-观察"的完整循环,还能掌握用Python构建基础智能体的核心方法。不同于简单的API调用,真正的智能体需要具备持续学习和适应环境的能力——这正是ReAct的精髓所在。
2. ReAct范式核心原理拆解
2.1 智能体的思考-行动循环
ReAct的核心在于三个关键阶段的循环迭代:
- 推理(Reason):分析当前问题和状态
- 行动(Act):选择并执行具体操作
- 观察(Observe):收集行动结果和环境反馈
这种模式模仿了人类解决问题的方式。比如当被问到"现任英国首相是谁?"时:
- 传统LLM可能直接给出记忆中的答案(可能过时)
- ReAct智能体会先决定"需要查询最新政治新闻",然后调用搜索引擎API获取实时结果
2.2 关键技术组件
构建ReAct智能体需要四个基础模块:
python复制class ReActAgent:
def __init__(self):
self.llm = OpenAI() # 语言模型核心
self.memory = [] # 交互历史记录
self.tools = { # 可用工具集
'search': GoogleSearchTool(),
'math': CalculatorTool()
}
self.parser = ResponseParser() # 输出解析器
每个工具都应实现标准接口:
python复制class BaseTool:
def description(self) -> str:
"""工具的功能描述"""
def run(self, input: str) -> str:
"""执行工具并返回结果"""
3. 第一个Demo实现全流程
3.1 环境准备
建议使用Python 3.9+环境,关键依赖:
bash复制pip install openai python-dotenv
需要准备:
- OpenAI API密钥(或其他LLM服务)
- 在项目根目录创建
.env文件:
ini复制OPENAI_API_KEY=your_key_here
3.2 基础架构实现
首先定义智能体骨架:
python复制import openai
from dotenv import load_dotenv
import json
load_dotenv()
class ReActDemo:
def __init__(self, model="gpt-3.5-turbo"):
self.model = model
self.history = []
def run(self, query):
prompt = self._build_prompt(query)
response = openai.ChatCompletion.create(
model=self.model,
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
def _build_prompt(self, query):
return f"""
你是一个ReAct智能体,请按照以下格式响应:
Thought: 分析当前需要做什么
Action: 选择工具(search/math/known)
Action Input: 工具的输入内容
问题:{query}
"""
3.3 添加基础工具
实现两个示例工具:
python复制class DemoCalculator:
def description(self):
return "用于数学计算,输入应为数学表达式"
def run(self, expr):
try:
return str(eval(expr))
except:
return "计算错误"
class DemoSearch:
def description(self):
return "用于获取实时信息"
def run(self, query):
# 模拟搜索返回
return f"关于'{query}'的最新信息..."
3.4 完整执行循环
增强智能体的执行逻辑:
python复制def run(self, query, max_steps=5):
for _ in range(max_steps):
prompt = self._build_prompt(query)
response = self._get_llm_response(prompt)
if "Final Answer" in response:
return response.split("Final Answer:")[-1].strip()
action, action_input = self._parse_response(response)
tool_result = self.tools[action].run(action_input)
self.history.append(f"Observation: {tool_result}")
return "达到最大步数仍未解决"
def _parse_response(self, text):
lines = text.split('\n')
action_line = [l for l in lines if l.startswith('Action:')][0]
input_line = [l for l in lines if l.startswith('Action Input:')][0]
return action_line.split(': ')[1], input_line.split(': ')[1]
4. 实战演示与效果分析
4.1 运行示例
测试复合型问题:
python复制agent = ReActDemo()
print(agent.run("2023年诺贝尔文学奖得主的年龄减去30是多少?"))
预期执行流程:
- 识别需要先获取获奖者信息
- 调用搜索工具查询获奖者
- 提取出生年份计算年龄
- 进行减法运算
4.2 性能优化技巧
通过实践总结的改进点:
提示工程优化:
python复制def _build_prompt(self, query):
tools_desc = '\n'.join([f"{name}: {tool.description()}"
for name, tool in self.tools.items()])
return f"""
请严格按照以下格式响应:
Thought: 分析当前需要做什么
Action: 选择工具({list(self.tools.keys())})
Action Input: 工具的输入内容
Observation: 工具返回结果
可用工具:
{tools_desc}
历史记录:
{'\n'.join(self.history[-3:])}
问题:{query}
"""
错误处理增强:
python复制def _parse_response(self, text):
try:
action = next(line for line in text.split('\n')
if line.startswith('Action:'))
action_input = next(line for line in text.split('\n')
if line.startswith('Action Input:'))
return action.split(': ')[1].strip(), action_input.split(': ')[1].strip()
except StopIteration:
raise ValueError("LLM未返回有效Action格式")
5. 常见问题与调试心得
5.1 典型错误模式
-
动作循环:智能体反复执行相同操作
- 修复:在历史记录中标记无效尝试
-
工具选择错误:如用计算器处理文本问题
- 修复:在工具描述中明确使用场景
-
输出格式漂移:LLM不遵守响应格式
- 修复:使用更严格的提示词和输出解析
5.2 监控与评估
建议添加日志记录:
python复制import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[logging.FileHandler('agent.log')]
)
def run(self, query):
logging.info(f"开始处理查询: {query}")
# ...执行逻辑...
logging.info(f"最终答案: {result}")
return result
关键评估指标:
- 任务完成率
- 平均执行步数
- 工具调用准确率
6. 扩展方向与进阶建议
完成基础Demo后,可以考虑:
-
增强工具集:
- 添加数据库查询工具
- 集成API调用能力
-
记忆机制:
python复制from collections import deque
class RecentMemory:
def __init__(self, maxlen=10):
self.memory = deque(maxlen=maxlen)
def add(self, item):
self.memory.append(item)
def get_context(self):
return '\n'.join(self.memory)
- 多智能体协作:
- 实现智能体间的消息传递
- 设计角色分工机制
这个hello-agent的Demo虽然简单,但已经包含了构建生产级智能体的所有核心要素。在实际项目中,我发现最大的挑战不在于代码实现,而在于如何设计有效的工具集和提示策略。建议从这个小例子出发,逐步扩展功能边界。
