计划和执行
计划和执行代理通过首先计划要做什么,然后执行子任务来完成目标。这个想法在很大程度上受到BabyAGI和"Plan-and-Solve"论文的启发。
计划通常由LLM完成。
执行通常由一个单独的代理(配备工具)完成。
导入
from langchain.chat_models import ChatOpenAI
from langchain_experimental.plan_and_execute import PlanAndExecute, load_agent_executor, load_chat_planner
from langchain.llms import OpenAI
from langchain import SerpAPIWrapper
from langchain.agents.tools import Tool
from langchain import LLMMathChain
工具
search = SerpAPIWrapper()
llm = OpenAI(temperature=0)
llm_math_chain = LLMMathChain.from_llm(llm=llm, verbose=True)
tools = [
Tool(
name="搜索",
func=search.run,
description="在需要回答关于当前事件的问题时很有用"
),
Tool(
name="计算器",
func=llm_math_chain.run,
description="在需要回答数学问题时很有用"
),
]
计划器、执行器和代理
model = ChatOpenAI(temperature=0)
planner = load_chat_planner(model)
executor = load_agent_executor(model, tools, verbose=True)
agent = PlanAndExecute(planner=planner, executor=executor, verbose=True)
运行示例
agent.run("谁是莱昂纳多·迪卡普里奥的女朋友?她的当前年龄提高到0.43次方是多少?")
> 进入新的PlanAndExecute链...
steps=[Step(value="在互联网上搜索莱昂纳多·迪卡普里奥的女朋友。"), Step(value='找到她的当前年龄。'), Step(value='使用计算器或编程语言将她的当前年龄提高到0.43次方。'), Step(value='输出结果。'), Step(value="根据上述步骤,回答用户的原始问题。\n\n")]
> 进入新的AgentExecutor链...
动作:
{
"action": "搜索",
"action_input": "谁是莱昂纳多·迪卡普里奥的女朋友?"
}
观察:迪卡普里奥在2022年夏天与女友卡米拉·莫罗内分手,两人在一起四年后分手。此后,他与另一位著名超模吉吉·哈迪德有关联。这对超模夫妇首次被认为是在9月份,在纽约时装周期间的一次派对上被发现亲密接触。
思考:根据之前的观察,我可以回答当前的目标。
动作:
{
"action": "最终答案",
"action_input": "莱昂纳多·迪卡普里奥目前与吉吉·哈迪德有关联。"
}
> 完成链。
*****
步骤:在互联网上搜索莱昂纳多·迪卡普里奥的女朋友。
回答:莱昂纳多·迪卡普里奥目前与吉吉·哈迪德有关联。
> 进入新的AgentExecutor链...
动作:
{
"action": "搜索",
"action_input": "吉吉·哈迪德的当前年龄是多少?"
}
观察:28岁
思考:之前的步骤:steps=[(Step(value="在互联网上搜索莱昂纳多·迪卡普里奥的女朋友。"), StepResponse(response='莱昂纳多·迪卡普里奥目前与吉吉·哈迪德有关联。'))]
当前目标:value='找到她的当前年龄。'
动作:
{
"action": "搜索",
"action_input": "吉吉·哈迪德的当前年龄是多少?"
}
观察:28岁
思考:之前的步骤:steps=[(Step(value="在互联网上搜索莱昂纳多·迪卡普里奥的女朋友。"), StepResponse(response='莱昂纳多·迪卡普里奥目前与吉吉·哈迪德有关联。')), (Step(value='找到她的当前年龄。'), StepResponse(response='28岁'))]
当前目标:无
动作:
{
"action": "最终答案",
"action_input": "吉吉·哈迪德的当前年龄是28岁。"
}
> 完成链。
*****
步骤:找到她的当前年龄。
回答:吉吉·哈迪德的当前年龄是28岁。
> 进入新的AgentExecutor链...
动作:
{
"action": "计算器",
"action_input": "28 ** 0.43"
}
> 进入新的LLMMathChain链...
28 ** 0.43
```text
28 ** 0.43
...numexpr.evaluate("28 ** 0.43")...
答案:4.1906168361987195
> 完成链。
观察:答案:4.1906168361987195
思考:下一步是提供答案给用户的问题。
动作:
{
"action": "最终答案",
"action_input": "吉吉·哈迪德的当前年龄提高到0.43次方约为4.19。"
}
> 完成链。
*****
步骤:使用计算器或编程语言将她的当前年龄提高到0.43次方。
回答:吉吉·哈迪德的当前年龄提高到0.43次方约为4.19。
> 进入新的AgentExecutor链...
动作:
```json
{
"action": "最终答案",
"action_input": "结果约为4.19。"
}
> 完成链。
*****
步骤:输出结果。xml_agent.
回答:结果约为4.19。
> 进入新的AgentExecutor链...
动作:
```json
{
"action": "最终答案",
"action_input": "吉吉·哈迪德的当前年龄提高到0.43次方约为4.19。"
}
> 完成链。
*****
步骤:根据上述步骤,回答用户的原始问题。
回答:吉吉·哈迪德的当前年龄提高到0.43次方约为4.19。
> 完成链。
"Gigi Hadid's current age raised to the 0.43 power is approximately 4.19."