当前位置: 首页 > news >正文

Agent 经典范式构建之 ReAct (Reasoning and Acting): 一种将“思考”和“行动”紧密结合的范式,让智能体边想边做,动态调整

Agent 经典范式构建之 ReAct (Reasoning and Acting): 一种将“思考”和“行动”紧密结合的范式,让智能体边想边做,动态调整

@[TOC](Agent 经典范式构建之 ReAct (Reasoning and Acting): 一种将“思考”和“行动”紧密结合的范式,让智能体边想边做,动态调整)


前言

11月份低,我开始尝试使用cursor帮我写一些苦力的业务的代码, 初始使用感觉AI编程已经基本啥都可以干,再加上企业的推广自家编码工具的流量特别大, 当时网络上一些主播跟着流量,导致整个网络满天飞AI可以取代程序员了,当时还是特别慌的了。当时随着我使用两个月, 我最近拿它做一下从0到1的开发两个技术性的项目最终都是以失败告终, 发现基本只是demo, 不能商业化使用而且发现项目代码基本最后你都能读懂,但是你就是不知道怎么改的情况。

第一次使用时候, 我是拿它写一些业务上的事情、项目上应急的和注释啥的, 感觉都可以胜任。 目前感觉写一些网页的画面可以使用它,其它一些还是自己写比较靠谱。

智能体(Agent)的经典范式之ReAct(思考和行动) 紧密结合的范式,让智能体边想边做的动态调整

最经典的一个智能体范式ReAct (Reason + Act)。ReAct由Shunyu Yao于2022年提出[1],其核心思想是模仿人类解决问题的方式,将推理 (Reasoning) 与行动 (Acting) 显式地结合起来,形成一个“思考-行动-观察”的循环。

一、ReAct 的工作流程

  1. Observation(观察)
  2. Thought / Reasoning(推理)
  3. Action(行动)
  4. Tool / Environment(工具/环境)
  5. Observation(反馈)
  6. 循环,直到 Final Answer

ReAct的巧妙之处在于,它认识到思考与行动是相辅相成的。思考指导行动,而行动的结果又反过来修正思考。为此,ReAct范式通过一种特殊的提示工程来引导模型,使其每一步的输出都遵循一个固定的轨迹:

  • Thought (思考): 这是智能体的“内心独白”。它会分析当前情况、分解任务、制定下一步计划,或者反思上一步的结果。
  • Action (行动): 这是智能体决定采取的具体动作,通常是调用一个外部工具,例如 Search[‘华为最新款手机’]。
  • Observation (观察): 这是执行Action后从外部工具返回的结果,例如搜索结果的摘要或API的返回值。

智能体将不断重复这个 Thought -> Action -> Observation 的循环,将新的观察结果追加到历史记录中,形成一个不断增长的上下文,直到它在Thought中认为已经找到了最终答案,然后输出结果。这个过程形成了一个强大的协同效应:推理使得行动更具目的性,而行动则为推理提供了事实依据。

  • 需要外部知识的任务:如查询实时信息(天气、新闻、股价)、搜索专业领域的知识等。
  • 需要精确计算的任务:将数学问题交给计算器工具,避免LLM的计算错误。
  • 需要与API交互的任务:如操作数据库、调用某个服务的API来完成特定功能。

因此我们将构建一个具备使用外部工具能力的ReAct智能体,来回答一个大语言模型仅凭自身知识库无法直接回答的问题。例如:“华为最新的手机是哪一款?它的主要卖点是什么?” 这个问题需要智能体理解自己需要上网搜索,调用工具搜索结果并总结答案

二、ReAct系统提示词

REACT_PROMPT_TEMPLATE=""" 请注意,你是一个有能力调用外部工具的智能助手。 可用工具如下: {tools} # 输出格式要求: 你的每次回复必须严格遵循以下格式,包含一对Thought和Action: Thought: [你的思考过程和下一步计划] Action: [你要执行的具体行动] Action的格式必须是以下之一: 1. 调用工具:function_name(arg_name="arg_value") 2. 结束任务:Finish[最终答案] # 重要提示: - 每次只输出一对Thought-Action - Action必须在同一行,不要换行 - 当收集到足够信息可以回答用户问题时,必须使用 Action: Finish[最终答案] 格式结束 现在,请开始解决以下问题: Question: {question} History: {history} """

三、ReActAgent代码实现

classReActAgent:def__init__(self,llm_client:AgentsLLM,tool_executor:ToolExecutor,max_steps:int=5):self.llm_client=llm_client self.tool_executor=tool_executor self.max_steps=max_steps self.history=[]defrun(self,question:str):self.history=[]current_step=0whilecurrent_step<self.max_steps:current_step+=1print(f"\n--- 第{current_step}步 ---")tools_desc=self.tool_executor.getAvailableTools()history_str="\n".join(self.history)prompt=REACT_PROMPT_TEMPLATE.format(tools=tools_desc,question=question,history=history_str)messages=[{"role":"user","content":prompt}]response_text=self.llm_client.think(messages=messages)print(f"完整响应文本:{response_text}");ifnotresponse_text:print("错误:LLM未能返回有效响应。");breakthought,action=self._parse_output(response_text)ifthought:print(f"🤔 思考:{thought}")ifnotaction:print("警告:未能解析出有效的Action,流程终止。");breakifaction.startswith("Finish"):# 如果是Finish指令,提取最终答案并结束final_answer=self._parse_action_input(action)print(f"🎉 最终答案:{final_answer}")returnfinal_answer tool_name,tool_input=self._parse_action(action)ifnottool_nameornottool_input:self.history.append("Observation: 无效的Action格式,请检查。");print("警告:解析到的Action格式无效,跳过此步骤。");continueprint(f"🎬 行动:{tool_name}[{tool_input}]")tool_function=self.tool_executor.getTool(tool_name)observation=tool_function(tool_input)iftool_functionelsef"错误:未找到名为 '{tool_name}' 的工具。"print(f"👀 观察:{observation}")self.history.append(f"Action:{action}")self.history.append(f"Observation:{observation}")print("已达到最大步数,流程终止。")returnNonedef_parse_output(self,text:str):thought_match=re.search(r"Thought: (.*)",text)action_match=re.search(r"Action: (.*)",text)thought=thought_match.group(1).strip()ifthought_matchelseNoneaction=action_match.group(1).strip()ifaction_matchelseNonereturnthought,actiondef_parse_action(self,action_text:str):match=re.match(r"(\w+)\[(.*)\]",action_text)return(match.group(1),match.group(2))ifmatchelse(None,None)def_parse_action_input(self,action_text:str):match=re.match(r"\w+\[(.*)\]",action_text)returnmatch.group(1)ifmatchelse""if__name__=='__main__':llm=AgentsLLM()tool_executor=ToolExecutor()search_desc="一个网页搜索引擎。当你需要回答关于时事、事实以及在你的知识库中找不到的信息时,应使用此工具。"tool_executor.registerTool("Search",search_desc,search)agent=ReActAgent(llm_client=llm,tool_executor=tool_executor,max_steps=10)question="华为最新的手机是哪一款?它的主要卖点是什么?"agent.run(question)

四、工具执行实现

classToolExecutor:""" 一个工具执行器,负责管理和执行工具。 """def__init__(self):self.tools:Dict[str,Dict[str,Any]]={}defregisterTool(self,name:str,description:str,func:callable):""" 向工具箱中注册一个新工具。 """ifnameinself.tools:print(f"警告:工具 '{name}' 已存在,将被覆盖。")self.tools[name]={"description":description,"func":func}print(f"工具 '{name}' 已注册。")defgetTool(self,name:str)->callable:""" 根据名称获取一个工具的执行函数。 """returnself.tools.get(name,{}).get("func")defgetAvailableTools(self)->str:""" 获取所有可用工具的格式化描述字符串。 """return"\n".join([f"-{name}:{info['description']}"forname,infoinself.tools.items()])

运行效果图

总结

Agent:https://github.com/chensongpoixs/agent/

http://www.jsqmd.com/news/315943/

相关文章:

  • 2026年北京值得关注的全家福计划服务企业推荐
  • 床垫源头工厂推荐!弹簧床垫工厂哪家好?2026年高口碑弹簧床垫厂家推荐-技术,产能,口碑多维度解析
  • 2025信奥赛C++提高组csp-s复赛真题及题解:社团招新
  • 股票强势反弹策略
  • 2026学飞择校指南!深圳考无人机驾驶证哪家好?靠谱无人机培训机构告诉你无人机培训机构哪家好
  • 2026年开年口碑不错的运动鞋垫生产厂家联系方式
  • 2026深圳注塑注塑模具采购攻略!值得信赖的电子烟模具厂家、镜头模具厂家、精密塑胶模具厂家推荐指南
  • 净化工程公司哪家好?2026洁净室工程/车间净化设计/电子净化工程公司实力解析-杭州碧海净化工程品牌优选推荐
  • 2026深圳无人机培训认准官方资质!广东省权威的无人机培训学校甄选,深圳性价比高的无人机培训学校及机构不踩雷
  • Linux操作指南
  • 新疆超低温防水卷材厂家盘点:五家实力企业深度解析
  • 每日算法练习Day03
  • 2026深圳塑胶模具采购不踩雷!热门的电子烟模具厂家、镜头模具厂家优选,精密塑胶模具厂家深耕深圳注塑全品类
  • 2026新疆建筑防水材料实力品牌综合评估报告
  • 2026年新疆工程外加剂实力厂家全面评测与推荐
  • 2026年武汉白沙洲粮油批发采购趋势与优质供应商推荐
  • 2026年生鲜超市粮油采购可靠供应商综合评估报告
  • **AI漫剧生成工具2025推荐,解锁高效创作与视觉叙事新体
  • 2026年近期赤峰探水钻机源头厂家怎么选
  • 北京火烧板厂家怎么选?2026年实力厂商盘点
  • 2026聚氨酯地坪漆厂家推荐:聚氨酯砂浆地坪厂家+聚氨酯地坪漆品牌+聚氨酯地坪厂家推荐全攻略
  • 2026年浮法白玻诚信服务商综合推荐与选型指南
  • 2026年湖北浮法白玻采购指南:优质服务商综合评测与选型策略
  • 2026年LOWE玻璃优质供应商深度评测与采购指南
  • 2026食品车间聚氨酯地坪厂家:食品车间地坪厂家+食品车间专用地坪公司+食品车间地坪生产厂家+食品厂地坪公司甄选指南
  • 2026年武汉油砂玉砂玻璃服务商综合实力与选型指南
  • 灵感不再掉线:Rokid 智能眼镜,如何把音乐创作变成随身工作站?
  • 大脑陷阱:为何你总在得失间犯蠢(想自己有的,理性思考:想象失去后 是否能承受)
  • 前后端分离在线考试系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 2026年兰州快消品软件公司深度评测与选型指南