LangChain实战课-13-代理(中) | 豆包MarsCode AI刷题

57 阅读4分钟

详解了为什么用代理他就能按照ReAct的思路,进行推理-行动;AgentExecutor是代理的驱动器引擎,通过他的驱动整个代理的过程流畅运行。

链与代理的区别?

链就是给定了个流程,直接按着流程走就完事了;但是代理就不同了,在代理中,语言模型被用作推理引擎来确定要采取哪些操作以及按什么顺序执行这些操作。换句话说,代理有点大脑那味了。

image.png 整个大模型应用开发的核心理念: 操作的序列并非硬编码在代码中,而是使用语言模型(如GPT-3或GPT-4)来选择执行的操作序列

Agent 的关键组件

  1. 代理(Agent):这个类决定下一步执行什么操作。它由一个语言模型和一个提示(prompt)驱动。提示可能包含代理的性格(也就是给它分配角色,让它以特定方式进行响应)、任务的背景(用于给它提供更多任务类型的上下文)以及用于激发更好推理能力的提示策略(例如ReAct)。LangChain中包含很多种不同类型的代理。  
  2. 工具(Tools):工具是代理调用的函数。这里有两个重要的考虑因素:一是让代理能访问到正确的工具,二是以最有帮助的方式描述这些工具。如果你没有给代理提供正确的工具,它将无法完成任务。如果你没有正确地描述工具,代理将不知道如何使用它们。LangChain提供了一系列的工具,同时你也可以定义自己的工具。  
  3. 工具包(Toolkits):工具包是一组用于完成特定目标的彼此相关的工具,每个工具包中包含多个工具。比如LangChain的Office365工具包中就包含连接Outlook、读取邮件列表、发送邮件等一系列工具。当然LangChain中还有很多其他工具包供你使用。  
  4. 代理执行器(AgentExecutor):代理执行器是代理的运行环境,它调用代理并执行代理选择的操作。执行器也负责处理多种复杂情况,包括处理代理选择了不存在的工具的情况、处理工具出错的情况、处理代理产生的无法解析成工具调用的输出的情况,以及在代理决策和工具调用进行观察和日志记录。

代理就是一种用语言模型做出决策、调用工具来执行具体操作的系统简言之,代理就是利用llm生成下一步执行什么的提示词的东西。而代理执行器(AgentExecutor)就是上述机制得以实现的引擎。

深挖 AgentExecutor 的运行机制

这里就直接贴个链接去看这块的具体Debug细节吧:AgentExecutor Debug细节

这其中的关键就在于在利用大模型返回结果之前会形成以下的提示词:

0: StringPromptValue(text='Answer the following questions as best you can. You have access to the following tools:\n\n
这句提示是让模型尽量回答问题,并告诉模型拥有哪些工具。
Search: A search engine. Useful for when you need to answer questions about current events. Input should be a search query.\n
这是向模型介绍第一个工具:搜索。
Calculator: Useful for when you need to answer questions about math.\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 [Search, Calculator]\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\n (最终答案)
上面,就是给模型的思考框架。具体解释可以看一下括号中的文字

然后结合具体的输入,不断的进行这个思考-行动-观察行动结果-再思考-再行动-再观察这个循环,这其中当然会产生调用工具的思考,然后也会有调用工具的行动。同时呢,他会保存所有的思考的历史会话,进而一步步地完整解决这个问题。

AgentExecutor中最重要的方法是步骤处理方法,_take_next_step方法。它用于在思考-行动-观察的循环中采取单步行动。先调用代理的计划,查找代理选择的工具,然后使用选定的工具执行该计划(此时把输入传给工具),从而获得观察结果,然后继续思考,直到输出是 AgentFinish 类型,循环才会结束。