摘要:我们完成了Agent的Memory,Tools,Planning的核心模块,这里还差一个LLM模型调用, 目前各个云厂商或者模型部署工具Ollama,vLLM之类的都兼容OpenAI的API接口, 某种程度上算是统一了~。
-------接上期!
Agent
我们完成了Agent的Memory,Tools,Planning的核心模块,这里还差一个LLM模型调用, 目前各个云厂商或者模型部署工具Ollama,vLLM之类的都兼容OpenAI的API接口, 某种程度上算是统一了~。
现在需要把这几个组装起来。文章开头提到了, OpenManus是个好的学习项目, 所以整体实现也是基于(抄)OpenManus实现的,暂且命名为MyManus!为了便于加深理解,实验以及后续的扩展, 做了如下改动。
简化了Tools,ReActAgent,Planning之间的依赖关系,但完全兼容OpenManus的工具。进一步简化了Planning实现, 去掉了多个Plan的调度逻辑, 暂时去掉了多Agent支持,多Agent后续还会加进来。OpenManus的Agent机制比较简单, 就如下图描述,由Planning根据每一步计划的类型选择用哪个Agent,当前代码里面目前只有一个主Agent,暂时无用。 (最新的OpenManus把PlanningAgent去掉了, Planning放到了flow里面)新增EventListenerManager,用于跟踪几个核心模块之间的协同事件,同时优化了其WebUI的文字展示~新增两个数据开发相关的工具DatabaseTool 可以做数据库相关的执行和查询操作, 为了验证Agent的问数效果。Jupyter Notebook Client 可以使得Agent远程执行Python代码和指令(比如安装依赖的Python包), 另外后续可以通过Jupyter Notebook管理敏感密钥信息。以下为整体的设计
Prompt
到这里, 你会发现前面的Memory,Tools,Planning每一部分,其实都是在解决最核心的问题:如何在正确阶段构建最佳的Prompt,印证了LLM部分描述提示词的重要性。 所以Prompt非常重要, 如果你发现Agent效果不好, 可以先从优化提示词开始。
系统的提示词,某种程度上决定了LLM对Agent的特质和能力判断, 比如借助LLM生成计划,如果没有设计系统的提示词,LLM根据用户的输入,会生成完全无关的计划,思考的域越大,效果会越差。 Openmanus里面的计划系统提示词,就很明确地告知LLM的如何执行计划,如何使用工具等。
每一步的提示词,决定LLM如何使用工具, 比如我希望LLM优先使用RemoteJupyterClient,可以重点强调其作用,尤其是加了You Can also use pip install packages when package not found 这一句,LLM可以生成pip命令,自动安装包。
Planning
PLANNING_SYSTEM_PROMPT = """You are an expert Planning Agent tasked with solving problems efficiently through structured plans.Your job is:1. Analyze requests to understand the task scope2. Create a clear, actionable plan that makes meaningful progress with the `planning` tool3. Execute steps using available tools as needed4. Track progress and adapt plans when necessary5. Use `finish` to conclude immediately when the task is completeAvailable tools will vary by task but may include:- `planning`: Create, update, and track plans (commands: create, update, mark_step, etc.)- `finish`: End the task when completeBreak tasks into logical steps with clear outcomes. Avoid excessive detail or sub-steps.Think about dependencies and verification methods.Know when to conclude - don't continue thinking once objectives are met."""ManusAgentSYSTEM_PROMPT = "You are OpenManus, an all-capable AI assistant, aimed at solving any task presented by the user. You have various tools at your disposal that you can call upon to efficiently complete complex requests. Whether it's programming, information retrieval, file processing, or web browsing, you can handle it all."NEXT_STEP_PROMPT = """You can interact with the computer using PythonExecute, save important content and information files through FileSaver, open browsers with BrowserUseTool, execute python code with RemoteJupyterClient and retrieve information using GoogleSearch.PythonExecute: Execute Python code to interact with the computer system, when RemoteJupyterClient not work, try use this.RemoteJupyterClient: Execute Python code on a remote Jupyter Server to data processing, automation tasks, etc. You Can also use pip install packages when package not found.FileSaver: Save files locally, such as txt, py, html, etc.BrowserUseTool: Open, browse, and use web browsers.If you open a local HTML file, you must provide the absolute path to the file.GoogleSearch: Perform web information retrievalTerminate: End the current interaction when the task is complete or when you can do nothing.Based on user needs, proactively select the most appropriate tool or combination of tools. For complex tasks, you can break down the problem and use different tools step by step to solve it. After using each tool, clearly explain the execution results and suggest the next steps.Always maintain a helpful, informative tone throughout the interaction. If you encounter any limitations or need more details, clearly communicate this to the user before terminating."""toolsSYSTEM_PROMPT = "You are an agent that can execute tool calls"NEXT_STEP_PROMPT = ("If you want to stop interaction, use `terminate` tool/function call.")实验
好了, 终于到实验环节了, 为了验证前面的实现,做了以下几个场景的实验。
经过我精心雕花,我们可以借助WebUI来观察效果,Planning和ReAct Agent用的LLM都是:qwen-max-latest
实验一,写一个QuickSort(无计划):生成很快,前面直接给出结果,并希望获得下一步指示,但是我们并没有给Agent其他额外指令(LLM很热情,但是感受不到你需要它) 最后LLM只选择JupyterClient验证了代码正确性。总结,我们可以从以上几个实验看到:
单纯的ReAct模式的Agent对LLM的依赖较高, 执行效率也高,产生的结果没有过多修饰。使用Plan and Solve模式下,可解释性提高, 但有时生成的计划赶不上变化和实际不符合,导致ReAct会在一个计划步骤内完成所有事情。天气的实验,Agent对工具的能力依赖较高,需要考虑"兜底的逻辑",防止LLM出现幻觉。复杂的任务会上下文输入会超过LLM的限制,导致任务无法进行下去。并不能稳定地产生正确的结果,有时生成的代码或者SQL能正确执行,但结论是错误的。改进
自主化演进
自我批判:实验中可以看到, 通过LLM的规划能力,能够使得Agent更好的完成复杂的任务,在任务规划方面从基于规则、参数的规划能力逐步向基于环境的感知,实践的反思、迭代进化。 ReActAgent具备一定的感知,反思,迭代能力,但是无法完成复杂的任务,可解释性比PS要低。 当前我们Planning有两个问题,1是依据较少,LLM容易出现幻觉,导致步骤较多, 执行计划前需要更多信息。 2是计划执行过程中,无法动态调整, 需要能够动态改进计划。代码即为工具:在工具使用与选择方面,向多种工具的选择规划进化,甚至更进一步地创造适用于 LLM 的工具。LLM创造工具,依赖于其编码能力,比如Manus团队在描述是否使用MCP时,提到受到CodeAct启发,将代码执行视为解决问题的工具而非目标,正所谓“太极生两仪。两仪生四象,四象生八卦”。Executable Code Actions Elicit Better LLM Agents
自我成长:如何让Agent根据之前的经验(记忆)改进行为呢?上下文长度限制和注意力问题:ReAct Agent依靠周而复始的Thought- Action-Observation不断迭代,得到最终的结果,Agent会记录每次的结果,按时间序列组织记忆,随着步数的增多,每次给LLM的上下文会变得很长, 比如Qwen-Max 有32K的上下文长度,多轮对话或者复杂的问题处理,很容易超出LLM的上下文长度限制。而且如果每次给LLM的上下文都很大,LLM推理的性能相应的也会变慢。除了慢以外,也会影响LLM的注意力,LLM并不能稳定的利用长输入上下文信息, LLM比较容易“记住”开头和结尾的上下文,中间的部分有时会被忽略, 就和你开一个漫长的会议一样, 没有结论的会议等于白开了。Lost in the Middle: How Language Models Use Long Contexts
对记忆进行概括和抽象:实际中如果让Agent每次进行下一次行为之前都要回忆一生,听起来都觉得不靠谱。所以Agent的记忆管理很重要。 Agent记忆, 可以结合RAG技术,实现将知识库转变为长期记忆。实现时需要区分短期工作(交互的上下文)和长期记忆, 同时能够根据用户行为习惯和反馈保存和修改记忆,对后续的Agent的体验可能会有帮助。 实现上可以参考MemGPT和Mem0的设计思路。 针对记忆的存储,整理和读取三个阶段,进行干预。 比如Mem0是依靠LLM来实现记忆分层和自适应能力。Mem0 Memory Operations
Agent自我学习能力评测: Anthropic官方关于构建AI Agent的建议中,提到的最重要的一点就是:Make sure that you have a way to measure your results。 最近不小心看到了StreamBench这个项目, 可能会有帮助。StreamBench: Towards Benchmarking Continuous Improvement of Language Agents
多Agent
ChatDev: Communicative Agents for Software Developmen
吴恩达提到的Agent设计模式有四个(Reflection,Tool Use, Planning,Multi-Agent Collaboration),我们验证了前三个。
Multi-Agent Collaboration可以提高任务执行效率,多个智能体分工协作,同时具备复杂问题分解能力。
每个Agent各司其职,其上下文记忆对LLM也友好, 不容易偏差,可以更好的利用LLM。 凡事都有两面性,多个Agent也会带来新的问题,就如同微服务相对于单体应用一样,增加了系统的复杂度。 这就引入了Agent之间协作,信息共享,隐私安全,多智能体学习问题。下图是《Why Do Multi-Agent LLM Systems Fail?》 这篇Paper描述的三种常见的失败类别。
Why Do Multi-Agent LLM Systems Fail?
前文提到的Planning的问题,对于复杂问题的规划,往往会遇到困难或者因为LLM的幻觉,生成不合理的步骤。 虽然ReActAgent有时可以通过推理,行动,观察来为Planning的不合理计划兜底, 但是会降低Agent的效率。
归因为没有对Planning生成的计划进行验证。 针对这个问题,Google提出了新的框架PLanGEN, 包含三个关键的组件: 约束,验证和选择智能体。在PlanGEN框架中,智能体根据实例复杂性优化算法选择,确保更好地适应复杂的规划问题, 约束引导的迭代验证可以提升推理时算法的性能,而适应性的选择则进一步提高了在复杂规划和推理问题上的表现。
PlanGEN: A Multi-Agent Framework for Generating Planning and Reasoning Trajectories for Complex Problem Solving
另外《Scaling Large-Language-Model-based Multi-Agent Collaboration》https://arxiv.org/abs/2406.07155这篇Paper提到了协作涌现。 受到神经网络规模法则的启发,增加神经元会导致新能力的涌现,在多智能体协作中,增加智能体是否遵循类似的原理,挺有趣的。
MCP
MCP(Model Context Protocol)是由Anthropic公司提出的一种协议,其核心动机在于显著提升AI模型(如Claude)与外部系统之间的交互能力。通过开源的方式,MCP不仅鼓励社区共同参与和完善这一协议,还旨在推动AI Agent生态的发展。从技术角度来看,MCP的设计并不复杂,但其真正的力量来自于共识——这种共识使得不同系统间的协作成为可能,并为开发者提供了一种标准化的解决方案。
借助MCP,Agent只需一次接入即可无缝适配多种工具和服务,从而大幅减少碎片化开发的重复劳动。MCP让一个Agent能够连接整个世界,实现跨系统的无缝集成能力。如果想追踪MCP当前的发展动态及其生态状况,可以关注awesome-mcp-servers:https://github.com/punkpeye/awesome-mcp-servers项目,这里汇聚了全球开发者对这一领域的最新探索与贡献。
在架构设计上,MCP将Host(Client)与Server分离,工具由Server端调用,而Server端则负责统一管控这些工具的使用,并对外提供服务。这种设计模式提高了系统的灵活性和可扩展性, 对于云服务提供商来说或者Dify这种LLMOps中间价产品,是利好的, 个人觉得可能有如下几个方面:
1. 服务复用
MCP通过标准化工具集成流程,云厂商无需再为每个客户或场景单独开发接口,客户也不需要定制开发,而是可以直接复用现有的成熟服务模块。在保证功能完整性的同时,也降低了维护成本。
2. 一站式平台构建
依托MCP的标准化协议,云厂商能够快速搭建起“一站式”AI服务平台。例如,通过可视化管理界面和低代码工作流配置工具,用户无需深入理解底层技术细节,便可轻松完成复杂的任务部署。
3. 工具生态整合
在MCP的支持下,客户不仅可以享受云厂商提供的专属工具,还能自由利用开源生态中的丰富资源,如数据库、浏览器自动化工具等。这些工具通过Agent进行统一调用,形成了一套协同的工作体系。云厂商因此得以借助开源社区的力量,避免从零开始开发,从而帮助用户加速AI应用的落地进程,这是一种共生关系。
4. 合规与安全性保障
通过在MCP Server端实施权限管理、审计机制以及沙箱环境的构建,能有效减少敏感数据暴露的风险。例如,在MyManus中引入JupyterClient时,就是希望为代码执行其设计了一个受控的沙箱环境,允许单租户拥有专属的环境变量设置。
也有反对使用MCP的, 比如LangChain发起了讨论,并对MCP是否是昙花一现发起了投票,有40%的人认为是个未来的标准, 20%的认为是昙花一现。 具体讨论可以看 MCP: Flash in the Pan or Future Standard? .
当下不能过于神化任何AI相关东西,MCP解决不了LLM很多时候无法正确地使用工具问题,但还是值得投入研究的,“人们总是高估一项科技所带来的短期效益,却又低估它的长期影响”。AI最大的机会可能在于改变现有的业务流程和产品,专注特定的小规模的业务场景,深入解决具体问题,而不是追求建立大型平台。
最后
看了许多关于人工智能的学术文章与技术论文之后, 深切体会到,唯有将这些理论付诸实践,将其转化为文字和具体的代码,才能真正感受到当下大型语言模型(LLM)所蕴含的非凡魅力,这种从认识到实践的过程,不仅加深了技术理解,更是一场思想深度对话,Agent相关的研究还有很多,希望这篇文章对大家有帮助,也算是为知识传播尽了一份绵薄之力,如果没有,书写本身便已是一种自我沉淀与逻辑自洽的过程,也足以让自己满足~
参考附录:
Tool Learning with Large Language Models: A Survey:https://arxiv.org/abs/2405.17935ReAct: Synergizing Reasoning and Acting in Language Models:https://arxiv.org/abs/2210.03629Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models:https://arxiv.org/abs/2305.04091ChatDev: Communicative Agents for Software Developmen:https://arxiv.org/abs/2307.07924https://arxiv.org/abs/2405.17935:https://arxiv.org/abs/2405.17935https://www.holisticai.com/blog/llm-agents-use-cases-risks:https://www.holisticai.com/blog/llm-agents-use-cases-risksScaling Large-Language-Model-based Multi-Agent Collaboration:https://arxiv.org/abs/2406.07155PlanGEN: A Multi-Agent Framework for Generating Planning and Reasoning Trajectories for Complex Problem Solving:https://arxiv.org/abs/2502.16111A Survey on the Memory Mechanism of Large Language Model based AgentsLost in the Middle: How Language Models Use Long Contexts:https://cs.stanford.edu/~nfliu/papers/lost-in-the-middle.arxiv2023.pdf来源:心平氣和