核心内容摘要
心跳砰砰,不止于此!双男主短剧:燃情演绎,谁能俘获你的“砰”然心动?
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 的工作流程Observation观察Thought / Reasoning推理Action行动Tool / Environment工具/环境Observation反馈循环直到 Final AnswerReAct的巧妙之处在于它认识到思考与行动是相辅相成的。
思考指导行动而行动的结果又反过来修正思考。
为此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的格式必须是以下之一
调用工具function_name(arg_namearg_value)
结束任务Finish[最终答案] # 重要提示: - 每次只输出一对Thought-Action - Action必须在同一行不要换行 - 当收集到足够信息可以回答用户问题时必须使用 Action: Finish[最终答案] 格式结束 现在请开始解决以下问题 Question: {question} History: {history}
ReActAgent代码实现classReActAgent:def__init__(self,llm_client:AgentsLLM,tool_executor:ToolExecutor,max_steps:int
:self.llm_clientllm_client self.tool_executortool_executor self.max_stepsmax_steps self.history[]defrun(self,question:str):self.history[]current_step0whilecurrent_stepself.max_steps:current_step1print(f\n--- 第{current_step}步 ---)tools_descself.tool_executor.getAvailableTools()history_str\n.join(self.history)promptREACT_PROMPT_TEMPLATE.format(toolstools_desc,questionquestion,historyhistory_str)messages[{role:user,content:prompt}]response_textself.llm_client.think(messagesmessages)print(f完整响应文本:{response_text});ifnotresponse_text:print(错误LLM未能返回有效响应。
);breakthought,actionself._parse_output(response_text)ifthought:print(f 思考:{thought})ifnotaction:print(警告未能解析出有效的Action流程终止。
);breakifaction.startswith(Finish):# 如果是Finish指令提取最终答案并结束final_answerself._parse_action_input(action)print(f 最终答案:{final_answer})returnfinal_answer tool_name,tool_inputself._parse_action(action)ifnottool_nameornottool_input:self.history.append(Observation: 无效的Action格式请检查。
);print(警告解析到的Action格式无效跳过此步骤。
);continueprint(f 行动:{tool_name}[{tool_input}])tool_functionself.tool_executor.getTool(tool_name)observationtool_function(tool_input)iftool_functionelsef错误未找到名为 {tool_name} 的工具。
print(f 观察:{observation})self.history.append(fAction:{action})self.history.append(fObservation:{observation})print(已达到最大步数流程终止。
)returnNonedef_parse_output(self,text:str):thought_matchre.search(rThought: (.*),text)action_matchre.search(rAction: (.*),text)thoughtthought_match.group(
.strip()ifthought_matchelseNoneactionaction_match.group(
.strip()ifaction_matchelseNonereturnthought,actiondef_parse_action(self,action_text:str):matchre.match(r(\w)\[(.*)\],action_text)return(match.group(
,match.group(
)ifmatchelse(None,None)def_parse_action_input(self,action_text:str):matchre.match(r\w\[(.*)\],action_text)returnmatch.group(
ifmatchelseif__name____main__:llmAgentsLLM()tool_executorToolExecutor()search_desc一个网页搜索引擎。
当你需要回答关于时事、事实以及在你的知识库中找不到的信息时应使用此工具。
tool_executor.registerTool(Search,search_desc,search)agentReActAgent(llm_clientllm,tool_executortool_executor,max_steps
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()])运行效果图