news 2026/7/2 2:55:22

智能体设计范式:Plan-and-Solve

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
智能体设计范式:Plan-and-Solve

智能体设计范式:Plan-and-Solve 范式

1 核心思想

Plan-and-Solve(先规划后执行)认为直接单步推理容易遗漏或出错,更好的做法是先让模型生成一个完成任务的步骤计划,然后逐步执行该计划,每步可以调用工具,最后汇总结果得到最终答案。

2 工作原理

  1. 规划阶段:给模型一个问题,要求其输出一个分步计划(例如1. 搜索2022世界杯冠军\n2. 搜索该冠军的主教练\n3. 综合信息给出答案)。
  2. 执行阶段:遍历计划中的每一步,将步骤指令作为提示,允许模型调用工具(类似 ReAct 单步),获得该步骤的结果。
  3. 综合阶段:将所有步骤的中间结果提供给模型,让它生成最终答案。

3 使用场景

  • 复杂的多跳推理问题,需要分解为多个子任务。
  • 数学应用题、需要多步查询的知识问题。
  • 需要遵循固定流程的任务(如旅行规划、报告生成)。

4 优缺点

优点

  • 全局规划减少盲目试探,提高效率。
  • 任务步骤清晰,便于调试和人工干预。
  • 可并行执行无依赖的步骤(高级实现)。

缺点

  • 计划可能不完善或错误,导致执行偏差。
  • 依赖模型规划能力,对简单问题反而增加步骤数。
  • 缺乏动态调整能力(静态计划难以应对意外情况)。

5 Python 实现

importreimportrequestsfromtypingimportListclassAliYunLLM:...# 定义与前文相同# ---------- 工具集 ----------defsearch(query:str)->str:"""真实搜索:使用 DuckDuckGo 免费 API"""try:url=f"https://api.duckduckgo.com/?q={requests.utils.quote(query)}&format=json"resp=requests.get(url,timeout=5)data=resp.json()# 优先返回“AbstractText”摘要abstract=data.get("AbstractText","")ifabstract:returnabstract# 如果没有摘要,尝试取第一个关联主题的文本related=data.get("RelatedTopics",[])ifrelatedand"Text"inrelated[0]:returnrelated[0]["Text"]returnf"未找到关于'{query}'的信息。"exceptExceptionase:returnf"搜索出错:{e}"defcalculator(expression:str)->str:try:ifre.match(r'^[\d\+\-\*/\(\)\.\s]+$',expression):returnstr(eval(expression))else:return"非法表达式"exceptExceptionase:returnf"计算错误:{e}"TOOLS={"search":search,"calculator":calculator}# ---------- Plan-and-Solve Agent ----------classPlanAndSolveAgent:def__init__(self,llm:AliYunLLM):self.llm=llmdef_make_plan(self,question:str)->List[str]:system_prompt=("你是一个规划助手。请将用户的问题分解为详细的步骤计划,每步应简单明确,可单独执行。\n""输出格式:每行一个步骤,以数字加点开头,如:\n""1. 搜索X的信息\n""2. 计算Y的值\n""3. 结合信息得到最终答案\n""请只输出步骤,不要其他内容。")plan_text=self.llm.generate(question,system_prompt=system_prompt)print(f"生成计划:\n{plan_text}")# 解析步骤,提取每行数字开头的文本steps=re.findall(r"\d+\.\s*(.*)",plan_text)returnstepsdef_execute_step(self,step_description:str,context:str="")->str:"""执行单个步骤,允许调用工具"""tool_descriptions=("- search(query: str): 搜索互联网。\n""- calculator(expression: str): 计算表达式。")system_prompt=("你是一个执行助手。你需要完成一个子任务。你可以使用以下工具:\n"f"{tool_descriptions}\n\n""输出格式:如果需要使用工具,请严格按照以下格式:\n""Action: 工具名\n""Action Input: 输入参数\n""然后你会收到 Observation,之后再给出该步骤的最终结果。\n""如果你已经可以得出该步骤的结果,请直接输出:\n""Step Result: 结果内容\n")prompt=f"当前任务:{step_description}\n"ifcontext:prompt+=f"已知上下文信息:{context}\n"prompt+="请完成这个子任务。"# 单步骤内部允许最多2次工具调用for_inrange(2):response=self.llm.generate(prompt,system_prompt=system_prompt)print(f"步骤执行输出:{response}")if"Step Result:"inresponse:result=response.split("Step Result:")[-1].strip()returnresult# 尝试解析 Actionaction_match=re.search(r"Action:\s*(.*)",response)input_match=re.search(r"Action Input:\s*(.*)",response)ifaction_matchandinput_match:action=action_match.group(1).strip()action_input=input_match.group(1).strip()ifactioninTOOLS:obs=TOOLS[action](action_input)prompt+=f"{response}\nObservation:{obs}\n"continue# 无法解析则直接返回模型的回复作为步骤结果returnresponse.strip()returnresponse.strip()defrun(self,question:str)->str:# 阶段1:生成计划steps=self._make_plan(question)ifnotsteps:return"无法生成计划。"# 阶段2:逐步执行step_results=[]context=""fori,stepinenumerate(steps,1):print(f"\n执行步骤{i}:{step}")result=self._execute_step(step,context)step_results.append(f"步骤{i}结果:{result}")context+=f"步骤{i}结果:{result}\n"print(f"步骤{i}结果:{result}")# 阶段3:综合最终答案summary_prompt=(f"问题:{question}\n"f"以下是各步骤的执行结果:\n"+"\n".join(step_results)+"\n请结合这些信息,给出最终的完整答案。")final_answer=self.llm.generate(summary_prompt,system_prompt="你是一个总结助手,请直接给出最终答案。")returnfinal_answer# ---------- 示例运行 ----------if__name__=="__main__":llm=AliYunLLM(api_key="your-api-key",base_url="https://dashscope.aliyuncs.com/api/v1",model="qwen-plus")agent=PlanAndSolveAgent(llm)question="2022年世界杯冠军的现任主教练是谁?"answer=agent.run(question)print(f"\n最终答案:{answer}")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 2:54:30

塞尔达传说旷野之息存档编辑器:3分钟打造你的专属海拉鲁冒险

塞尔达传说旷野之息存档编辑器:3分钟打造你的专属海拉鲁冒险 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 想要在海拉鲁大陆上体验不同的游戏乐趣吗&…

作者头像 李华
网站建设 2026/7/2 2:54:07

CUDA系统学习教程

课程大纲课次主题重点内容1CUDA 基础概念GPU 架构、异构计算模型2线程层级结构Grid、Block、Thread3内核函数__global__、__device__、启动语法4内存管理cudaMalloc、cudaMemcpy、cudaFree5线程索引计算blockIdx、threadIdx、多维索引6并行计算模式向量加法、矩阵乘法7同步与共…

作者头像 李华
网站建设 2026/7/2 2:52:58

SpringBoot开发实践

SpringBoot开发实践:从“约定大于配置”到高效微服务在Java企业级开发的演进历程中,SpringBoot无疑是一道分水岭。它不仅仅是一个框架的升级,更代表了一种开发哲学的转变——从繁琐的XML配置地狱到“约定大于配置”的优雅实践。本文将深入探讨…

作者头像 李华
网站建设 2026/7/2 2:49:36

Python高级异步编程实战技巧与最佳实践

Python高级异步编程实战技巧与最佳实践在当今高并发的互联网应用场景中,异步编程已成为Python开发者必须掌握的核心技能。从Web服务到数据处理,从网络爬虫到实时通信,异步编程范式通过非阻塞I/O操作显著提升了程序性能。本文将深入探讨Python…

作者头像 李华
网站建设 2026/7/2 2:48:24

前端工程化构建工具链配置实战教程

前端工程化构建工具链配置实战教程前端工程化已成为现代Web开发的标配,它通过自动化流程提升开发效率、保障代码质量。本文将带你从零开始配置一套完整的前端工程化工具链,涵盖开发、构建、测试到部署的全流程。一、环境初始化与包管理首先确保已安装Nod…

作者头像 李华
网站建设 2026/7/2 2:45:48

那些年搞不懂的术语、概念:协变、逆变、不变体

简述什么是协变性、逆变性、不变性 协变性,如:string->object (子类到父类的转换)逆变性,如:object->string (父类到子类的转换)不变性,基于上面两种情况&#xf…

作者头像 李华