手把手构建一个轻量级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. ✅ 支持多模型切换

未来方向

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

📮 互动交流

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

相关推荐
牛肉干me1 小时前
开源一个 Codex 本地历史管理 CLI:从 list 到安全 purge
openai
Aqoo1 小时前
Gartner 把 OpenAI 评为编程智能体领导者,但真正的信号藏在细节里
openai
AImatters5 小时前
左手Anthropic,右手OpenAI:亚马逊云科技不押模型,押入口
openai·agent·亚马逊云科技·anthropic·amazon quick
爱学习的鱼佬7 小时前
告别内网模型接入烦恼!ModelStandardization:让 Open WebUI等工具无缝对接私有大模型
rust·开源·大模型·openai·openwebui·model api代理·内网部署
Aqoo21 小时前
ACTS:用 MDP 建模推理过程,让 LLM 省 token 还不掉准确率
openai
机器之心21 小时前
当Token飙到天文数字,高通用「计算连续体」重搭智能体新基建
人工智能·openai
机器之心21 小时前
一夜之间,ChatGPT与Codex合并了
人工智能·openai
机器之心21 小时前
老黄的Cosmos 3刚发一天,就被一家中国公司反超了
人工智能·openai
代码简单说1 天前
Codex接入DeepSeek教程:使用CC-Switch配置API渠道(图文详解)
openai·ai编程
FinClip1 天前
凡泰极客携FinClaw亮相深圳金博会,助力金融机构落地AI数字员工
openai