AgentExecutor 顾名思义,Agent执行器,本篇先简单看看LangChain是如何实现的。
先回顾
AI菜鸟向前飞 — LangChain系列之十四 - Agent系列:从现象看机制(上篇)
AI菜鸟向前飞 — LangChain系列之十五 - Agent系列:从现象看机制(中篇)一个Agent的“旅行”
AI菜鸟向前飞 — LangChain系列之十六 - Agent系列:从现象看机制(下篇)一款“无需传递中间步骤"的Agent
当时在介绍Agent,给大家的一个让Agent执行的示例,
intermediate_steps = []
while not isinstance(
res := agent.invoke({"input": "AI菜鸟向前飞系列文章出自哪里?", "intermediate_steps": intermediate_steps}), AgentFinish):
for each in res:
observation = {tool.name: tool for tool in tools}[each.tool].invoke(each.tool_input)
intermediate_steps.append((each, observation))
这次为了方便与AgentExecutor更好的对比,将程序微调如下样式:
intermediate_steps = []
while True:
res = agent.invoke({"input": "AI菜鸟向前飞系列文章出自哪里?", "intermediate_steps": intermediate_steps})
if isinstance(res, AgentFinish):
break
for each in res:
observation = {tool.name: tool for tool in tools}[each.tool].invoke(each.tool_input)
intermediate_steps.append((each, observation))
抽丝剥茧,从下图可以更好的看出官方是如何实现的,其实、“几乎一样”
释义:
-
蓝色:官方用
迭代次数
与耗时
多方面判断是否要进入循环(即:while True) -
褐色:官方也是AgentFinish判断,和拼接intermediate_steps(即:循环体内部处理)
-
敲黑板、划重点
-
粉色:特有的类型,AgentStep,它将每一个要执行的方法和返回值都作为一个AgentStep,例如:
-
绿色:另一种实现方法,封装为
def plan
作用是调用LLM(大语言模型)后,大模型响应的内容(这个很好理解,就不晒图了)
-
One more thing...
谈谈Tool的return_direct
属性 为啥之前讲tool时不介绍它,因为学会了AgentExecutor再了解它会更有意义:)
AI菜鸟向前飞 — LangChain系列之十三 - 关于Tool的必知必会
若看不懂的话,咱们做个实验
,tool的return_direct取值
-
True
{'input': 'AI菜鸟向前飞系列文章出自哪里?', 'output': 'AI菜鸟向前飞文章出自Song榆钱儿的公众号。'
-
False(默认)
// 不同的LLM的output内容可能会不同
{'input': 'AI菜鸟向前飞系列文章出自哪里?', 'output': 'AI菜鸟向前飞系列文章出自Song榆钱儿的公众号。'
简单来说,True:直接返回函数的返回值,False:将函数返回值再经过‘润色’返回