上一篇笔记分享了提示词模板与链,这两种方式与智能体的主要区别,看起来在于无法使用工具,且提示词相对没有那么复杂(智能体基于ReAct框架)。在工具这个概念出现之前,我对于langchain的理解主要还是提示词,而这个工具箱Toolkit似乎封装了更为复杂的代码,也因而能够实现诸如爬取网页、操作网页之类的任务。
智能体这个概念似乎越来越流行,无论是基于Stable DIffusion的AI绘图生态中搭建的工作流,还是早些由多智能体组成的斯坦福小镇,以及最近比较火的用智能体操作手机购物,都有着它们的身影。
一、基础智能体
以第12节课所使用的检索谷歌的ZERO_SHOT_REACT_DESCRIPTION智能体为例,首先依然是实例化llm、tools,然后采用类似链的方式执行所需的功能:
llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
它的行为逻辑是一个:获取“任务”——“行动”——基于结果进行“观察”——“思考”——采取下一步“行动”的循环,通过此处设置agent的initialize_agent函数,发现它实例化了一个AgentExecutor,这个AgentExecutor使用_take_next_step循环调用_iter_next_step,而_iter_next_step通过使用self._action_agent.plan方法来获取代理的行动计划、遍历动作列表并为每个动作生成一个 AgentAction对象、当输出是AgentFinish则表示代理完成了它的任务并进而返回。
通过课上内容可以得知,它接收的提示词类似如下(使用LLMChain中的generate方法,调用 self.prep_prompts方法,传入input_list和run_manager以实现生成,再判断是否为BaseLanguageModel选择是否通过self.llm.bind绑定LLM)(不过生成提示词的过程看得不是很明白)(“绑定”大概就是前面链与直接调用大模型生成的结果不同的原因):
StringPromptValue(text='Answer the following questions as best you can.
You have access to the following tools:
<工具>:<介绍>
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [<前面介绍的工具>]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin!
Question: <输入的查询>
Thought:
在之后的轮次中,保持前面的系统提示词不变,不断追加来自大语言模型生成的新提示词:
StringPromptValue(
...
Question: <前面输入的查询>
Thought: <和下面内容似乎都是来自大语言模型的结构化输出>
Action:
Action Input:
Observation:
Thought:
Action:
Action Input:
Answer:
Thought:
除此之外,还有STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION、SELF_ASK_WITH_SEARCH等不同的智能体,看起来:
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION的区别主要体现在提示词前面对tools的介绍中,能够通过更丰富的介绍让它使用更复杂的结构化工具。
SELF_ASK_WITH_SEARCH则改变了输出结构,包括了fellow up与Intermediate answer两部分,让大模型可以自行追问,实现对多跳问题(Multi-hop question)的回答。
二、多智能体
这里主要介绍了模拟代理(Simulation Agents)与自治代理(Autonomous Agents)。
模拟代理主要体现在基于提示词给定的模拟情境进行,由多智能体扮演不同的角色,在“交流讨论”中获取结果,这个“模拟”似乎体现在无法使用复杂的工具与外界交互。如CAMEL通过定义能够调整对话信息的智能体,再用不同提示词模板传入chatLLM将其实例化,再将其输出作为HumanMessage不断进行循环交互。
自治代理体现在使用复杂工具,独立执行任务并服务于长期目标,如课上提到的AutoGPT、BabyAGI和HuggingGPT,BabyAGI使用了生成任务TaskCreationChain、任务优先级排序TaskPrioritizationChain、执行任务ExecutionChain三个链。
看起来,在此处智能体的概念与链的概念没有明显的区别,或许可以把智能体单元看作是结合了工具的链环节?