- 大模型项目实战:Agent开发与应用
- 高强文
- 4034字
- 2025-05-07 11:54:59
1.4 Agent主要组件
Agent是一种能够自主决策并采取行动实现人类设定目标的实体。为了达到所定义的功能,Agent需要在大语言模型的支持下,通过Planning、Tools、Memory和Action组件的配合完成任务。Agent的整体架构如图1-1所示。

图1-1 Agent整体架构
在一个Agent系统中,可能会有多个Agent协作完成任务,其中有的Agent代表人类用户的角色,有的代表人工智能助手的角色,有的扮演各种与完成任务相关的职业角色。各种Agent系统实现的功能不同,工作流程也不同,但组件大体相同。
1.4.1 大语言模型
大语言模型是Agent技术的主要推动者,Agent受大模型技术驱动,而大语言模型则通过以Agent为业务的落地执行端来影响现实世界,两种技术相互配合、相互促进,共同拓展AI应用的服务能力。
1.服务内容
大语言模型为Agent提供三种服务:第一种是常规的推理生成内容服务,Agent传给LLM与任务有关的提示词,LLM给出推理的结果;第二种是更具主动性的Function-calling(函数调用)服务,这要求大语言模型具备规范化输出的能力,目前并不是所有大语言模型都能够支持这一特性;第三种是文本向量化服务,将纯文本转化成向量表示方式,主要用于文本的语义近似比对。
(1)内容生成
在内容生成服务方面,LLM服务于Agent的Planning组件,依据Planning制定的提示词和会话记录,生成新的内容。Planning组件会使用一些提示词策略,与LLM反复交互,推动Agent逐步完成任务。一般情况下还会在提示词中要求LLM按某种固定的格式返回数据。在响应Agent的请求时,LLM通过任务分解、任务优先级排列等不同方式,理解Agent的意图,按要求生成答案。
(2)Function-calling
Function-calling是大语言模型主动调用外部接口的一种手段。虽然LLM不能直接调用Agent的Tools组件声明和实现的外部函数,但LLM可根据Agent的输入主动选择函数名称和推理出函数的参数值,并将这些输出信息交给Tools组件来执行具体的动作。LLM通过这种规划能力间接地“远程指导”Agent执行任务。
在使用Function-calling功能时,Agent生成的提示词的消息中会带有Tools节点,这就要求提供OpenAI兼容接口的服务程序进行参数解析。在进行Agent开发时,要根据当前的Agent框架是否需要Function-calling来选取大语言模型API的服务提供者。
(3)文本向量化
经过向量化处理,文本会形成向量化表示,这样原来针对文本的处理就变成了针对数字的处理。比如,对两段文本的语义进行相似度比较的过程中,文本的向量化计算结果代表两者的语义相关性。这种大语言模型服务的典型应用场景是检索增强生成(Retrieval-Augmented Generation,RAG)应用。
2.服务方式
大部分Agent框架与大语言模型通过OpenAI兼容接口方式交互,其中Chat接口“/v1/chat/completions”是最常用的,有一部分Agent还要用到向量化接口“/v1/embeddings”。在很多情况下,大语言模型提供的向量化接口与Agent要求的格式并不兼容,所以在相当一部分Agent应用开发的场景中,Agent应用端会以自行装载向量模型的方式来解决文本向量化问题。除此之外,有时也会用到获取模型列表接口“/v1/models”。
Ollama[12]工具在迅速普及的过程中,获得了很多Agent开发框架的支持,大语言模型部署得到了简化,Agent的LLM配置也变得非常容易。
1.4.2 规划组件
Planning(规划)组件为Agent提供了一种自主“思考”问题、解决问题的能力。这是Agent从被动执行人类命令的助手向智体升维的核心能力。Planning组件思考问题的过程中,有提示词工程(Prompt Engineering)的理论和实践支持,也有Action组件和Tools组件执行外部命令的反馈,还有大语言模型理解Planning组件提出的问题而推理给出的回应。这几个因素综合起来,让Agent模仿出人类“思考—行动—观察—然后再思考”的多次迭代的流程,使得Agent具备了主动决策和处理事务的能力,形成一种智体。
Planning组件实现这种能力是靠思考框架完成的。下面我们介绍四种常用的思考框架。
1.常用的思考框架
(1)ReAct
ReAct思考框架的概念来源于论文“ReAct:Synergizing Reasoning and Acting in Language Models”,其核心思想是通过思维链(CoT)的方式,引导模型将复杂问题拆解,形成包含主观思考(Thought)的提示词,输入大语言模型进行推理(Reasoning),再由工具来行动(Acting),并对行动结果进行观察(Observation),以为下一轮思考(Thought)做好准备。
ReAct的原理可以理解为Agent先思考如何提问才能让大语言模型更好地回答问题,然后在采取每一步行动之后,都要观察行动的结果,如生成的程序执行结果是否正常、搜索结果是否完整等,再根据这些结果考虑下一轮提问。在这样的循环过程中,如果任务达成(可以将原始任务和本轮得到的答案交给LLM进行比对和判定)、循环轮次达到设定的阈值或任务时间超出时间限制,则退出任务循环。
(2)ToT
ToT(Tree of Thought,思维树)思考框架用于解决探索或预判战略的复杂任务。该框架基于思维链提示进行总结,引导大语言模型把思维作为中间步骤来解决通用问题。ToT的方法论由Shunyu Yao等人在论文“Tree of Thoughts:Deliberate Problem Solving with Large Language Models”[13]中提出,概括了流行的思维链方法来提示大语言模型,并允许对连贯的文本单元(思考)进行探索,这些文本单元是解决问题的中间步骤。ToT维护着一棵思维树,允许LLM通过考虑多种不同的推理路径和进行自我评估来决定下一步行动方案,以及在必要时向前回溯来做出全局选择,从而进行深思熟虑的决策。从论文配套的源码库[14]中可以看出,ToT解决问题的主要流程有generation、evaluation和selection三步:generation根据当前任务的输入,生成一定数量的候选项;evaluation评估每个候选项的质量或可能性,给出评分;selection根据评分结果,选择候选项作为下一轮迭代的入参。
(3)Reflexion
Reflexion(自我反思)的方法来自Noah Shinn等人的论文“Reflexion:Language Agents with Verbal Reinforcement Learning”[15],引入自我评估、自我反思和记忆组件来拓展ReAct思考框架,通过定义任务、生成轨迹(Trajectory)、评估、执行自我反思、生成下一条轨迹的流程快速改进决策。Reflexion通过语言反馈来强化语言类Agent,对任务反馈信号进行语言方面的反思,并在情节记忆缓冲区中保持自己的反思文本,以改善后续尝试中的决策。Reflexion框架侧重于实时反应,Agent在执行过程中根据即时反馈进行调整和优化,这种方案适用于动态和变化快的环境,能够快速适应和响应新的情况。
(4)CoT
CoT(Chain of Thought,思维链)在谷歌发布的论文“Chain-of-Thought Prompting Elicits Reasoning in Large Language Models”[16]中首次提出,通过让大模型逐步参与,将一个复杂问题分解为多个子问题,并依次求解。在用大语言模型进行推理时,将传统的提示词从输入直接到输出的映射方式“输入→输出”,改变为从输入到思维链再到输出的映射方式“输入→思维链→输出”。CoT框架强调通过逐步推理和逻辑链条来解决问题,Agent依赖一系列连贯的思维步骤,逐步推导出解决方案,适用于需要严谨逻辑和分解步骤的问题。
2.思考过程举例
下面以人类向Agent下达任务“计算π的平方”为例,比较以上四种思考框架的提示词工程,如表1-3所示。注意表1-3给出的是模拟过程,并非真实的推理结果,目的在于从常识的角度阐述不同框架下的提示词侧重点及推理流程。
表1-3 四种思考框架的提示词示例

(续)

1.4.3 记忆组件
Agent的Memory(记忆)组件是实现智能决策的一个重要组件,它使得Agent能够存储、检索和利用信息,以便更好地完成任务。记忆分为短期记忆和长期记忆。
1.短期记忆
大语言模型本身不记录与应用的对话历史,但基于LLM的对话应用具备一定的记忆功能,用户与LLM的交互历史一般存在于调用者的本地变量中,每次提问,这些历史对话记录和新的提示词要拼接在一起传给大语言模型,这种存储于内存的记忆方式就是短期记忆。Agent的短期记忆与大语言模型的记忆类似,一般通过提示词工程来实现,常见的短期记忆包括会话上下文、思考过程、任务规划、子任务分解结果等。大语言模型的上下文长度(Context length)是有限的,随着交互的轮次增加,Agent的提示词会越来越长,有可能超过Context length上限,解决办法是只保留一定量的历史会话记录,丢弃过期的信息,还有一种方法是使用LLM对历史会话记录进行总结,这相当于对历史信息进行“压缩”。
2.长期记忆
让Agent拥有长期记忆,可以有效地拓展Agent的应用场景和能力。比如,在任务驱动型Agent应用中,长期记忆需要记录任务的分解过程、任务执行的结果、任务的优先级,而且要在使用时很方便地调取;在角色扮演类Agent应用中,长期记忆可用于角色性格塑造,或当角色要回忆某件事时,可以快速地从深层记忆中召回信息。在RAG应用中,原始知识文档经切分、向量化后持久保存,在用户提问时通过语义检索从长期记忆体中获取知识条目。Agent的长期记忆一般采用向量数据库实现,从文本到向量的计算过程由向量模型完成。
1.4.4 工具组件
Agent的规划方法论出自思考框架、提示词工程,其能力最终来自大语言模型的推理。因为LLM语料整理的时限性以及训练的原理,对新知识的支持会有时间差,并且LLM在某些领域的能力也有欠缺,这些问题都需要在LLM上外挂工具(Tools)来解决。目前常用的工具扩展方式以搜索为主,包括从搜索引擎、Excel文件、PDF文件等数据来源进行搜索。工具的名称和参数定义打包到提示词里一起传给LLM,LLM通过推理决定是否命中工具,使用什么样的参数调用工具,而具体的调用动作由Agent开发框架完成。
1.4.5 行动组件
Agent的行动(Action)组件用于将抽象的决策结果转化为具体的代码执行过程,比如,将LLM生成的源代码写入指定的目录,运行程序并获取结果。Action和Tools都可以执行外部程序,区别在于Tools的功能是由开发者定义和实现的,而Action的功能是由LLM生成的,依赖LLM的推理能力和执行环境的兼容性。
Action的执行环境有操作系统、Python环境和Docker等。在操作系统上执行的任务主要是文件的读写。由于Agent程序基本是用Python语言开发的,一般运行在Python的虚拟化环境下,所以执行LLM生成的Python代码具有天然优势,但是经常会出现的问题是依赖库不全。在这种情况下,有一些Agent开发框架会调用“pip install”命令安装缺失的库,尽量保证程序能正常运行。对于任务相对固定的细分领域应用,这个问题可以通过预先安装可能用到的库来解决。Docker是一个开源的应用容器引擎,可以为应用创建一个轻量级、可移植的容器。将Docker用作Agent的执行环境,可以将LLM产生的程序及其依赖库打包到一个容器中,然后这个容器就能很容易地被运送到其他的机器上运行,而且易于装载、复制、移除,适用于软件弹性架构。
[1]https://aws.amazon.com/cn/what-is/ai-agents/。
[2]https://www.ibm.com/think/topics/ai-agents。
[3]原意是“副驾驶”,这里特指GitHub的编程助手Copilot,见https://github.com/features/copilot。
[4]https://learn.microsoft.com/en-us/azure/cosmos-db/ai-agents。
[5]参考百度百科的“图灵测试”词条。
[6]30%是图灵对2000年机器思考能力的一个预测。GPT-4虽然超过了30%,但低于人类参与者设定的基线66%,所以不能认为GPT-4已通过了图灵测试。
[7]https://www.baeldung.com/cs/goal-based-vs-utility-based-agents。
[8]Reasoning and Acting,参见“ReAct: Synergizing Reasoning and Acting in Language Models”,https://arxiv.org/abs/2210.03629。
[9]参考百度百科的“阿尔法围棋”词条。
[10]https://arxiv.org/abs/1706.03762。
[11]一个AI Agent项目列表,https://github.com/e2b-dev/awesome-ai-agents。
[12]Ollama是一种启动并运行Llama 3.1、Mistral、Gemma 2和其他大语言模型的工具,https://github.com/ollama/ollama。
[13]https://arxiv.org/abs/2305.10601。
[14]https://github.com/princeton-nlp/tree-of-thought-llm/blob/master/src/tot/methods/bfs.py。
[15]https://arxiv.org/abs/2303.11366。
[16]https://arxiv.org/abs/2201.11903。