第2章 基于大模型的Agent技术框架

1,571 阅读19分钟

基于大模型的agent技术框架

2.1 agent的四大要素

一个由大模型驱动的自主agent的架构,其中包含规划(Planning)、记忆(Memory)、工具(Tools)和执行(Action)四大要素组件。

image-20240923110843936

agent位于中心位置,它通过协同各种组件来处理复杂的任务和决策过程。

  • 规划:agent需要具备规划(包含决策)的能力,以有效执行复任务。这涉及到子目标的分解(Subgoal Decomposition)、连续的思考(即思维链)、自我反思和批评(self-critics),以及对过去行动的反思(Reflection)。
  • 记忆:包含短期记忆和长期记忆。短期记忆主要与上下文学习有关,属于提示词工程的一部分;长期记忆涉及到信息的长时间保留和检索,通常利用外部向量存储和快速检索
  • 工具:agent可能调用的各种工具,如日历、计算器、代码解释器和搜索功能等等。由于大模型一旦完成预训练,其内部能力和知识边界就基本固定下来了,而且难以扩展,因此这些工具显得尤其重要。这些工具能扩展agent的能力,使其能够执行更复杂的任务。
  • 执行(或称行动):agent基于规划和记忆来执行具体的行动。这可能包括与外部世界的互动或者通过调用工具来完成一个动作(任务)。

image-20240923111845208

在上述流程中,agent通过互相关联的模块来处理和解决任务。

  • 接受任务(Task Receiving):agent首先通过读入提示来接受需要处理的任务。
  • 记忆更新(Memory Updating):agent根据具体任务更新系统的记忆,确保所有相关信息都是最新的,以便在处理任务时使用。
  • 记忆检索(Mmeory Retrieval): 由于记忆可能非常庞大,因此需要从记忆中检索相关信息,或者在必要时进行拦截,以便高效处理信息。
  • 任务规划(Task Plan): 基于提供的结构化工具、记忆和查询提示,大模型生成一个包含任务名称的计划,计划包含后续步骤和动作,其中说明了需要调用哪些工具和参数。
  • 工具执行(Tool Execution): 如果在“任务规划”模块产生的是任务完成的信号,那么循环终止,并提示agent任务完成,可以产生结论。否则,系统将调用并执行指定的工具。大模型在观察工具生成的指定格式的结果后,将其整合到任务记忆中。
  • 总结(Concluding):系统会总结出最终的答案,以完成整个任务处理过程。

Agent规划并执行子任务,利用工具来增强功能,并通过反思行为来学习和改进。通过多个模块的紧密协作,Agent能够有效地分解复杂任务,进行规划和执行,并最终生成解决方案。这种结构化和分步的方法使得复杂问题的处理变得更加清晰和可管理。

简单来说,大模型针对任务做出决策时,根据工具描述、记忆以及一些约束条件,判断是否调用已有工具。工具描述有点像工具的简版说明书,例如计算器用于解决数学计算问题。针对所谓的记忆和约束条件,可以在提示中告诉Agent(也就是告诉大模型):如果你没有这方面的知识,一定不要胡说,要查阅相关的资料。

2.2 agent的规划和决策能力

规划是将复杂任务分解成更小、更易于管理的子任务的过程。规划技术主要包括任务分解、结合外部规划器和自我反思等。

任务分解:

  • 思维链:一种提示技术,通过让模型“一步一步思考”,帮助它将大任务分解成小任务,并清楚地解释自己的思考过程。
  • 思维树(Tree of Thoughts,ToT):通过在每个步骤探索多种推理可能性,进而形成一种树状结构。思维树可以采用不同的搜索方法:深度优先搜索(DFS)和广度优先搜索(BFS),并通过提示或投票来评估每个步骤。
  • 还可通过简单提示、特定任务的指令或手动(人工)进行任务分解
  • 结合外部规划器的代表方法是**"大模型+P"**方法:它使用PDDL(Planning Domain Definition Language,一种规划问题描述语言)来描述问题,首先由大模型将问题转化为Problem PDDL,然后请求外部规划期生成计划,最后由这个计划转换回自然语言。本质上,规划步骤被外包给外部工具来完成。这种方法在某些机器人设置中很常见。

自我反思:

  • **ReAct:**这个框架通过结合特定任务的动作和语言空间,让模型能够与环境交互,并生成推理轨迹。
  • **Reflexion:**这是一个使agent具备动态记忆和自我反思能力的框架。它通过帮助agent回顾过去的行动来提高推理能力。
  • **CoH(Chain of Hindsight):**这个方法通过向大模型展示一系列带有反馈的过去输出来鼓励大模型改进自己的输出。

ReAct框架是一个极具代表性的agent的推理框架,它着眼于agent的动态性和适应性。

在ReAct框架中,agent不仅能够对任务做出推理,还能根据情况的变化自主行动和调整。在agent设计中,ReAct框架体现出了一个循环、互动的过程:agent首先感知当前状态,然后根据感知结果进行做出决策和行动,然后根据行动的结果和状态的变化进行调整,这个过程不断循环。

ReAct框架使agent更加灵活、适应性更强、能在复杂多变的环境中有效工作。

工具,也就是Tools,指的是封装给agent的功能函数、代码段和其他工具。基于ReAct框架,agent不断尝试通过外部工具来解决任务和子任务,每次工具的调用都带来一个新的结果和状态的改变。在agent开发中,这些工具不仅提供了必要的支持和便利,增强了agent的能力,而且可以确保agent的性能和可靠性。

ReAct框架提供的方法可以指导agent在动态环境中的工作,而工具调用则提供实现这一理念的技术支持。

2.3 agent的各种记忆机制

  • 通过预训练形成的记忆。
  • 上下文互动
  • 通过针对特定任务的微调进行增强
  • 大模型与外部记忆系统---动态个性理解、使用双塔密集检索模型的记忆检索以及受艾宾浩斯曲线启发的记忆更新机制等。RAG可以视为和外部知识系统整合的过程,相当于给大模型外挂第二大脑

大模型通过在多样化的数据集上进行广泛的预训练以形成“记忆”,并可以通过微调和外部知识系统的整合在特定的情境中进一步细化这些记忆。

2.4 agent的核心技能:调用工具

agent通过调用外部工具来扩展能力和提高效率。---Function Calling

首先,Agent需要能够理解和操作不同类型的工具。这可能涉及解析复杂的接口、理解各种数据格式,以及学习如何有效地使用工具。

其次,Agent需要能够在适当的时候选择合适的工具。这需要Agent深入了解各种工具的功能、优势和局限,以及能够根据当前任务和环境条件快速做出决策。

最后,Agent还需要能够协调多个工具的使用。在复杂的任务中,Aaent可能需要同时调用多个工具,并确保它们之间的协作和数据交换顺畅无误。

2.5 agent的推理引擎:ReAct框架

agent的推理引擎是其规划和决策指定过程以及调用工具执行行动的核心。

ReAct框架围绕理解和回应用户输入的基本思想构建,这种方法侧重于让大模型在收到任务后进行思考,然后决定采取的行动。

ReAct框架的核心是将推理和行动紧密结合,不仅仅是一个简单的决策树或固定的算法,而是一个综合系统,能够实时地进行信息处理、决策制定,以及行动执行。

ReAct的设计哲学是:在动态和不确定的环境中,有效的决策需要持续的学习和适应,以及快速将推理转换为行动的能力,即形成有效的观察---思考---行动---再观察的循环。

image-20240923142059403

该循环主要涉及以下三个步骤:

  • **思考(Thought):**涉及对下一个行动进行推理。在这一步中需要评估当前情况并考虑可能的行动方案。
  • **行动(Action):**基于思考的结果,决定采取什么行动。这一步骤是行动计划的选择过程。
  • **观察(Observation):**执行行动后,需要观察并手机反馈。这一步骤将对行动结果进行评估。它可能影响或改变下一轮次思考的方向。

在LangChain中ReAct框架的实现流程:

agent首先接收到任务,然后自动进行推理,最后自主调用工具来完成任务。

image-20240923143216245

一个以大模型为核心的自主agentd工作包括如下内容:

  • **任务:**agent的起点是一个任务,如一个用户查询、一个目标或一个需要解决的特定问题
  • **大模型:**任务被输入到大模型中。大模型使用训练好的模型进行推理。这个过程涉及到理解任务、生成解决方案的步骤和其他推理活动
  • **工具:**大模型可能会决定使用一系列的工具来辅助完成任务。这些工具可能是api调用、数据库查询或者任何可以提供而外信息和执行能力的资源。
  • **行动:**agent根据大模型的推理结果采取行动。例如与环境直接进行交互、发送请求、操作物理设备或更改数据等。
  • **环境:**行动会影响环境,而环境将以某种方式响应这些行动。这个响应被称为结果,它可能是任务的完成、一个新的数据点或其他类型的输出。
  • **结果:**将行动导致的结果反馈给agent。这个结果可能会影响agent未来的行为,因为agent执行任务是一个不断学习和适应的过程,直至目标任务完全解决。

LangChain强调,大模型的推理能力加上工具的功能,形成了Agent的能力内核。

在Agent内部,大模型被用作推理引擎以确定采取哪些操作以及按什么顺序执行这些操作。

LangChain乃至整个大模型应用开发的核心理念核心理念就是操作的序列并非硬编码在代码中,而是使用大模型来选择执行的操作序列。

ReAct框架的实现流程强调自主agent在完成任务时如何利用大模型的推理能力和使用外部工具,以及如何与环境互动以产生结果。这个框架凸显了大模型在推理和决策中的中心作用,并说明了工具如何为大模型扩展能力,以及agent如何通过与环境的动态交互来驱动任务的完成。

在ReAct框架的指导下,agent的四大特性得以发挥:

  • **适应性:**ReAct框架不依赖于特定的算法或技术,它可以与各种机器学习方法、推理策略和执行机制相结合。这使得他可以适用于广泛的应用场景,从简单的任务自动化到复杂的决策支持策略。
  • **交互性:**由于ReAct框架支持持续学习和动态知识管理,因此agent能够与环境交互,适应环境的变化并优化行为。这对于不断变化的环境中保持有效性至关重要。
  • **自主性:**ReAct框架赋予agent较高级别的自主性。agent不仅能够自行做出决策,还能根据情况的变化自主调整行为和策略。
  • **功能性:**通过对工具的调用,agent可以执行特定的任务,如搜索网络、生成PPTh和收发电子邮件等等。

import os

from langchain_core.tools import Tool


from langchain import hub

prompt = hub.pull("hwchase17/react")
print(prompt)

from langchain_openai import OpenAI
llm_api_key = "”
llm_api_base = ""
llm_api_model = ""
llm = OpenAI(
    api_key=llm_api_key,
    base_url=llm_api_base,
    model=llm_api_model,
    temperature=0.01,
    top_p = 0.99,

)
from langchain_community.utilities import SerpAPIWrapper
search = SerpAPIWrapper(serpapi_api_key = "")
tools=[
    Tool(
        name = "Search",
        func=search.run,
        description="当大模型没有本地知识时,用于搜索知识"
    ),
]
from langchain.agents import create_react_agent

agent = create_react_agent(llm,tools,prompt)

from langchain.agents import AgentExecutor

agent_executor = AgentExecutor(agent=agent, tools=tools,verbose=True,handle_parsing_errors=True)

agent_executor.invoke({"input":"To be or not to be,that is a question."})

基于ReAct框架的提示

模型的输出质量与提供给它的输入信息的质量和结果密切相关。

  • 提示词工程

提示工程(Prompt Engineering)是一种设计和优化输入以指导大模型(如GPT-4模型)产生特定输出的方,创造性地构建、测试和优化用于大模型的提示。

这些提示可能包括问题、陈述或指令,目的是以最有效的方式引导大模型提供所需的信息。它不仅包括文本内容的选择,还涉及格式、风格、上下文提示等方面,以激发大模型产生最佳的响应。

提示工程可以提高大模型的输出效率和准确性。通过精心设计的提示,大模型能够更快地理解问题的本质,并以更高的准确率生成有用的回答。

对于特定的应用或领域,如法律、医学或工程,可以通过提示工程定制大模型的回应,使其更加相关和专业。

好的提示设计当然可以提升用户与A1的交互体验,使对话更加自然和有趣。


from langchain import hub

prompt = hub.pull("hwchase17/react")
print(prompt)
打印结果:
input_variables=[
    'agent_scratchpad', 'input', 'tool_names', 'tools'] 
	input_types={} 
    partial_variables={} 
    metadata={
        'lc_hub_owner': 'hwchase17', 
        'lc_hub_repo': 'react', 
        'lc_hub_commit_hash': 'd15fe3c426f1c4b3f37c9198853e4a86e20c425ca7f4752ec0c9b0e97ca7ea4d'
    } 		    
    template = '
    			Answer the following questions as best you can. 
    			You have access to the following tools:\n\n
        		{tools}\n\n
            	Use the following format:\n\n
                Question: the input question you must answer\n
                Thought: you should always think about what to do\n
                Action: the action to take, should be one of [{tool_names}]\n
                Action Input: the input to the action\n
                Observation: the result of the action\n... 
                (this Thought/Action/Action Input/Observation can repeat N times)\n
                Thought: I now know the final answer\n
                Final Answer: the final answer to the original input question\n\nBegin!\n\n
                Question: {input}\nThought:{agent_scratchpad}'

PromptTemplate类是一个带有输入变量和模板字符串的结构,用于生成文本提示。

  • input_variables:一个变量名列表,这些变量名会在提示过程中被实际数据替换
  • template:定义提示格式的字符串,其中包含多个占位符、这些占位符会被input_variables中对应的数据替换掉

实例化过程中,这个提示会引导一个大模型或agent使用特定的格式来回答问题。这个过程包括思考、行动、行动输入、观察,并根据需要重复这个过程直到得到最终答案。

image-20240924104416783

4个主要步骤:

  • 行动:可能是指在一个环境中或对一个特定的挑战采取的初始行动。
  • 观察:对行动的结果进行观察,观察的对象可以是环境的反馈、手机的数据或其他形式的输入
  • 思考:涉及对观察到的信息进行处理和分析,以形成决策或下一步行动的基础。
  • 最终答案:基于前面的思考,agent会给出一个响应或者解决方案

2.6 其他agent认知框架

函数调用(Function Calling):

openai公司。

在这种框架中,大模型被用作调用预定义函数的引擎。

预定义函数可以用于API调用、数据库查询或其他程序化任务。

对于需要与现有系统集成或执行具体技术任务的应用,如自动化脚本或数据分析,此框架非常合适。

计划与执行(Plan-and- Execute):

计划与执行(Plan-and-Execute)框架侧重于先规划一系列的行动,然后执行。

这种框架使大模型能够先综合考虑任务的多个方面,然后按计划行动。

在复杂的项目管理或需要多步骤决策的场景中,这种处理方式尤为有效,如自动化工作流程管理。

自问自答(Self-Ask):

自问自答(Self-Ask)框架允许大模型对自己提出问题并回答,以此来深化理解和提高回答质量。

这种框架在需要深入分析或创造性解决方案的应用中非常有用,例如创意写作或复杂查询。

批判修正(Critique Revise)

批判修正(Critique Revise)框架也叫作Self-Refection架构。

在人工智能和机器学习领域中,这种框架主要用于模拟和实现复杂决策过程。

这种框架基于“批判”和“修正”两个核心步骤,通过不断迭代改进来提高系统的性能和决策质量。

  • 批判:在这一步骤中,系统会评估当前的决策或行为产出,并识别出其中的问题或不足之处。这一过程通常涉及与预设目标或标准的比较,以确定当前输出与期望结果之间的差距。
  • 修正:基于批判步骤中识别的问题,系统在这一步骤中会调整其决策过程或行为策略,以期提高输出质量。修正可以是调整现有算法的参数,也可以是采用全新的策略或方法。

批判修正框架的目标是通过不断自我评估和调整,使系统能够学习并改进决策过程,从而在面对复杂问题时做出更加有效的决策。

思维链

思维链(CoT),是指在解决问题过程中形成的一系列逻辑思考步骤。

在AI领域,尤其是在自然语言处理和机器理解任务中,CoT通过模拟人类的思考过程来提高模型的理解和推理能力。

通过明确展示解决问题的逻辑步骤,CoT有助于增强大模型的透明度和可解释性。

思维树

思维树(TOT),可以被视为CoT的升级版。

在ToT中,问题解决过程被结构化为一系列逻辑步骤。

ToT通过树搜索来增强大模型解决复杂问题的能力,旨在提高大模型在处理复杂任务时的效能,特别是那些需要探索或战略性前瞻的任务。

这种框架允许大模型自我评估中间思维对解决问题的贡献,并通过有意识的推理过程来选择下一步的方向。

2.7 小结

agent技术实现的四大要素:规划、工具、记忆和执行

  • 规划:agent必须能够规划和决策以有效执行复杂任务,这包括拆分子目标、持续思考、自我评价和对过往行为的反思。
  • 工具:agent需要调用各种工具,如日历或搜索功能等,这些工具是对agent核心功能的补充,允许它执行更广泛的任务。
  • 记忆:agent具备短期记忆和长期记忆能力,短期记忆有助于上下文学习,而长期记忆则关系到信息的长期保留和快速检索。
  • 执行:agent根据规划和记忆来实施具体行动,这可能涉及与外部世界的互动或通过工具完成任务。

最核心的就是规划和决策的能力

ReAct框架是一个用于指导大模型完成复杂任务的结构化思考和决策过程。

ReAct框架包括一系列的步骤,使得大模型能够以更系统和高效的方式处理和回应查询,确保它能够全面和准确地回应用户的需求。

通过ReAct框架,agent获得了动态决策能力。

当遇到自己内部知识无法解决的问题时,agent先搜索或调用工具,拓展自己的知识面。

agent还利用工具的灵活性,协调使用各种工具,在多个数据点之间进行切换,以获得最终的决策数据。

agent在执行每一步后会观察结果,并将新信息用于接下来的决策过程,这体现了agent出色的学习能力与适应性。

调用工具也是agent的核心技能之一。

这一技能对提升性能和适应性至关重要。通过有效调用和利用外部工具,agent可以扩展能力范围,以更好地完成任务,实现这一能力面临许多挑战,但通过工具封装、自适应学习、上下文感知选择等策略,可以使agent更加智能和高效。

image-20240924111236521