返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

如何构建有效的LLM智能体

[复制链接]
链载Ai 显示全部楼层 发表于 2 小时前 |阅读模式 打印 上一主题 下一主题
前言
随着大模型技术突破和成本的降低,基于大模型的智能应用迎来大爆发,2025年被称为智能体元年,从Manus的爆火,到百度心响的发布,各行业都在积极探索他们的智能应用,那么在这个浪潮下,我们如构建有效的的智能体呢?
本篇文章,我们结合国内外的经典资料讨论「如何构建有效的智能体」话题:
我们从“什么是智能体Agent”开始,讨论“什么时候需要智能体Agent”,再到“如何选择智能应用开发技术栈”其中从图形化开发平台,聊到自研选择开发框架,再到企业级架构的畅想。最后分析“如何基于LLM实现智能应用”,我们重点讨论“Workflow工作流方案”和“Agent智能体方案”的核心原理和取舍,最后源码级探索manus的核心原理。目前技术发展迅猛,迭代频繁,欢迎大家批评指正,关注交流,后续将会分享更多干货内容。

本篇综合了Anthropic的「Building Effective Agents」及大量互联网知识资料,加上自己的实践和研究理解给大家分享。其它参考资料见于文末「附录」,感谢开源、开放的伟大,让知识唾手可得。

https://www.anthropic.com/engineering/building-effective-agents
什么是智能体Agent?

在人工智能领域,智能体是一个能够在所处环境中自主感知信息、做出决策,并根据决策采取行动以实现特定目标或任务的实体。其关键特性有自主性(能在无外部干预时控制自身行为)、感知能力(通过传感器或数据输入感知环境状态)和决策能力(处理感知信息并做出响应行动) 。

LLM 智能体,很多平台也叫Agent,是利用大语言模型(LLM)、工具和记忆来执行任务、做出决策,并能自主与用户或其他系统交互的人工智能系统。它以 LLM 为核心,突破了传统 LLM 仅专注于文本生成的局限,能够理解任务指令,通过推理规划步骤,借助外部工具和记忆信息,灵活应对各种复杂问题。在智能客服场景中,它不仅能理解客户咨询,还能调用知识库、订单系统等工具获取信息,为客户提供准确解决方案 。

基于LLM的智能体应用,国外一般叫Agent,国内将Agent翻译为“智能体”,Agent这个英文单词实际上是“代理”的意思,指的是让大模型“代理”人的行为,使用某些“工具”来完成某些“任务”的能力。

OpenAI的研究主管Lilian Weng给出的定义是:
智能体(Agent) = 大语言模型(LLM)+ 任务规划(Planning)+ 记忆(Memory)+ 工具使用(Tool Use)

图像

(图片来自Lilian Weng博客原文,见于「附录」1)

在基于大语言模型的自主智能体系统中,大语言模型就像是智能体的大脑,并由几个关键组件作为补充:

任务规划(Planning)
  • 任务分解:
    智能体将大型任务分解为更小、可管理的子目标,从而能够高效处理复杂任务。
  • 反思与优化:智能体可以对过去的行动进行自我批评和自我反思,从错误中学习并在后续步骤中改进,进而提高最终结果的质量。

记忆(Memory)
大模型本质上是无状态的,每一次交互都只基于当次的提交内容进行回答,那么多次连贯操作的上下文记忆,就需要应用来给他附加记忆的能力。
  • 短期记忆:
    所有的上下文学习(参考「附录」3.提示词工程」)都可以看作是利用模型的短期记忆进行学习。
  • 长期记忆:
    这使得智能体具备长时间保留和回忆(无限)信息的能力,通常是通过利用外部向量存储和快速检索来实现,现在也可以扩展到任何存储数据库来进行记忆。

工具使用(Tool Use)
智能体学会调用外部 API 以获取模型权重中缺失的额外信息(通常在预训练后难以更改),包括当前信息、代码执行能力、访问专有信息源等。那么现在的智能体,所有能力都可以抽象为工具,包括浏览器使用、搜索、文件操作、PPT、PS等工具SDK,也包括企业的私有核心能力如美团点外卖、滴滴打车、高德地图检索、百度搜索等API,甚至如具身智能如无人机、机器人、摄像头等设备的操控。

智能体是否好用,取决于上述每一个环节能否做好,这将会是长期探索和实践的话题,深入可以参考「附录」1.OpenAI的研究主管Lilian Weng智能体原文,后续也会出详细解读文章,欢迎大家关注交流。

什么时候需要智能体Agent?

首先Agent能做的事情,在Agent出现之前其实就能做,使用Agent无非就是构建了一个基于大模型按多步骤执行的流程,如果通过传统的开发方法,如硬编码(Hard Code)或者低代码的配置化平台(如一些SOP配置平台、流程编排平台等),也同样能实现类似Agent的流程功能。说的具体一点,Agent其实就是让大模型去调用API接口完成一些相对复杂的步骤执行,也完全同样可以直接用代码去开发这个功能,或者使用低代码平台的表单配置、逻辑配置、API接口配置,通过不同执行节点之间的参数配置、映射来构建复杂的业务流程。

Agent与传统方式的核心区别:Agent可以每一个问题生成独特的任务规划,而不需要传统的方式提前预定义好流程。并且软件交互方式从GUI(图形交互界面)到LUI(自然语言交互界面),自然语言交互的高效体验,确实带来革命性的软件使用效率提升。

在需要基于LLM构建智能应用时,Anthropic的文章中建议,尽可能寻找最简单的解决方案,仅在必要时增加复杂性。这可能意味着根本不要构建智能体系统,智能体系统通常以延迟和成本为代价来换取更好的任务性能,应当考虑这种权衡是否合理。这里注意区分基于LLM的智能应用和智能体Agent,其实现方案不同。
在需要更高复杂度的情况下,优先选择工作流,为明确的任务提供了可预测性和一致性;而当需要大规模的灵活性和基于模型的自主决策时,才需要Agent。然而,对于许多应用程序而言,通过检索和上下文示例来优化单个 LLM 调用通常就足够了。

如何选择LLM智能应用开发技术栈?

图形化配置实现智能应用

Coze、dify这样的图形化开发平台可以降低门槛,甚至无需会代码,人人都可以进行智能体创意的快速构建,但这里有2个问题:

1、Coze这样的Pass平台,数据和服务全部暴露到外部,可能是很多企业无法接受的,适合于快速试错搭建,如果需要更多的功能和个性化诉求,需要开通企业账号;

2、Dify私有化部署,由此也会带来运维成本,免费的社区版同样功能有限,以及大规模企业级智能体应用,将会对Dify的部署方式带来极大的挑战,甚至需要二开重构优化。设想一下,企业级所有的智能应用流量如何全部通过Dify来扛?

自研构建智能应用

以Java语言为例,目前可以选择开源框架Spring AI/Spring AI Alibaba或者Langchain4j框架,这些框架与SpringBoot无缝集成,就像开发传统微服务一样构建自己的智能体应用微服务。但这些框架目前还没有出正式版,都在频繁迭代发布新功能阶段。并且Anthropic的文章中指出,这些框架通过简化诸如调用大型语言模型、定义和解析工具以及将调用串联起来等标准的底层任务,让入门变得容易,但是它们常常会增加额外的抽象层,从而掩盖了底层的提示和响应,使其更难调试。此外,它们还可能让人倾向于添加不必要的复杂性,而实际上更简单的设置就已足够。他们建议开发者从直接使用 LLM API 开始:许多模式只需几行代码即可实现。如果确实使用框架,请确保了解其底层代码原理,避免出现问题,团队都需要重新学习开发框架。

企业级智能应用架构

大规模的企业级智能体应用,需要考虑当前的业务服务和接口能力如何0成本或低成本接入大模型使其成为可被大模型调用的“业务工具”,另外需要考虑企业级开发的开发发布流程,以及网关、鉴权、流控(基于tokens限流)、监控、告警等基础设施的支持,完整的企业级架构方案在阿里开源的全家桶中有构想并正在实现,SpringCloud全家桶系列应该也会跟进,大家敬请期待,下图为阿里企业级AI架构构想:

image.png

(图片来自阿里技术文章)

如何基于LLM实现智能应用?

除了开发技术选型,下一步需要决策的就是实现方案。这里又回到了什么时候需要Agent的问题,与大模型结合,从简单到复杂一般有这么4种方案:

1、在需要的场景直接调用大模型API,获得大模型的分析和总结,这是最简单的;

2、知识库问答类应用中,采用RAG方案,给大模型外挂企业私有知识库,从而让大模型能够回答企业私有知识问题,基于现在的开发平台也能快速简单实现。但是在面对用户复杂灵活的问题,或者是需要计算性、归纳性问题时,RAG的相似性搜索可能无法满足,RAG方案持续性调优也将会是长期的话题。

3、Workflow方案,通过预定义流程编排大语言模型(LLMs)和工具调用,使其具有稳定的、可预测的输出,减少不可控的风险。

4、Agent方案,完全交由大模型自主规划问题的解决流程步骤,并且能够动态调整自身流程和工具使用。

在实际应用中,往往需要综合上述方案,协同来完成企业“综合型智能应用”。下面主要讨论Workflow工作流方案与Agent方案。

Workflow工作流方案

对于大部分企业的智能体应用,都不是通用智能体应用,不需要拥有万能的流程和工具来解决用户的问题,而是结合企业内部核心服务能力构建的私有智能应用,比如你们是做打车的、点外卖的,还是电商的,亦或是机票购买的,不论你们公司的核心业务是什么,面向用户的往往都是固定流程的业务,这个时候就比较适合采用workflow来实现。那么workflow又有哪些方案?

提示链

将任务分解为一系列步骤,每个 LLM 调用处理前一个的输出,适用于可轻松分解为固定子任务的场景,以延迟换取更高准确性。可以在任何中间步骤添加程序化检查(见下图中的“Gate”),以确保流程仍在正轨上,确保可控。
路由
对输入进行分类并导向专门的后续任务,适用于复杂任务中不同类别需分别处理且分类准确的情况,这里的路由也可以是企业私有的意图识别算法,来匹配命中企业的业务流程。
并行化
包括分段(将任务分解为并行运行的独立子任务)和投票(多次运行同一任务获得多样化输出),适用于子任务可并行化加速或需多个视角获得高置信度结果的任务。
协调器 - 工作者
中央 LLM 动态分解任务并分配给工作者 LLM,适用于无法预测子任务的复杂任务。此工作流非常适合复杂任务,在这些任务中无法预测所需的子任务(例如在编码中,需要更改的文件数量以及每个文件中更改的性质可能取决于任务)。尽管其拓扑结构相似,但与并行化的主要区别在于其灵活性——子任务不是预先定义的,而是由协调器根据特定输入来确定。
评估者 - 优化器
一个 LLM 生成响应,另一个LLM提供评估和反馈,适用于有明确评估标准且迭代优化有价值的任务。当有明确的评估标准,且迭代改进能带来可衡量的价值时,此工作流程尤为有效。两个适用的良好迹象是:首先,当人类明确表达反馈时,LLM 的响应能够明显得到改善;其次,LLM 能够提供此类反馈。这类似于人类作者在创作一份精美的文档时所经历的反复修改过程。
大家在实践应用中,需要思考自身业务场景适用于上述哪一种流程方案,如果还无法满足,可能才需要考虑Agent方案。
Agent智能体方案
如果上述工作流都无法满足诉求,可以考虑真Agent方案,适用于难以或无法预测所需步骤的开放式问题,以及无法采用工作流固定流程的问题。大型语言模型可能会运行多个回合,必须对其决策有一定的信任度,当然其自主性意味着更高的成本以及错误叠加的可能性,建议在隔离环境中进行广泛的测试,并设置适当的防护措施,需要小心调试、慎重采用。
随着Manus爆火全世界,很多人都惊叹其能力,那么究竟是如何实现的呢?各路大神也发布了较多开源项目来窥探其原理,这里推荐2个开源项目来供大家体验和学习:
Python
https://github.com/mannaandpoem/OpenManus
Java
https://github.com/alibaba/spring-ai-alibaba/tree/main/community/openmanus

这里基于阿里开源的Java版openmanus,来给大家介绍其核心实现原理(这里只介绍核心原理,后面会出详细解读,大家可以关注交流学习)。
首先运行体验一下,下面为官方给的体验案例:
用户问题:我计划在接下来的五一劳动节假期到韩国旅行,行程是从杭州出发到韩国首尔,总预算为10000元。我想体验韩国的风土人情、文化、普通老百姓的生活,总行程计划为5天。请提供详细的行程并制作成一个简单的HTML旅行手册,其中包含地图、景点描述、基本的韩语短语和旅行提示,以供我在整个旅程中参考。
智能体计划及执行:一共规划了5个步骤,分别调用了浏览器、地图、文件操作等工具。
spring ai alibaba openmanus
Spring AI Alibaba Openmanus 与 Python 版本 OpenManus 设计理念相似,其总体架构如下图所示:
spring ai alibaba openmanus architecture
(图片来自阿里技术文章)
核心主流程代码:
1、任务规划(Planning)
由大模型来生成任务计划,其核心为提示词,能够让大模型分析用户问题,并规划任务,按预定义的程序能理解的格式来输出计划,下面为最终的提示词:
##IntroductionIamManus,anAIassistantdesignedtohelpuserswithawidevarietyoftasks.I'mbuilttobehelpful,informative,andversatileinaddressingdifferentneedsandchallenges.##MyPurposeMyprimarypurposeistoassistusersinaccomplishingtheirgoalsbyprovidinginformation,executingtasks,andofferingguidance.Iaimtobeareliablepartnerinproblem-solvingandtaskcompletion.##HowIApproachTasksWhenpresentedwithatask,Itypically:1.Analyzetherequesttounderstandwhat'sbeingasked2.Breakdowncomplexproblemsintomanageablesteps3.Useappropriatetoolsandmethodstoaddresseachstep4.Provideclearcommunicationthroughouttheprocess5.Deliverresultsinahelpfulandorganizedmanner##CurrentstateMaingoal:Createareasonableplanwithclearstepstoaccomplishthetask.##AvailableAgentsInformation:AvailableAgents:-AgentName:BROWSER_AGENTDescription:Abrowseragentthatcancontrolabrowsertoaccomplishtasks-AgentNameEFAULT_AGENTDescription:Aversatiledefaultagentthatcanhandlevarioususerrequestsusingfileoperationsandshellcommands.Perfectforgeneral-purposetasksthatmayinvolvefilemanipulation,systemoperations,ortextprocessing.-AgentName:TEXT_FILE_AGENTDescription:Atextfilemanipulationagentthatcancreate,read,write,andappendcontenttovarioustext-basedfiles.Suitableforbothtemporaryandpersistentrecordkeeping.Supportsmultiplefiletypesincludingmarkdown,html,sourcecode,andconfigurationfiles.#Tasktoaccomplish:帮我买一张五一去大理的机票Youcanusetheplanningtooltohelpyoucreatetheplan,assignplan_1745571134688astheplanid.Important:Foreachstepintheplan,startwith[AGENT_NAME]whereAGENT_NAMEisoneoftheavailableagentslistedabove.Forexample:"[BROWSER_AGENT]Searchforrelevantinformation"or"[REACT_AGENT]Processthesearchresults"usechinesetomaketheplan.
大家可以自己修改下面用户输入部分:
#Tasktoaccomplish:帮我买一张五一去大理的机票
丢给任何大模型应用,都能给你规划任务和使用的工具,下面是豆包的效果:
这就是大模型规划的原理,将用户问题和可以使用的工具说明一起提交给大模型,要求其规划步骤,并按预定义的程序能理解的格式来输出计划。
2、工具使用(Tool Use)
也即执行计划,根据上述大模型规划的任务列表,按顺序执行:
这里采用的多智能体的方式实现,每一步计划步骤所对应的工具,由对应的智能体来实现,为什么不是直接function call或者MCP来执行工具呢?是因为Manus太通用了,这里的每一步都还足够的复杂与灵活,每一步都需要一个对应的智能体来进一步拆解子任务来完成。下面的提示词是项目中可以被大模型规划和使用的“工具型智能体”说明:
##AvailableAgentsInformation:AvailableAgents:-AgentName:BROWSER_AGENTDescription:Abrowseragentthatcancontrolabrowsertoaccomplishtasks-AgentNameEFAULT_AGENTDescription:Aversatiledefaultagentthatcanhandlevarioususerrequestsusingfileoperationsandshellcommands.Perfectforgeneral-purposetasksthatmayinvolvefilemanipulation,systemoperations,ortextprocessing.-AgentName:TEXT_FILE_AGENTDescription:Atextfilemanipulationagentthatcancreate,read,write,andappendcontenttovarioustext-basedfiles.Suitableforbothtemporaryandpersistentrecordkeeping.Supportsmultiplefiletypesincludingmarkdown,html,sourcecode,andconfigurationfiles.
一共3个可被使用的智能体,我们继续跟踪最核心的BROWSER_AGENT(可以控制浏览器的智能体)这个智能体,其核心定义如下,提示词模版为:
@DynamicAgentDefinition(agentName ="BROWSER_AGENT",		agentDescription ="A browser agent that can control a browser to accomplish tasks",		systemPrompt ="""				You are an AI agent designed to automate browser tasks. Your goal is to accomplish the ultimate task following the rules.
# Input Format Task Previous actions Current URL Open Tabs Interactive Elements [index]<type>text</type> - index: Numeric identifier for interaction - type: HTML element type (button, input, etc.) - text: Element description Example: [33]<button>Submit Form</button>
- Only elements with numeric indexes in [] are interactive - elements without [] provide only context
# Response Rules 1. ACTIONS: You can specify multiple actions in a sequence, but one action name per item - Form filling: [\\{"input_text": \\{"index": 1, "text": "username"\\}\\}, \\{"click_element": \\{"index": 3\\}\\}] - Navigation: [\\{"go_to_url": \\{"url": "https://example.com"\\}\\}, \\{"extract_content": \\{"goal": "names"\\}\\}]
2. ELEMENT INTERACTION: - Only use indexed elements - Watch for non-interactive elements
3. NAVIGATION & ERROR HANDLING: - Try alternative approaches if stuck - Handle popups and cookies - Use scroll for hidden elements - Open new tabs for research - Handle captchas or find alternatives - Wait for page loads
4. TASK COMPLETION: - Track progress in memory - Count iterations for repeated tasks - Include all findings in results - Use done action appropriately
5. VISUAL CONTEXT: - Use provided screenshots - Reference element indices
6. FORM FILLING: - Handle dynamic field changes
7. EXTRACTION: - Use extract_content for information gathering """, nextStepPrompt =""" What should I do for next action to achieve my goal?
Remember: 1. Use 'get_text' action to obtain page content instead of scrolling 2. Don't worry about content visibility or viewport position 3. Focus on text-based information extraction 4. Process the obtained text data directly 5. IMPORTANT: You MUST use at least one tool in your response to make progress!
Consider both what's visible and what might be beyond the current viewport. Be methodical - remember your progress and what you've learned so far. """, availableToolKeys = {"browser_use","text_file_operator","terminate"})
它有3个工具:browser_use: 负责操控浏览器;text_file_operator:负责文件操作;terminate:负责命令行执行。
其中核心是使用了browser_use这个开源工具来操作浏览器,它所支持的能力也在这个智能体与LLM交互的过程中由提示词给到大模型来规划和动态调整步骤,诸如跳转、点击、输入、按键等等的浏览器控制动作:
private final String name ="browser_use";private final String description ="""	Interact with a web browser to perform various actions such as navigation, element interaction,搜索类优先考虑此工具	content extraction, and tab management. Supported actions include:	- 'navigate': Go to a specific URL, use https://baidu.com by default	- 'click': Click an element by index	- 'input_text': Input text into an element, for 百度(Baidu), the index of the input button is	- 'key_enter': Hit the Enter key	- 'screenshot': Capture a screenshot	- 'get_html': Get page HTML content	- 'get_text': Get text content of the page	- 'execute_js': Execute JavaScript code	- 'scroll': Scroll the page	- 'switch_tab': Switch to a specific tab	- 'new_tab': Open a new tab	- 'close_tab': Close the current tab	- 'refresh': Refresh the current page	""";
BROWSER_AGENT智能体,是一个ReAct智能体,因为在操控浏览器进行任务执行,如购买机票、规划行程的过程中解决用户问题需要的步骤和信息是极其复杂的,同时需要识别页面元素来找到输入框、按钮等等,就像模拟人操作进行如购买机票、规划行程的过程,需要反复与大模型进行交互。
ReAct(Reasoning and Acting,推理与行动)智能体是一种结合了推理和行动能力的新型智能体架构,旨在让智能体更好地在复杂环境中完成任务,其核心思想是将推理和行动交替进行。
ReAct 智能体基于语言模型构建,通过生成文本形式的行动序列来与环境进行交互。它能够理解自然语言描述的任务,并在推理过程中决定采取何种行动,同时根据行动的结果进一步推理和调整后续行动,以实现最终目标。
  • 推理模块
    对任务、当前状态和环境反馈进行分析和推理。它可以理解任务的目标、条件和约束,根据已有的知识和经验,生成合理的行动规划和决策。例如,在回答一个复杂问题时,推理模块会分析问题的关键信息,确定需要查找哪些知识源或执行哪些操作来获取答案。
  • 行动模块
    根据推理模块的决策,执行具体的行动。这些行动可以是与外部环境的交互,如调用 API 获取数据、在数据库中查询信息等,也可以是对内部状态的更新,如记录中间结果、更新知识库等。

3、记忆(Memory)
分析完了openmanus源码的任务规划(Planning)+ 工具使用(Tool Use),那么核心要素还缺一个记忆(Memory)呢?
大模型本质上是无状态的,每一次交互都只基于当次的提交内容进行回答,那么多次连贯操作的上下文记忆,就需要应用来给他附加记忆的能力。
在Spring AI框架中,记忆将变得十分简单,同样支持在大模型调用前后以AOP的方式来增强,如下代码从会话ID的角度将与大模型的通信过程进行存储记忆,并在与大模型交互过程中提交必要的记忆上下文给到大模型,以确保大模型连贯的理解正在执行的计划和历史步骤情况:
至此,分析完了openmanus的核心源码原理,这也是经典的Agent实现方案。
总结
我们结合国内外的经典资料讨论了「如何构建有效的智能体」话题:
我们从“什么是智能体Agent”开始,讨论了“什么时候需要智能体Agent”,再到“如何选择智能应用开发技术栈”其中从图形化开发平台,聊到自研选择开发框架,再到企业级架构的畅想。最后分析了“如何基于LLM实现智能应用”,我们重点讨论了“Workflow工作流方案”和“Agent智能体方案”的核心原理和取舍,最后源码级探索了manus的核心原理。目前技术发展迅猛,迭代频繁,欢迎大家批评指正,关注交流,后续将会分享更多干货内容。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ