手把手构建一个轻量级AI Agent:支持记忆、计算与搜索的ReAct实践

手把手构建一个轻量级AI Agent:支持记忆、计算与搜索的ReAct实践


🔍 引言

在大语言模型时代,如何让 AI 不仅能"思考",还能"行动"?ReAct(Reasoning + Acting)框架给出了答案。本文将带你深入理解 ReAct 模式,并通过一个完整的实战项目,手把手教你实现一个能使用工具的智能代理。

🎯 技术背景

什么是 ReAct?

ReAct 是一种让大语言模型通过"思考-行动-观察"循环来解决问题的范式:

  1. Thought(思考):分析问题,决定下一步做什么
  2. Action(行动):调用工具获取信息或执行操作
  3. Observation(观察):获取工具返回的结果
  4. Final Answer(最终答案):综合所有信息给出结论

为什么需要 ReAct?

  • 🧠 解决复杂问题:单一思考无法解决的多步骤任务
  • 📡 获取实时信息:突破模型训练数据的时间限制
  • 🧮 执行精确计算:避免大模型的计算误差
  • 📝 可解释性:每一步决策都清晰可见

🏗️ 整体架构

🚀 核心功能实现

1. 工具定义与安全计算

python 复制代码
def calculator(expression: str) -> str:
    """安全计算数学表达式,仅允许数字、运算符和小数点"""
    allowed = set("0123456789.+-*/() ")
    if not all(c in allowed for c in expression):
        return "Error: 表达式包含非法字符"
    try:
        return str(eval(expression, {"__builtins__": {}}, math.__dict__))
    except Exception as e:
        return f"Error: {str(e)}"

技术要点

  • 白名单机制防止代码注入攻击
  • 清空 __builtins__ 避免危险函数调用
  • 仅传入 math 模块支持常用数学运算

2. 搜索工具实现

python 复制代码
def search(keyword: str) -> str:
    fake_results = {
        "北京天气": "北京今天晴,气温30°C",
        "首都": "中国的首都是北京",
        "Python": "Python是一种高级编程语言",
        "奥斯卡最佳影片": "我的世界",
        "IMDb评分":"89"
    }
    for k, v in fake_results.items():
        if k in keyword:
            return v
    return f"Error:关于'{keyword}'的搜索结果:未找到相关信息。"

说明:这是一个模拟实现,实际应用中应调用真实的搜索引擎 API。

3. 记忆系统

python 复制代码
memory = {}  # 全局记忆字典

# 在工具调用中使用记忆
elif tool == "remember":
    match = re.match(r"(\w+)\s*,\s*(.+)", inp)
    if match:
        var_name = match.group(1)
        var_value = match.group(2).strip()
        memory[var_name] = var_value
        obs = f"已记忆: {var_name} = {var_value}"

亮点:支持跨步骤变量存储,实现复杂的多步骤计算任务。

4. LLM 输出解析

python 复制代码
def parse_output(txt: str):
    thought = re.search(r"Thought:\s*(.*)", txt)
    final = re.search(r"Final Answer:\s*(.*)", txt, re.DOTALL)
    action = re.search(r"Action:\s*(\w+)\s*[\[(]([^)\]]+)[)\]]", txt)
    return {
        "thought": thought.group(1).strip() if thought else None,
        "final_answer": final.group(1).strip() if final else None,
        "action": action.group(1) if action else None,
        "action_input": action.group(2).strip() if action else None,
    }

核心逻辑:通过正则表达式从 LLM 输出中提取结构化信息。

5. 代理主循环

python 复制代码
def run_agent(query):
    system_prompt = open("sys_prompt", "r").read().strip()
    messages = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": query}
    ]
    for i in range(max_iterations):
        resp = client.chat.completions.create(
            model="deepseek-v4-pro",
            messages=messages,
            temperature=0,
            stop=["Observation:"]
        )
        reply = resp.choices[0].message.content.strip()
        messages.append({"role": "assistant", "content": reply})
        parsed = parse_output(reply)
        
        tool, inp, final = parsed["action"], parsed["action_input"], parsed["final_answer"]
        
        if final:
            return final  # 任务完成
        
        # 执行工具调用...
        messages.append({"role": "assistant", "content": f"Observation: {obs}"})

📝 系统提示词设计

sys_prompt 文件定义了代理的行为规范:

scss 复制代码
你是一个能使用工具的智能助手。可用工具:
- calculator(表达式): 数学计算,例如 calculator(2+3)
- search(关键词): 搜索实时信息,例如 search(北京天气)

严格按照以下格式:
Thought: 你的思考
Action: 工具调用,包含函数名+表达式
Observation: 工具返回(由系统填入)
Final Answer: 最终答案

设计要点

  • 明确可用工具列表
  • 定义严格的输出格式
  • 提供多个示例帮助 LLM 理解
  • 包含错误处理规则

💡 使用示例

示例 1:多步骤计算任务

python 复制代码
query = "计算 3 * 4 得到的结果存入x,然后计算 x + 5 再存入y,最后告诉我x、y分别是多少?"

执行过程

示例 2:链式任务

python 复制代码
query = "搜索今年(2026年)的奥斯卡最佳影片,然后搜索该片的IMDb评分,再把这个评分减去0.5存在变量a里,最后告诉我a是多少。"

执行过程


🔧 安装与运行

环境依赖

bash 复制代码
pip install openai ollama

配置说明

  1. 使用 OpenAI API(DeepSeek)
python 复制代码
client = OpenAI(
    api_key="sk-xxx",
    base_url="https://api.deepseek.com"
)
  1. 使用 Ollama 本地模型
python 复制代码
# 可以选择本地模型
response = ollama.chat(model=model, messages=messages, options={"temperature": 0})
reply = response["message"]["content"]

运行方式

bash 复制代码
python main.py

🚀 技术洞察

1. 提示词工程的重要性

系统提示词是 ReAct 代理的"灵魂",一个好的提示词需要包含:

  • 角色定义
  • 工具列表和使用方式
  • 输出格式规范
  • 示例演示

2. 安全考虑

在实现工具调用时必须注意:

  • 输入验证(如计算器的白名单)
  • 避免执行任意代码
  • 限制工具调用权限

3. 多模型支持策略

项目支持两种模型调用方式:

  • API 模式:适合需要高性能模型的场景
  • 本地模式:适合隐私敏感或离线环境

4. 迭代优化策略

可以从以下方向改进:

  • 添加更多工具(文件读写、数据库查询等)
  • 实现工具选择的自动化
  • 添加错误重试机制
  • 优化提示词减少 token 消耗

📊 性能优化建议

优化方向 具体措施
减少 API 调用 批量处理相似请求
缓存搜索结果 避免重复搜索相同内容
精简提示词 只保留必要信息
异步处理 并行执行多个工具调用

🎯 总结与展望

本文要点

  1. ✅ 理解 ReAct 模式的核心概念
  2. ✅ 实现工具调用框架
  3. ✅ 设计系统提示词
  4. ✅ 构建记忆机制
  5. ✅ 支持多模型切换

未来方向

  • 🔄 工具市场:支持动态加载第三方工具
  • 🧠 反思机制:让代理能够评估自己的决策
  • 📊 性能监控:追踪代理执行效率
  • 🌐 多模态支持:处理图像、语音等多种输入

📮 互动交流

如果你有任何问题或想法,欢迎在评论区留言!如果觉得本文对你有帮助,请点赞、收藏、关注三连支持一下~

相关推荐
kyriewen15 小时前
今天,百年巨头一次砍了9200人,而一个离职科学家的实话让全网睡不着觉
前端·openai·ai编程
柠檬威士忌9851 天前
2026-05-12 AI前沿日报:GPT-5.5-Cyber、预发布评测与AI科研加速
网络安全·大模型·openai·deepmind
掉鱼的猫1 天前
agentscope-harness vs solon-ai-harness:Java 智能体「马具引擎」的双雄对决
java·openai
爱吃的小肥羊1 天前
wildAI :全球AI一键直达
aigc·openai·ai编程
runtime质量论1 天前
我让AI自主跑了一周测试,结果比我想的可怕
openai·agent
2601_957780842 天前
GPT-5.5 深度解析:2026年4月OpenAI旗舰模型的技术跨越与商业决策指南
大数据·人工智能·python·gpt·openai
Karl_wei2 天前
AI Agent 对比和选型
openai·agent·ai编程
爱吃的小肥羊2 天前
又搞事情,OpenAI 开始关闭微调服务!
aigc·openai
momo061172 天前
图文+代码: 轻易搞懂Agent的底层架构-ReAct
openai·agent