ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

大模型应用开发教程10 | Agent ReAct 框架实战(智能体)

大模型应用开发教程10 | Agent ReAct 框架实战(智能体) 理论部分在第 9 篇我们已经跑通了 Function Calling模型能决定“调用哪个工具 传什么参数”我们负责执行并把结果回传。但在更复杂的任务里往往不是“调用一次工具就结束”而是需要一个多步流程先查询信息搜索再做计算计算器再根据结果补充查询或修正最后综合输出Agent智能体要解决的就是这种“多步决策与执行”的问题。ReActReasoning Acting是非常经典的一种 Agent 结构Thought推理模型先思考下一步要做什么Action行动选择一个工具并给出输入Observation观察我们执行工具把结果反馈给模型重复以上过程直到产出最终答案我们可以把它理解成一个“带工具的循环”模型负责规划与决策我们负责执行与反馈。只要工具足够、循环结构清晰Agent 就能完成比单次工具调用更复杂的任务。实践部分本案例做什么实现一个最小 ReAct Agent内置两个工具search模拟搜索引擎返回实时信息的“假数据”calculate简单计算器演示用Agent 将严格按照 ReAct 格式输出并循环模型给出 Thought / Action / Action Input我们解析 Action 并执行对应工具把 Observation 追加回上下文重复直到模型输出 Final Answer 或达到最大步数主要代码本篇使用项目脚本src/4.2_react_agent.pyimportosimportrefromdotenvimportload_dotenvfromopenaiimportOpenAI load_dotenv()clientOpenAI(api_keyos.getenv(ZHIPUAI_API_KEY),base_urlos.getenv(ZHIPUAI_BASE_URL))# 1. 定义工具 defsearch(query):模拟搜索引擎print(f [System] 正在搜索:{query})if美元inqueryorUSDinquery:return当前美元兑人民币汇率约为 7.25elif天气inquery:return北京今天晴转多云气温 20-28 度else:return未找到相关信息defcalculate(expression):简单的数学计算器print(f [System] 正在计算:{expression})try:# ⚠️ 注意eval 在生产环境中非常危险仅用于演示returnstr(eval(expression))exceptExceptionase:returnf计算错误:{e}# 工具映射表tools{search:search,calculate:calculate}# 2. 构建 ReAct Prompt # 核心教会 LLM 按照 Thought - Action - Observation 的格式思考REACT_SYSTEM_PROMPT 你是一个智能助手可以使用以下工具来回答问题 1. search: 搜索引擎用于查询实时信息。输入参数搜索关键词。 2. calculate: 计算器用于数学计算。输入参数数学表达式如 11。 回答问题时请遵循以下格式可以循环多次 Question: 用户的问题 Thought: 我应该怎么做思考下一步。 Action: 工具名称 Action Input: 工具参数 Observation: 工具返回的结果 ... (重复 Thought/Action/Observation 直到得到答案) Thought: 我已经有了最终答案 Final Answer: 最终回复给用户的答案 一定要严格遵守上述格式。不要在 Observation 之前输出 Final Answer。 defparse_action(text):解析 LLM 返回的文本提取 Action 和 Action Inputaction_matchre.search(rAction:\s*(.*?)\n,text)input_matchre.search(rAction Input:\s*(.*?)\n,text)ifaction_matchandinput_match:returnaction_match.group(1).strip(),input_match.group(1).strip()returnNone,Nonedefagent_run(question,max_steps5):print(f\n 开始执行任务:{question})# 初始化对话历史historyREACT_SYSTEM_PROMPTf\nQuestion:{question}\nforiinrange(max_steps):# 1. 让 LLM 思考并决定行动responseclient.chat.completions.create(modelglm-4-flash,messages[{role:user,content:history}],temperature0.1,stop[Observation:]# 关键让模型在生成 Observation 前停止等待我们填入结果)llm_outputresponse.choices[0].message.contentprint(f\n Step{i1}LLM Output:\n{llm_output})# 将 LLM 的输出拼接到历史中historyllm_output\n# 2. 检查是否已经得出最终答案ifFinal Answer:inllm_output:final_answerllm_output.split(Final Answer:)[-1].strip()returnfinal_answer# 3. 解析并执行动作action,action_inputparse_action(llm_output)ifactionandactionintools:# 执行工具observationtools[action](action_input)print(f Observation:{observation})# 将执行结果拼接到历史中供 LLM 下一步参考historyfObservation:{observation}\nelse:print(⚠️ 未能解析出有效的 Action尝试让 LLM 继续...)historyObservation: 格式错误请确保使用 Action: 和 Action Input: 格式\nreturn任务执行超时未能找到答案。if__name____main__:# 测试案例 1需要搜索 计算q1如果有 100 美元兑换成人民币是多少resultagent_run(q1)print(f\n✅ 最终结果:{result})# 测试案例 2仅需搜索# q2 北京今天适合穿短袖吗# agent_run(q2)运行方式在项目根目录执行python3 src/4.2_react_agent.py运行结果示例运行时我们会看到模型按 Step 输出 Thought/Action并看到工具执行的 Observation最后输出 Final Answer 开始执行任务: 如果有 100 美元兑换成人民币是多少 Step 1 LLM Output: Question: 如果有 100 美元兑换成人民币是多少 Thought: 我需要先知道当前美元兑人民币汇率然后再计算 100 美元对应多少人民币。 Action: search Action Input: 美元兑人民币 汇率 [System] 正在搜索: 美元兑人民币 汇率 Observation: 当前美元兑人民币汇率约为 7.25 Step 2 LLM Output: Thought: 现在用计算器算 100 * 7.25。 Action: calculate Action Input: 100*7.25 [System] 正在计算: 100*7.25 Observation: 725.0 Step 3 LLM Output: Thought: 我已经有了最终答案 Final Answer: 100 美元大约可以兑换 725 元人民币按 1 USD≈7.25 估算。 ✅ 最终结果: 100 美元大约可以兑换 725 元人民币按 1 USD≈7.25 估算。总结这一篇我们用最小实现跑通了 ReAct Agent模型负责分步规划Thought、选择工具Action我们负责执行并把结果反馈Observation循环直到产出最终答案Final Answer。这类结构可以自然扩展到更多工具与更复杂的任务。
返回列表