forked from Archives/langchain
5feb60f426
Co-authored-by: Jan Minar <rdancer@rdancer.org>
347 lines
10 KiB
Plaintext
347 lines
10 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"attachments": {},
|
||
"cell_type": "markdown",
|
||
"id": "406483c4",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Plan and Execute\n",
|
||
"\n",
|
||
"Plan and execute agents accomplish an objective by first planning what to do, then executing the sub tasks. This idea is largely inspired by [BabyAGI](https://github.com/yoheinakajima/babyagi) and then the [\"Plan-and-Solve\" paper](https://arxiv.org/abs/2305.04091).\n",
|
||
"\n",
|
||
"The planning is almost always done by an LLM.\n",
|
||
"\n",
|
||
"The execution is usually done by a separate agent (equipped with tools)."
|
||
]
|
||
},
|
||
{
|
||
"attachments": {},
|
||
"cell_type": "markdown",
|
||
"id": "91192118",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Imports"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"id": "6ccd1dc5",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from langchain.chat_models import ChatOpenAI\n",
|
||
"from langchain.experimental.plan_and_execute import PlanAndExecute, load_agent_executor, load_chat_planner\n",
|
||
"from langchain.llms import OpenAI\n",
|
||
"from langchain import SerpAPIWrapper\n",
|
||
"from langchain.agents.tools import Tool\n",
|
||
"from langchain import LLMMathChain"
|
||
]
|
||
},
|
||
{
|
||
"attachments": {},
|
||
"cell_type": "markdown",
|
||
"id": "0b10d200",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Tools"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"id": "3c00f724",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"search = SerpAPIWrapper()\n",
|
||
"llm = OpenAI(temperature=0)\n",
|
||
"llm_math_chain = LLMMathChain.from_llm(llm=llm, verbose=True)\n",
|
||
"tools = [\n",
|
||
" Tool(\n",
|
||
" name = \"Search\",\n",
|
||
" func=search.run,\n",
|
||
" description=\"useful for when you need to answer questions about current events\"\n",
|
||
" ),\n",
|
||
" Tool(\n",
|
||
" name=\"Calculator\",\n",
|
||
" func=llm_math_chain.run,\n",
|
||
" description=\"useful for when you need to answer questions about math\"\n",
|
||
" ),\n",
|
||
"]"
|
||
]
|
||
},
|
||
{
|
||
"attachments": {},
|
||
"cell_type": "markdown",
|
||
"id": "ce38ae84",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Planner, Executor, and Agent"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"id": "0ab2cadd",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"model = ChatOpenAI(temperature=0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"id": "7b2419f2",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"planner = load_chat_planner(model)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"id": "ed9f518b",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"executor = load_agent_executor(model, tools, verbose=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"id": "36943178",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"agent = PlanAndExecute(planner=planner, executor=executor, verbose=True)"
|
||
]
|
||
},
|
||
{
|
||
"attachments": {},
|
||
"cell_type": "markdown",
|
||
"id": "8be9f1bd",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Run Example"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"id": "4891062e",
|
||
"metadata": {
|
||
"scrolled": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n",
|
||
"\n",
|
||
"\u001b[1m> Entering new PlanAndExecute chain...\u001b[0m\n",
|
||
"steps=[Step(value=\"Search for Leo DiCaprio's girlfriend on the internet.\"), Step(value='Find her current age.'), Step(value='Raise her current age to the 0.43 power using a calculator or programming language.'), Step(value='Output the result.'), Step(value=\"Given the above steps taken, respond to the user's original question.\\n\\n\")]\n",
|
||
"\n",
|
||
"\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
|
||
"\u001b[32;1m\u001b[1;3mAction:\n",
|
||
"```\n",
|
||
"{\n",
|
||
" \"action\": \"Search\",\n",
|
||
" \"action_input\": \"Who is Leo DiCaprio's girlfriend?\"\n",
|
||
"}\n",
|
||
"``` \n",
|
||
"\n",
|
||
"\u001b[0m\n",
|
||
"Observation: \u001b[36;1m\u001b[1;3mDiCaprio broke up with girlfriend Camila Morrone, 25, in the summer of 2022, after dating for four years. He's since been linked to another famous supermodel – Gigi Hadid. The power couple were first supposedly an item in September after being spotted getting cozy during a party at New York Fashion Week.\u001b[0m\n",
|
||
"Thought:\u001b[32;1m\u001b[1;3mBased on the previous observation, I can provide the answer to the current objective. \n",
|
||
"Action:\n",
|
||
"```\n",
|
||
"{\n",
|
||
" \"action\": \"Final Answer\",\n",
|
||
" \"action_input\": \"Leo DiCaprio is currently linked to Gigi Hadid.\"\n",
|
||
"}\n",
|
||
"```\n",
|
||
"\u001b[0m\n",
|
||
"\n",
|
||
"\u001b[1m> Finished chain.\u001b[0m\n",
|
||
"*****\n",
|
||
"\n",
|
||
"Step: Search for Leo DiCaprio's girlfriend on the internet.\n",
|
||
"\n",
|
||
"Response: Leo DiCaprio is currently linked to Gigi Hadid.\n",
|
||
"\n",
|
||
"\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
|
||
"\u001b[32;1m\u001b[1;3mAction:\n",
|
||
"```\n",
|
||
"{\n",
|
||
" \"action\": \"Search\",\n",
|
||
" \"action_input\": \"What is Gigi Hadid's current age?\"\n",
|
||
"}\n",
|
||
"```\n",
|
||
"\u001b[0m\n",
|
||
"Observation: \u001b[36;1m\u001b[1;3m28 years\u001b[0m\n",
|
||
"Thought:\u001b[32;1m\u001b[1;3mPrevious steps: steps=[(Step(value=\"Search for Leo DiCaprio's girlfriend on the internet.\"), StepResponse(response='Leo DiCaprio is currently linked to Gigi Hadid.'))]\n",
|
||
"\n",
|
||
"Current objective: value='Find her current age.'\n",
|
||
"\n",
|
||
"Action:\n",
|
||
"```\n",
|
||
"{\n",
|
||
" \"action\": \"Search\",\n",
|
||
" \"action_input\": \"What is Gigi Hadid's current age?\"\n",
|
||
"}\n",
|
||
"```\n",
|
||
"\n",
|
||
"\u001b[0m\n",
|
||
"Observation: \u001b[36;1m\u001b[1;3m28 years\u001b[0m\n",
|
||
"Thought:\u001b[32;1m\u001b[1;3mPrevious steps: steps=[(Step(value=\"Search for Leo DiCaprio's girlfriend on the internet.\"), StepResponse(response='Leo DiCaprio is currently linked to Gigi Hadid.')), (Step(value='Find her current age.'), StepResponse(response='28 years'))]\n",
|
||
"\n",
|
||
"Current objective: None\n",
|
||
"\n",
|
||
"Action:\n",
|
||
"```\n",
|
||
"{\n",
|
||
" \"action\": \"Final Answer\",\n",
|
||
" \"action_input\": \"Gigi Hadid's current age is 28 years.\"\n",
|
||
"}\n",
|
||
"```\n",
|
||
"\n",
|
||
"\u001b[0m\n",
|
||
"\n",
|
||
"\u001b[1m> Finished chain.\u001b[0m\n",
|
||
"*****\n",
|
||
"\n",
|
||
"Step: Find her current age.\n",
|
||
"\n",
|
||
"Response: Gigi Hadid's current age is 28 years.\n",
|
||
"\n",
|
||
"\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
|
||
"\u001b[32;1m\u001b[1;3mAction:\n",
|
||
"```\n",
|
||
"{\n",
|
||
" \"action\": \"Calculator\",\n",
|
||
" \"action_input\": \"28 ** 0.43\"\n",
|
||
"}\n",
|
||
"```\n",
|
||
"\u001b[0m\n",
|
||
"\n",
|
||
"\u001b[1m> Entering new LLMMathChain chain...\u001b[0m\n",
|
||
"28 ** 0.43\u001b[32;1m\u001b[1;3m\n",
|
||
"```text\n",
|
||
"28 ** 0.43\n",
|
||
"```\n",
|
||
"...numexpr.evaluate(\"28 ** 0.43\")...\n",
|
||
"\u001b[0m\n",
|
||
"Answer: \u001b[33;1m\u001b[1;3m4.1906168361987195\u001b[0m\n",
|
||
"\u001b[1m> Finished chain.\u001b[0m\n",
|
||
"\n",
|
||
"Observation: \u001b[33;1m\u001b[1;3mAnswer: 4.1906168361987195\u001b[0m\n",
|
||
"Thought:\u001b[32;1m\u001b[1;3mThe next step is to provide the answer to the user's question.\n",
|
||
"\n",
|
||
"Action:\n",
|
||
"```\n",
|
||
"{\n",
|
||
" \"action\": \"Final Answer\",\n",
|
||
" \"action_input\": \"Gigi Hadid's current age raised to the 0.43 power is approximately 4.19.\"\n",
|
||
"}\n",
|
||
"```\n",
|
||
"\n",
|
||
"\u001b[0m\n",
|
||
"\n",
|
||
"\u001b[1m> Finished chain.\u001b[0m\n",
|
||
"*****\n",
|
||
"\n",
|
||
"Step: Raise her current age to the 0.43 power using a calculator or programming language.\n",
|
||
"\n",
|
||
"Response: Gigi Hadid's current age raised to the 0.43 power is approximately 4.19.\n",
|
||
"\n",
|
||
"\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
|
||
"\u001b[32;1m\u001b[1;3mAction:\n",
|
||
"```\n",
|
||
"{\n",
|
||
" \"action\": \"Final Answer\",\n",
|
||
" \"action_input\": \"The result is approximately 4.19.\"\n",
|
||
"}\n",
|
||
"```\n",
|
||
"\u001b[0m\n",
|
||
"\n",
|
||
"\u001b[1m> Finished chain.\u001b[0m\n",
|
||
"*****\n",
|
||
"\n",
|
||
"Step: Output the result.\n",
|
||
"\n",
|
||
"Response: The result is approximately 4.19.\n",
|
||
"\n",
|
||
"\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
|
||
"\u001b[32;1m\u001b[1;3mAction:\n",
|
||
"```\n",
|
||
"{\n",
|
||
" \"action\": \"Final Answer\",\n",
|
||
" \"action_input\": \"Gigi Hadid's current age raised to the 0.43 power is approximately 4.19.\"\n",
|
||
"}\n",
|
||
"```\n",
|
||
"\u001b[0m\n",
|
||
"\n",
|
||
"\u001b[1m> Finished chain.\u001b[0m\n",
|
||
"*****\n",
|
||
"\n",
|
||
"Step: Given the above steps taken, respond to the user's original question.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Response: Gigi Hadid's current age raised to the 0.43 power is approximately 4.19.\n",
|
||
"\u001b[1m> Finished chain.\u001b[0m\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"\"Gigi Hadid's current age raised to the 0.43 power is approximately 4.19.\""
|
||
]
|
||
},
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"agent.run(\"Who is Leo DiCaprio's girlfriend? What is her current age raised to the 0.43 power?\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "aa3ec998",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3 (ipykernel)",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.11.3"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|