diff --git a/README.md b/README.md index 7be0bb11f..f60d7dd15 100644 --- a/README.md +++ b/README.md @@ -454,18 +454,6 @@ We also have a lot of examples highlighting how to slightly modify the base chat - [Force calling a tool first](https://github.com/langchain-ai/langgraph/blob/main/examples/agent_executor/force-calling-a-tool-first.ipynb): How to always call a specific tool first - [Managing agent steps](https://github.com/langchain-ai/langgraph/blob/main/examples/agent_executor/managing-agent-steps.ipynb): How to more explicitly manage intermediate steps that an agent takes -### Multi-agent Examples - -- [Multi-agent collaboration](https://github.com/langchain-ai/langgraph/blob/main/examples/multi_agent/multi-agent-collaboration.ipynb): how to create two agents that work together to accomplish a task -- [Multi-agent with supervisor](https://github.com/langchain-ai/langgraph/blob/main/examples/multi_agent/agent_supervisor.ipynb): how to orchestrate individual agents by using an LLM as a "supervisor" to distribute work -- [Hierarchical agent teams](https://github.com/langchain-ai/langgraph/blob/main/examples/multi_agent/hierarchical_agent_teams.ipynb): how to orchestrate "teams" of agents as nested graphs that can collaborate to solve a problem - -### Chatbot Evaluation via Simulation - -It can often be tough to evaluation chat bots in multi-turn situations. One way to do this is with simulations. - -- [Chat bot evaluation as multi-agent simulation](https://github.com/langchain-ai/langgraph/blob/main/examples/chatbot-simulation-evaluation/agent-simulation-evaluation.ipynb): How to simulate a dialogue between a "virtual user" and your chat bot - ### Async If you are running LangGraph in async workflows, you may want to create the nodes to be async by default. @@ -486,6 +474,32 @@ For a walkthrough on how to do that, see [this documentation](https://github.com LangGraph comes with built-in support for human-in-the-loop workflows. This is useful when you want to have a human review the current state before proceeding to a particular node. For a walkthrough on how to do that, see [this documentation](https://github.com/langchain-ai/langgraph/blob/main/examples/human-in-the-loop.ipynb) + +### Planning Agent Examples + +The following notebooks implement agent architectures prototypical of the "plan-and-execute" style, where an LLM planner decomposes a user request into a program, an executor executes the program, and an LLM synthesizes a response (and/or dynamically replans) based on the program outputs. + +- [Plan-and-execute](https://github.com/langchain-ai/langgraph/blob/main/examples/plan-and-execute/plan-and-execute.ipynb): a simple agent with a **planner** that generates a multi-step task list, an **executor** that invokes the tools in the plan, and a **replanner** that responds or generates an updated plan. Based on the [Plan-and-solve](https://arxiv.org/abs/2305.04091) paper by Wang, et. al. +- [Reasoning without Observation](https://github.com/langchain-ai/langgraph/blob/main/examples/rewoo/rewoo.ipynb): planner generates a task list whose observations are saved as **variables**. Variables can be used in subsequent tasks to reduce the need for further re-planning. Based on the [ReWOO](https://arxiv.org/abs/2305.18323) paper by Xu, et. al. +- [LLMCompiler](https://github.com/langchain-ai/langgraph/blob/main/examples/llm-compiler/LLMCompiler.ipynb): planner generates a **DAG** of tasks with variable responses. Tasks are **streamed** and executed eagerly to minimize tool execution runtime. Based on the [paper](https://arxiv.org/abs/2312.04511) by Kim, et. al. + + +### Multi-agent Examples + +- [Multi-agent collaboration](https://github.com/langchain-ai/langgraph/blob/main/examples/multi_agent/multi-agent-collaboration.ipynb): how to create two agents that work together to accomplish a task +- [Multi-agent with supervisor](https://github.com/langchain-ai/langgraph/blob/main/examples/multi_agent/agent_supervisor.ipynb): how to orchestrate individual agents by using an LLM as a "supervisor" to distribute work +- [Hierarchical agent teams](https://github.com/langchain-ai/langgraph/blob/main/examples/multi_agent/hierarchical_agent_teams.ipynb): how to orchestrate "teams" of agents as nested graphs that can collaborate to solve a problem + +### Chatbot Evaluation via Simulation + +It can often be tough to evaluation chat bots in multi-turn situations. One way to do this is with simulations. + +- [Chat bot evaluation as multi-agent simulation](https://github.com/langchain-ai/langgraph/blob/main/examples/chatbot-simulation-evaluation/agent-simulation-evaluation.ipynb): how to simulate a dialogue between a "virtual user" and your chat bot + +### Multimodal Examples + +- [WebVoyager](https://github.com/langchain-ai/langgraph/blob/main/examples/web-navigation/web_voyager.ipynb): vision-enabled web browsing agent that uses [Set-of-marks](https://som-gpt4v.github.io/) prompting to navigate a web browser and execute tasks + ## Documentation There are only a few new APIs to use. diff --git a/examples/llm-compiler/LLMCompiler.ipynb b/examples/llm-compiler/LLMCompiler.ipynb index ba4fb12a2..e77331bda 100644 --- a/examples/llm-compiler/LLMCompiler.ipynb +++ b/examples/llm-compiler/LLMCompiler.ipynb @@ -9,15 +9,18 @@ "\n", "This notebook shows how to implement [LLMCompiler, by Kim, et. al](https://arxiv.org/abs/2312.04511) in LangGraph.\n", "\n", - "LLMCompiler is an agent architecture intented on speeding up the latency of agentic tasks via fast, parallel tool execution. It has 3 main components:\n", + "LLMCompiler is an agent architecture designed to **speed up** the execution of agentic tasks by eagerly-executed tasks within a DAG. It also saves costs on redundant token usage by reducing the number of calls to the LLM. Below is an overview of its computational graph:\n", "\n", - "1. Planner: generate a DAG of tasks.\n", - "2. Task Fetching Unit: schedules and executes the tasks\n", + "![LLMCompiler Graph](./img/llm-compiler.png)\n", + "\n", + "It has 3 main components:\n", + "\n", + "1. Planner: stream a DAG of tasks.\n", + "2. Task Fetching Unit: schedules and executes the tasks as soon as they are executable\n", "3. Joiner: Responds to the user or triggers a second plan\n", "\n", - "![diagram](./img/diagram.png)\n", "\n", - "This notebook walks through each component and shows how to wire them together using LangGraph. \n", + "This notebook walks through each component and shows how to wire them together using LangGraph. The end result will leave a trace [like the following](https://smith.langchain.com/public/218c2677-c719-4147-b0e9-7bc3b5bb2623/r).\n", "\n", "\n", "**First,** install the dependencies, and set up LangSmith for tracing to more easily debug and observe the agent." @@ -35,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 1, "id": "abbd6948-e9a3-47ca-89c7-7ac2fc5eca8b", "metadata": {}, "outputs": [], @@ -43,9 +46,12 @@ "import os\n", "import getpass\n", "\n", + "\n", "def _get_pass(var: str):\n", " if var not in os.environ:\n", " os.environ[var] = getpass.getpass(f\"{var}: \")\n", + "\n", + "\n", "# Optional: Debug + trace calls using LangSmith\n", "os.environ[\"LANGCHAIN_TRACING_V2\"] = \"True\"\n", "os.environ[\"LANGCHAIN_PROJECT\"] = \"LLMCompiler\"\n", @@ -67,27 +73,31 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 3, "id": "e7476bb2-1a51-42f6-b7ae-82a0300bbf84", "metadata": {}, "outputs": [], "source": [ "from langchain_openai import ChatOpenAI\n", "from langchain_community.tools.tavily_search import TavilySearchResults\n", + "\n", "# Imported from the https://github.com/langchain-ai/langgraph/tree/main/examples/plan-and-execute repo\n", "from math_tools import get_math_tool\n", "\n", "_get_pass(\"TAVILY_API_KEY\")\n", "\n", "calculate = get_math_tool(ChatOpenAI(model=\"gpt-4-turbo-preview\"))\n", - "search = TavilySearchResults(max_results=1, description='tavily_search_results_json(query=\"the search query\") - a search engine.')\n", + "search = TavilySearchResults(\n", + " max_results=1,\n", + " description='tavily_search_results_json(query=\"the search query\") - a search engine.',\n", + ")\n", "\n", "tools = [search, calculate]" ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 4, "id": "152eecf3-6bef-4718-af71-a0b3c5a3b009", "metadata": {}, "outputs": [ @@ -97,13 +107,18 @@ "'37'" ] }, - "execution_count": 43, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "calculate.invoke({\"problem\": \"What's the temp of sf + 5?\", \"context\": [\"Thet empreature of sf is 32 degrees\"]})" + "calculate.invoke(\n", + " {\n", + " \"problem\": \"What's the temp of sf + 5?\",\n", + " \"context\": [\"Thet empreature of sf is 32 degrees\"],\n", + " }\n", + ")" ] }, { @@ -132,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 5, "id": "15dd9639-691f-4906-9012-83fd6e9ac126", "metadata": {}, "outputs": [ @@ -180,7 +195,12 @@ "from langchain_core.prompts import ChatPromptTemplate\n", "from langchain_core.runnables import RunnableBranch\n", "from langchain_core.tools import BaseTool\n", - "from langchain_core.messages import BaseMessage, FunctionMessage, HumanMessage, SystemMessage\n", + "from langchain_core.messages import (\n", + " BaseMessage,\n", + " FunctionMessage,\n", + " HumanMessage,\n", + " SystemMessage,\n", + ")\n", "\n", "from output_parser import LLMCompilerPlanParser, Task\n", "from langchain import hub\n", @@ -193,12 +213,14 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 6, "id": "45689d40-d8df-4316-a121-6ea9c87d2efe", "metadata": {}, "outputs": [], "source": [ - "def create_planner(llm: BaseChatModel, tools: Sequence[BaseTool], base_prompt: ChatPromptTemplate):\n", + "def create_planner(\n", + " llm: BaseChatModel, tools: Sequence[BaseTool], base_prompt: ChatPromptTemplate\n", + "):\n", " tool_descriptions = \"\\n\".join(\n", " f\"{i}. {tool.description}\\n\" for i, tool in enumerate(tools)\n", " )\n", @@ -217,7 +239,7 @@ " num_tools=len(tools),\n", " tool_descriptions=tool_descriptions,\n", " )\n", - " \n", + "\n", " def should_replan(state: list):\n", " # Context is passed as a system message\n", " return isinstance(state[-1], SystemMessage)\n", @@ -233,7 +255,7 @@ " break\n", " state[-1].content = state[-1].content + f\" - Begin counting at : {next_task}\"\n", " return {\"messages\": state}\n", - " \n", + "\n", " return (\n", " RunnableBranch(\n", " (should_replan, wrap_and_get_last_index | replanner_prompt),\n", @@ -246,7 +268,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 7, "id": "bbdcb57b-5362-4b9e-88db-fb3fae443fb0", "metadata": {}, "outputs": [], @@ -258,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 8, "id": "730490c6-6e3a-4173-82a1-9eb9d5eeff20", "metadata": {}, "outputs": [ @@ -268,7 +290,7 @@ "text": [ "description='tavily_search_results_json(query=\"the search query\") - a search engine.' max_results=1 {'query': 'current temperature in San Francisco'}\n", "---\n", - "name='math' description='math(problem: str, context: Optional[List[str]] = None, config: Optional[langchain_core.runnables.config.RunnableConfig] = None) - math(problem: str, context: Optional[list[str]]) -> float:\\n - Solves the provided math problem.\\n - `problem` can be either a simple math problem (e.g. \"1 + 3\") or a word problem (e.g. \"how many apples are there if there are 3 apples and 2 apples\").\\n - You cannot calculate multiple expressions in one call. For instance, `math(\\'1 + 3, 2 + 4\\')` does not work. If you need to calculate multiple expressions, you need to call them separately like `math(\\'1 + 3\\')` and then `math(\\'2 + 4\\')`\\n - Minimize the number of `math` actions as much as possible. For instance, instead of calling 2. math(\"what is the 10% of $1\") and then call 3. math(\"$1 + $2\"), you MUST call 2. math(\"what is the 110% of $1\") instead, which will reduce the number of math actions.\\n - You can optionally provide a list of strings as `context` to help the agent solve the problem. If there are multiple contexts you need to answer the question, you can provide them as a list of strings.\\n - `math` action will not see the output of the previous actions unless you provide it as `context`. You MUST provide the output of the previous actions as `context` if you need to do math on it.\\n - You MUST NEVER provide `search` type action\\'s outputs as a variable in the `problem` argument. This is because `search` returns a text blob that contains the information about the entity, not a number or value. Therefore, when you need to provide an output of `search` action, you MUST provide it as a `context` argument to `math` action. For example, 1. search(\"Barack Obama\") and then 2. math(\"age of $1\") is NEVER allowed. Use 2. math(\"age of Barack Obama\", context=[\"$1\"]) instead.\\n - When you ask a question about `context`, specify the units. For instance, \"what is xx in height?\" or \"what is xx in millions?\" instead of \"what is xx?\"' args_schema= func=.calculate_expression at 0x119a318a0> {'problem': 'pow($0, 3)', 'context': ['$0']}\n", + "name='math' description='math(problem: str, context: Optional[List[str]] = None, config: Optional[langchain_core.runnables.config.RunnableConfig] = None) - math(problem: str, context: Optional[list[str]]) -> float:\\n - Solves the provided math problem.\\n - `problem` can be either a simple math problem (e.g. \"1 + 3\") or a word problem (e.g. \"how many apples are there if there are 3 apples and 2 apples\").\\n - You cannot calculate multiple expressions in one call. For instance, `math(\\'1 + 3, 2 + 4\\')` does not work. If you need to calculate multiple expressions, you need to call them separately like `math(\\'1 + 3\\')` and then `math(\\'2 + 4\\')`\\n - Minimize the number of `math` actions as much as possible. For instance, instead of calling 2. math(\"what is the 10% of $1\") and then call 3. math(\"$1 + $2\"), you MUST call 2. math(\"what is the 110% of $1\") instead, which will reduce the number of math actions.\\n - You can optionally provide a list of strings as `context` to help the agent solve the problem. If there are multiple contexts you need to answer the question, you can provide them as a list of strings.\\n - `math` action will not see the output of the previous actions unless you provide it as `context`. You MUST provide the output of the previous actions as `context` if you need to do math on it.\\n - You MUST NEVER provide `search` type action\\'s outputs as a variable in the `problem` argument. This is because `search` returns a text blob that contains the information about the entity, not a number or value. Therefore, when you need to provide an output of `search` action, you MUST provide it as a `context` argument to `math` action. For example, 1. search(\"Barack Obama\") and then 2. math(\"age of $1\") is NEVER allowed. Use 2. math(\"age of Barack Obama\", context=[\"$1\"]) instead.\\n - When you ask a question about `context`, specify the units. For instance, \"what is xx in height?\" or \"what is xx in millions?\" instead of \"what is xx?\"' args_schema= func=.calculate_expression at 0x10f354ea0> {'problem': 'raise $0 to the 3rd power', 'context': ['$0']}\n", "---\n", "join ()\n", "---\n" @@ -279,8 +301,8 @@ "example_question = \"What's the temperature in SF raised to the 3rd power?\"\n", "\n", "for task in planner.stream([HumanMessage(content=example_question)]):\n", - " print(task['tool'], task['args'])\n", - " print('---')" + " print(task[\"tool\"], task[\"args\"])\n", + " print(\"---\")" ] }, { @@ -299,12 +321,15 @@ "}\n", "```\n", "\n", - "The basic idea is to begin executing tools as soon as their dependencies are met. This is done through multi-threading." + "\n", + "The basic idea is to begin executing tools as soon as their dependencies are met. This is done through multi-threading. We will combine the task fetching unit and exector below:\n", + "\n", + "![diagram](./img/diagram.png)" ] }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 9, "id": "c1fbafdd-42d4-4575-8466-e5951cee71f4", "metadata": { "jp-MarkdownHeadingCollapsed": true @@ -330,6 +355,7 @@ " results[int(message.additional_kwargs[\"idx\"])] = message.content\n", " return results\n", "\n", + "\n", "class SchedulerInput(TypedDict):\n", " messages: List[BaseMessage]\n", " tasks: Iterable[Task]\n", @@ -344,7 +370,9 @@ " if isinstance(args, str):\n", " resolved_args = _resolve_arg(args, observations)\n", " elif isinstance(args, dict):\n", - " resolved_args = {key: _resolve_arg(val, observations) for key, val in args.items()}\n", + " resolved_args = {\n", + " key: _resolve_arg(val, observations) for key, val in args.items()\n", + " }\n", " else:\n", " # This will likely fail\n", " resolved_args = args\n", @@ -378,30 +406,30 @@ "\n", "@as_runnable\n", "def schedule_task(task_inputs, config):\n", - " task: Task = task_inputs['task']\n", - " observations: Dict[int, Any] = task_inputs['observations']\n", + " task: Task = task_inputs[\"task\"]\n", + " observations: Dict[int, Any] = task_inputs[\"observations\"]\n", " try:\n", " observation = _execute_task(task, observations, config)\n", " except Exception:\n", " import traceback\n", - " observation = traceback.format_exception() #repr(e) + \n", - " observations[task['idx']] = observation\n", "\n", - "def schedule_pending_task(task: Task, observations: Dict[int, Any], retry_after: float = 0.2):\n", + " observation = traceback.format_exception() # repr(e) +\n", + " observations[task[\"idx\"]] = observation\n", + "\n", + "\n", + "def schedule_pending_task(\n", + " task: Task, observations: Dict[int, Any], retry_after: float = 0.2\n", + "):\n", " while True:\n", " deps = task[\"dependencies\"]\n", - " if (\n", - " deps\n", - " and (\n", - " any([dep not in observations for dep in deps])\n", - " )\n", - " ):\n", + " if deps and (any([dep not in observations for dep in deps])):\n", " # Dependencies not yet satisfied\n", " time.sleep(retry_after)\n", " continue\n", " schedule_task.invoke({\"task\": task, \"observations\": observations})\n", " break\n", "\n", + "\n", "@as_runnable\n", "def schedule_tasks(scheduler_input: SchedulerInput) -> List[FunctionMessage]:\n", " \"\"\"Group the tasks into a DAG schedule.\"\"\"\n", @@ -421,19 +449,23 @@ " # ^^ We assume each task inserts a different key above to\n", " # avoid race conditions...\n", " futures = []\n", - " retry_after = 0.25 # Retry every quarter second\n", + " retry_after = 0.25 # Retry every quarter second\n", " with ThreadPoolExecutor() as executor:\n", " for task in tasks:\n", " deps = task[\"dependencies\"]\n", - " task_names[task[\"idx\"]] = task[\"tool\"] if isinstance(task[\"tool\"], str) else task[\"tool\"].name\n", + " task_names[task[\"idx\"]] = (\n", + " task[\"tool\"] if isinstance(task[\"tool\"], str) else task[\"tool\"].name\n", + " )\n", " if (\n", " # Depends on other tasks\n", " deps\n", - " and (\n", - " any([dep not in observations for dep in deps])\n", - " )\n", + " and (any([dep not in observations for dep in deps]))\n", " ):\n", - " futures.append(executor.submit(schedule_pending_task, task, observations, retry_after))\n", + " futures.append(\n", + " executor.submit(\n", + " schedule_pending_task, task, observations, retry_after\n", + " )\n", + " )\n", " else:\n", " # No deps or all deps satisfied\n", " # can schedule now\n", @@ -444,34 +476,39 @@ " # Wait for them to complete\n", " wait(futures)\n", " # Convert observations to new tool messages to add to the state\n", - " new_observations = {k: (task_names[k], observations[k]) for k in sorted(observations.keys() - originals)}\n", + " new_observations = {\n", + " k: (task_names[k], observations[k])\n", + " for k in sorted(observations.keys() - originals)\n", + " }\n", " tool_messages = [\n", - " FunctionMessage(\n", - " name=name,\n", - " content=str(obs),\n", - " additional_kwargs={\"idx\": k}\n", - " ) for k, (name, obs) in new_observations.items()]\n", + " FunctionMessage(name=name, content=str(obs), additional_kwargs={\"idx\": k})\n", + " for k, (name, obs) in new_observations.items()\n", + " ]\n", " return tool_messages" ] }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 10, "id": "052f6b16-103a-40e9-94dd-8fcc37e77ba4", "metadata": {}, "outputs": [], "source": [ "import itertools\n", "\n", + "\n", "@as_runnable\n", "def plan_and_schedule(messages: List[BaseMessage], config):\n", " tasks = planner.stream(messages, config)\n", " # Begin executing the planner immediately\n", " tasks = itertools.chain([next(tasks)], tasks)\n", - " scheduled_tasks = schedule_tasks.invoke({\n", - " \"messages\": messages,\n", - " \"tasks\": tasks,\n", - " }, config)\n", + " scheduled_tasks = schedule_tasks.invoke(\n", + " {\n", + " \"messages\": messages,\n", + " \"tasks\": tasks,\n", + " },\n", + " config,\n", + " )\n", " return scheduled_tasks" ] }, @@ -487,7 +524,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 11, "id": "55142257-2674-4a47-988e-0d2810917329", "metadata": {}, "outputs": [], @@ -497,19 +534,19 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 12, "id": "a98e0525-2fcf-4fa1-baf6-79858bb8a6bd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[FunctionMessage(content=\"[{'url': 'https://en.climate-data.org/north-america/united-states-of-america/california/san-francisco-385/t/september-9/', 'content': 'San Francisco Weather in September San Francisco weather in September San Francisco weather by month // weather averages 9.6 (49.2) 6.2 (43.2) 14 (57.3) Data: 1999 - 2019: avg. Sun hours San Francisco weather and climate for further months San Francisco weather in September // weather averages Airport close to San FranciscoJanuary February March April May June July August September October November December; Avg. Temperature °C (°F) 9.6 °C (49.2) °F. 10.5 °C (50.8) °F. 11.6 °C'}]\", additional_kwargs={'idx': 1}, name='tavily_search_results_json'),\n", - " FunctionMessage(content='1', additional_kwargs={'idx': 2}, name='math'),\n", - " FunctionMessage(content='join', additional_kwargs={'idx': 3}, name='join')]" + "[FunctionMessage(content='[]', additional_kwargs={'idx': 0}, name='tavily_search_results_json'),\n", + " FunctionMessage(content='ValueError(\\'Failed to evaluate \"N/A\". Raised error: KeyError(\\\\\\'A\\\\\\'). Please try again with a valid numerical expression\\')', additional_kwargs={'idx': 1}, name='math'),\n", + " FunctionMessage(content='join', additional_kwargs={'idx': 2}, name='join')]" ] }, - "execution_count": 51, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -535,7 +572,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 13, "id": "942dab42-ad42-4ba2-90d5-49edbe4fae68", "metadata": {}, "outputs": [], @@ -544,20 +581,31 @@ "from langchain.chains.openai_functions import create_structured_output_runnable\n", "from langchain_core.messages import AIMessage\n", "\n", + "\n", "class FinalResponse(BaseModel):\n", " \"\"\"The final response/answer.\"\"\"\n", + "\n", " response: str\n", "\n", + "\n", "class Replan(BaseModel):\n", - " feedback: str = Field(description=\"Analysis of the previous attempts and recommendations on what needs to be fixed.\")\n", + " feedback: str = Field(\n", + " description=\"Analysis of the previous attempts and recommendations on what needs to be fixed.\"\n", + " )\n", + "\n", "\n", "class JoinOutputs(BaseModel):\n", " \"\"\"Decide whether to replan or whether you can return the final response.\"\"\"\n", - " thought: str = Field(description=\"The chain of thought reasoning for the selected action\")\n", + "\n", + " thought: str = Field(\n", + " description=\"The chain of thought reasoning for the selected action\"\n", + " )\n", " action: Union[FinalResponse, Replan]\n", "\n", "\n", - "joiner_prompt = hub.pull(\"wfh/llm-compiler-joiner\").partial(examples=\"\") # You can optionally add examples\n", + "joiner_prompt = hub.pull(\"wfh/llm-compiler-joiner\").partial(\n", + " examples=\"\"\n", + ") # You can optionally add examples\n", "llm = ChatOpenAI(model=\"gpt-4-turbo-preview\")\n", "\n", "runnable = create_structured_output_runnable(JoinOutputs, llm, joiner_prompt)" @@ -574,7 +622,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "951a33cf-2a05-4a33-899a-0ab1d97122fa", "metadata": {}, "outputs": [], @@ -582,7 +630,11 @@ "def _parse_joiner_output(decision: JoinOutputs) -> List[BaseMessage]:\n", " response = [AIMessage(content=f\"Thought: {decision.thought}\")]\n", " if isinstance(decision.action, Replan):\n", - " return response + [SystemMessage(content=f\"Context from last attempt: {decision.action.feedback}\")]\n", + " return response + [\n", + " SystemMessage(\n", + " content=f\"Context from last attempt: {decision.action.feedback}\"\n", + " )\n", + " ]\n", " else:\n", " return response + [AIMessage(content=decision.action.response)]\n", "\n", @@ -595,16 +647,13 @@ " break\n", " return {\"messages\": selected[::-1]}\n", "\n", - "joiner = (\n", - " select_recent_messages\n", - " | runnable\n", - " | _parse_joiner_output\n", - ")" + "\n", + "joiner = select_recent_messages | runnable | _parse_joiner_output" ] }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 15, "id": "1e49d4b1-8266-4520-a566-1448b1c31c8f", "metadata": {}, "outputs": [], @@ -614,18 +663,18 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 16, "id": "31854dfd-b82f-4c24-9b58-6bae66777909", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[AIMessage(content=\"Thought: The information provided gives an average temperature for San Francisco in different months, but it doesn't specify the current temperature or any specific temperature to be raised to the 3rd power. Without the current temperature or a specific temperature value, it's impossible to calculate its value raised to the 3rd power.\"),\n", - " SystemMessage(content='Context from last attempt: The information provided is not sufficient to answer the question as it lacks the current temperature of San Francisco or any specific temperature value to be raised to the 3rd power. Need to find the current or a specific temperature to perform the calculation.')]" + "[AIMessage(content='Thought: The search did not return any results, and the attempt to calculate the temperature in San Francisco raised to the 3rd power failed due to missing temperature information.'),\n", + " SystemMessage(content='Context from last attempt: I need to find the current temperature in San Francisco before calculating its value raised to the 3rd power.')]" ] }, - "execution_count": 54, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -650,7 +699,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 17, "id": "768b5f11-e3d2-47be-8143-a7dcd8765243", "metadata": {}, "outputs": [], @@ -678,6 +727,7 @@ " return END\n", " return \"plan_and_schedule\"\n", "\n", + "\n", "graph_builder.add_conditional_edges(\n", " start_key=\"join\",\n", " # Next, we pass in the function that will determine which node is called next.\n", @@ -699,7 +749,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 18, "id": "5bc4584a-e31c-4065-805e-76a6db30676a", "metadata": {}, "outputs": [ @@ -707,11 +757,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'plan_and_schedule': [FunctionMessage(content='[{\\'url\\': \\'https://www.statista.com/statistics/188087/gdp-of-the-us-federal-state-of-new-york-since-1997/\\', \\'content\\': \"Strategy and business building for the data-driven economy: U.S. real GDP of New York 2000-2022 Real gross domestic product of New York in the United States from 2000 to 2022 (in billion U.S. dollars) Economy U.S. New York metro area GDP 2001-2022 You only have access to basic statistics. U.S. state and local government outstanding debt 2021, by state Demographics Resident population in New York 1960-2022In 2022, the real gross domestic product (GDP) of New York was about 1.56 trillion U.S. dollars. This is an increase from the previous year, when the state\\'s GDP stood at 1.51 trillion...\"}]', additional_kwargs={'idx': 0}, name='tavily_search_results_json')]}\n", + "{'plan_and_schedule': [FunctionMessage(content='[{\\'url\\': \\'https://www.governor.ny.gov/programs/fy-2024-new-york-state-budget\\', \\'content\\': \"The $229 billion FY 2024 New York State Budget reflects Governor Hochul\\'s bold agenda to make New York more affordable, FY 2024 Budget Assets FY 2024 New York State Budget Highlights Improving Public Safety GOVERNOR HOME GOVERNOR KATHY HOCHUL FY 2024 New York State Budget Transformative investments to support New York\\'s business community and boost the state economy.The $229 billion FY 2024 NYS Budget reflects Governor Hochul\\'s bold agenda to make New York more affordable, more livable, and safer.\"}]', additional_kwargs={'idx': 0}, name='tavily_search_results_json')]}\n", "---\n", - "{'join': [AIMessage(content='Thought: The search result provides the information that in 2022, the real gross domestic product (GDP) of New York was about 1.56 trillion U.S. dollars.'), AIMessage(content='The GDP of New York in 2022 was about 1.56 trillion U.S. dollars.')]}\n", + "{'join': [AIMessage(content=\"Thought: The information provided does not specify the Gross Domestic Product (GDP) of New York, but instead provides details about the state's budget for fiscal year 2024, which is $229 billion. This budget figure cannot be accurately equated to the GDP.\"), SystemMessage(content=\"Context from last attempt: The search results provided information about New York's state budget rather than its GDP. To answer the user's question, we need to find specific data on New York's GDP, not its budget.\")]}\n", "---\n", - "{'__end__': [HumanMessage(content=\"What's the GDP of New York?\"), FunctionMessage(content='[{\\'url\\': \\'https://www.statista.com/statistics/188087/gdp-of-the-us-federal-state-of-new-york-since-1997/\\', \\'content\\': \"Strategy and business building for the data-driven economy: U.S. real GDP of New York 2000-2022 Real gross domestic product of New York in the United States from 2000 to 2022 (in billion U.S. dollars) Economy U.S. New York metro area GDP 2001-2022 You only have access to basic statistics. U.S. state and local government outstanding debt 2021, by state Demographics Resident population in New York 1960-2022In 2022, the real gross domestic product (GDP) of New York was about 1.56 trillion U.S. dollars. This is an increase from the previous year, when the state\\'s GDP stood at 1.51 trillion...\"}]', additional_kwargs={'idx': 0}, name='tavily_search_results_json'), AIMessage(content='Thought: The search result provides the information that in 2022, the real gross domestic product (GDP) of New York was about 1.56 trillion U.S. dollars.'), AIMessage(content='The GDP of New York in 2022 was about 1.56 trillion U.S. dollars.')]}\n", + "{'plan_and_schedule': [FunctionMessage(content=\"[{'url': 'https://en.wikipedia.org/wiki/Economy_of_New_York_(state)', 'content': 'The economy of the State of New York is reflected in its gross state product in 2022 of $2.053 trillion, ranking third Contents Economy of New York (state) New York City-centered metropolitan statistical area produced a gross metropolitan product (GMP) of $US2.0 trillion, of the items in which New York ranks high nationally:The economy of the State of New York is reflected in its gross state product in 2022 of $2.053 trillion, ranking third in size behind the larger states of\\\\xa0...'}]\", additional_kwargs={'idx': 1}, name='tavily_search_results_json')]}\n", + "---\n", + "{'join': [AIMessage(content=\"Thought: The required information about New York's GDP is provided in the search results. In 2022, New York had a Gross State Product (GSP) of $2.053 trillion.\"), AIMessage(content='The Gross Domestic Product (GDP) of New York in 2022 was $2.053 trillion.')]}\n", + "---\n", + "{'__end__': [HumanMessage(content=\"What's the GDP of New York?\"), FunctionMessage(content='[{\\'url\\': \\'https://www.governor.ny.gov/programs/fy-2024-new-york-state-budget\\', \\'content\\': \"The $229 billion FY 2024 New York State Budget reflects Governor Hochul\\'s bold agenda to make New York more affordable, FY 2024 Budget Assets FY 2024 New York State Budget Highlights Improving Public Safety GOVERNOR HOME GOVERNOR KATHY HOCHUL FY 2024 New York State Budget Transformative investments to support New York\\'s business community and boost the state economy.The $229 billion FY 2024 NYS Budget reflects Governor Hochul\\'s bold agenda to make New York more affordable, more livable, and safer.\"}]', additional_kwargs={'idx': 0}, name='tavily_search_results_json'), AIMessage(content=\"Thought: The information provided does not specify the Gross Domestic Product (GDP) of New York, but instead provides details about the state's budget for fiscal year 2024, which is $229 billion. This budget figure cannot be accurately equated to the GDP.\"), SystemMessage(content=\"Context from last attempt: The search results provided information about New York's state budget rather than its GDP. To answer the user's question, we need to find specific data on New York's GDP, not its budget. - Begin counting at : 1\"), FunctionMessage(content=\"[{'url': 'https://en.wikipedia.org/wiki/Economy_of_New_York_(state)', 'content': 'The economy of the State of New York is reflected in its gross state product in 2022 of $2.053 trillion, ranking third Contents Economy of New York (state) New York City-centered metropolitan statistical area produced a gross metropolitan product (GMP) of $US2.0 trillion, of the items in which New York ranks high nationally:The economy of the State of New York is reflected in its gross state product in 2022 of $2.053 trillion, ranking third in size behind the larger states of\\\\xa0...'}]\", additional_kwargs={'idx': 1}, name='tavily_search_results_json'), AIMessage(content=\"Thought: The required information about New York's GDP is provided in the search results. In 2022, New York had a Gross State Product (GSP) of $2.053 trillion.\"), AIMessage(content='The Gross Domestic Product (GDP) of New York in 2022 was $2.053 trillion.')]}\n", "---\n" ] } @@ -719,12 +773,12 @@ "source": [ "for step in chain.stream([HumanMessage(content=\"What's the GDP of New York?\")]):\n", " print(step)\n", - " print('---')\n" + " print(\"---\")" ] }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 19, "id": "b96efd08-5314-44f0-a694-3073b638adad", "metadata": {}, "outputs": [ @@ -732,7 +786,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "The GDP of New York in 2022 was about 1.56 trillion U.S. dollars.\n" + "The Gross Domestic Product (GDP) of New York in 2022 was $2.053 trillion.\n" ] } ], @@ -753,7 +807,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 20, "id": "0b3a0916-d8ca-4092-b91c-d9e2b05259d8", "metadata": {}, "outputs": [ @@ -761,38 +815,38 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'plan_and_schedule': [FunctionMessage(content='[{\\'url\\': \\'https://savetheeaglesinternational.org/old-parrot/\\', \\'content\\': \"What Is The World\\'s Oldest Parrot? Living Long and Healthy Lives: A Look at the World’s Oldest Parrots certain parrot species are considered older: your parrot enters its senior years?One remarkable parrot that defied the odds and lived a long life is Cookie, a cockatoo who reached the impressive age of 83. Cookie spent his entire life at the Brookfield Zoo, serving as a testament to the exceptional care and environment provided by the zookeepers.\"}]', additional_kwargs={'idx': 1}, name='tavily_search_results_json'), FunctionMessage(content=\"[{'url': 'https://www.animalwised.com/how-long-does-a-parrot-live-3974.html', 'content': 'How Long Does a Parrot Live? How long does a parrot live in captivity? How long does a parrot live in the wild? Why do parrots live so long?Below is the average life expectancy of parrots in captivity, based on their species. Lovebirds. Lovebirds are members of the genus Agapornis, a small group of parrots in the parrot family Psittaculidae. The average life expectancy of a lovebird is between 12 and 15 years. Depending on care and circumstances, the bird can live up to 20 years ...'}]\", additional_kwargs={'idx': 2}, name='tavily_search_results_json'), FunctionMessage(content='join', additional_kwargs={'idx': 3}, name='join')]}\n", + "{'plan_and_schedule': [FunctionMessage(content=\"[{'url': 'https://a-z-animals.com/blog/discover-the-worlds-oldest-parrot/', 'content': 'How Old Is the World’s Oldest Parrot? Discover the World’s Oldest Parrot Advertisement of debate, so we’ll detail some other parrots whose lifespans may be longer but are hard to verify their exact age. Comparing Parrots’ Lifespans to Other BirdsSep 8, 2023 — Sep 8, 2023The oldest parrot on record is Cookie, a pink cockatoo that survived to the age of 83 and survived his entire life at the Brookfield Zoo.'}]\", additional_kwargs={'idx': 0}, name='tavily_search_results_json'), FunctionMessage(content=\"HTTPError('502 Server Error: Bad Gateway for url: https://api.tavily.com/search')\", additional_kwargs={'idx': 1}, name='tavily_search_results_json'), FunctionMessage(content='join', additional_kwargs={'idx': 2}, name='join')]}\n", "---\n", - "{'join': [AIMessage(content=\"Thought: The oldest parrot ever recorded is Cookie, a cockatoo, who lived to be 83 years old. However, the average lifespan provided is specifically for lovebirds, which is between 12 and 15 years. This information doesn't accurately reflect the average lifespan of all parrot species, which would be necessary to compare with Cookie's age accurately. Since parrots encompass a wide variety of species with different lifespans, the information on lovebirds' lifespan alone is insufficient for a comprehensive comparison.\"), SystemMessage(content=\"Context from last attempt: We need information on the average lifespan of parrots in general, not just lovebirds, to accurately compare with Cookie's age.\")]}\n", + "{'join': [AIMessage(content='Thought: The oldest parrot on record is Cookie, a pink cockatoo, who lived to be 83 years old. However, there was an error fetching additional search results to compare this age to the average lifespan of parrots.'), SystemMessage(content='Context from last attempt: I found the age of the oldest parrot, Cookie, who lived to be 83 years old. However, I need to search again to find the average lifespan of parrots to complete the comparison.')]}\n", "---\n", - "{'plan_and_schedule': [FunctionMessage(content='[{\\'url\\': \\'https://www.petmd.com/bird/how-long-do-parrots-live\\', \\'content\\': \"Average Parrot Lifespan and Aging How Long Do Parrots Live? How to Improve Your Parrot\\'s Lifespan Mcleod DVM, Lianne. The Spruce Pets. How Long do Pet Parrots and Other Birds Live?. 2023.Some pets, such as tortoises and parrots, may live for over 50 years. Because they are a lifelong commitment, lawyers often urge pet parents to provide documented plans for their pet parrots in their wills. Average Parrot Lifespan and Aging. Parrots are an incredibly diverse group of birds known by their scientific name: psittacines.\"}]', additional_kwargs={'idx': 4}, name='tavily_search_results_json')]}\n", + "{'plan_and_schedule': [FunctionMessage(content='[{\\'url\\': \\'https://www.turlockvet.com/site/blog/2023/07/15/parrot-lifespan--how-long-pet-parrots-live\\', \\'content\\': \"Parrot Lifespan the lifespan of a parrot?\\'. Parrot Lifespan: How Long Do Pet Parrots Live? how long they actually live and what you should know about owning a parrot.Jul 15, 2023 — Jul 15, 2023Generally, the average lifespan of smaller species of parrots such as Budgies and Cockatiels is about 5 - 15 years, while larger parrots such as\\\\xa0...\"}]', additional_kwargs={'idx': 3}, name='tavily_search_results_json')]}\n", "---\n", - "{'join': [AIMessage(content=\"Thought: The information provided does not give a specific average lifespan for parrots in general, which is necessary for accurately comparing Cookie's age to the average lifespan of parrots. The search result mentions that parrots can live over 50 years but does not provide a detailed average lifespan applicable to all or most parrot species.\"), SystemMessage(content=\"Context from last attempt: We need information on the average lifespan of parrots in general to accurately compare with Cookie's age of 83 years. The provided information doesn't specify an average lifespan for parrots as a whole.\")]}\n", + "{'join': [AIMessage(content=\"Thought: I have found that the oldest parrot on record, Cookie, lived to be 83 years old. Additionally, I've found that the average lifespan of parrots varies by species, with smaller species like Budgies and Cockatiels living between 5-15 years, and larger parrots potentially living longer. This allows me to compare Cookie's age to the average lifespan of smaller parrot species.\"), AIMessage(content=\"The oldest parrot on record is Cookie, a pink cockatoo, who lived to be 83 years old. Compared to the average lifespan of smaller parrot species such as Budgies and Cockatiels, which is about 5-15 years, Cookie lived significantly longer. The average lifespan of larger parrot species wasn't specified, but it's implied that larger parrots may live longer than smaller species, yet likely still much less than 83 years.\")]}\n", "---\n", - "{'plan_and_schedule': [FunctionMessage(content='join', additional_kwargs={'idx': 5}, name='join')]}\n", - "---\n", - "{'join': [AIMessage(content=\"Thought: Despite multiple attempts, the specific average lifespan of parrots as a whole has not been provided. The information obtained mentions that parrots can live over 50 years, but a more precise average is necessary for a detailed comparison with Cookie's age of 83 years. However, it's clear that Cookie lived significantly longer than the average lifespan of many parrot species, including lovebirds which have an average lifespan of 12 to 15 years.\"), AIMessage(content=\"The oldest parrot on record is Cookie, a cockatoo, who lived to be 83 years old. While specific average lifespan information for all parrot species has not been provided, it's mentioned that some parrots can live over 50 years. This suggests that Cookie lived significantly longer than the average lifespan for many parrot species. For instance, lovebirds, a type of parrot, have an average lifespan of 12 to 15 years, indicating that Cookie's lifespan was exceptional among parrots.\")]}\n", - "---\n", - "{'__end__': [HumanMessage(content=\"What's the oldest parrot alive, and how much longer is that than the average?\"), FunctionMessage(content='[{\\'url\\': \\'https://savetheeaglesinternational.org/old-parrot/\\', \\'content\\': \"What Is The World\\'s Oldest Parrot? Living Long and Healthy Lives: A Look at the World’s Oldest Parrots certain parrot species are considered older: your parrot enters its senior years?One remarkable parrot that defied the odds and lived a long life is Cookie, a cockatoo who reached the impressive age of 83. Cookie spent his entire life at the Brookfield Zoo, serving as a testament to the exceptional care and environment provided by the zookeepers.\"}]', additional_kwargs={'idx': 1}, name='tavily_search_results_json'), FunctionMessage(content=\"[{'url': 'https://www.animalwised.com/how-long-does-a-parrot-live-3974.html', 'content': 'How Long Does a Parrot Live? How long does a parrot live in captivity? How long does a parrot live in the wild? Why do parrots live so long?Below is the average life expectancy of parrots in captivity, based on their species. Lovebirds. Lovebirds are members of the genus Agapornis, a small group of parrots in the parrot family Psittaculidae. The average life expectancy of a lovebird is between 12 and 15 years. Depending on care and circumstances, the bird can live up to 20 years ...'}]\", additional_kwargs={'idx': 2}, name='tavily_search_results_json'), FunctionMessage(content='join', additional_kwargs={'idx': 3}, name='join'), AIMessage(content=\"Thought: The oldest parrot ever recorded is Cookie, a cockatoo, who lived to be 83 years old. However, the average lifespan provided is specifically for lovebirds, which is between 12 and 15 years. This information doesn't accurately reflect the average lifespan of all parrot species, which would be necessary to compare with Cookie's age accurately. Since parrots encompass a wide variety of species with different lifespans, the information on lovebirds' lifespan alone is insufficient for a comprehensive comparison.\"), SystemMessage(content=\"Context from last attempt: We need information on the average lifespan of parrots in general, not just lovebirds, to accurately compare with Cookie's age. - Begin counting at : 4\"), FunctionMessage(content='[{\\'url\\': \\'https://www.petmd.com/bird/how-long-do-parrots-live\\', \\'content\\': \"Average Parrot Lifespan and Aging How Long Do Parrots Live? How to Improve Your Parrot\\'s Lifespan Mcleod DVM, Lianne. The Spruce Pets. How Long do Pet Parrots and Other Birds Live?. 2023.Some pets, such as tortoises and parrots, may live for over 50 years. Because they are a lifelong commitment, lawyers often urge pet parents to provide documented plans for their pet parrots in their wills. Average Parrot Lifespan and Aging. Parrots are an incredibly diverse group of birds known by their scientific name: psittacines.\"}]', additional_kwargs={'idx': 4}, name='tavily_search_results_json'), AIMessage(content=\"Thought: The information provided does not give a specific average lifespan for parrots in general, which is necessary for accurately comparing Cookie's age to the average lifespan of parrots. The search result mentions that parrots can live over 50 years but does not provide a detailed average lifespan applicable to all or most parrot species.\"), SystemMessage(content=\"Context from last attempt: We need information on the average lifespan of parrots in general to accurately compare with Cookie's age of 83 years. The provided information doesn't specify an average lifespan for parrots as a whole. - Begin counting at : 5\"), FunctionMessage(content='join', additional_kwargs={'idx': 5}, name='join'), AIMessage(content=\"Thought: Despite multiple attempts, the specific average lifespan of parrots as a whole has not been provided. The information obtained mentions that parrots can live over 50 years, but a more precise average is necessary for a detailed comparison with Cookie's age of 83 years. However, it's clear that Cookie lived significantly longer than the average lifespan of many parrot species, including lovebirds which have an average lifespan of 12 to 15 years.\"), AIMessage(content=\"The oldest parrot on record is Cookie, a cockatoo, who lived to be 83 years old. While specific average lifespan information for all parrot species has not been provided, it's mentioned that some parrots can live over 50 years. This suggests that Cookie lived significantly longer than the average lifespan for many parrot species. For instance, lovebirds, a type of parrot, have an average lifespan of 12 to 15 years, indicating that Cookie's lifespan was exceptional among parrots.\")]}\n", + "{'__end__': [HumanMessage(content=\"What's the oldest parrot alive, and how much longer is that than the average?\"), FunctionMessage(content=\"[{'url': 'https://a-z-animals.com/blog/discover-the-worlds-oldest-parrot/', 'content': 'How Old Is the World’s Oldest Parrot? Discover the World’s Oldest Parrot Advertisement of debate, so we’ll detail some other parrots whose lifespans may be longer but are hard to verify their exact age. Comparing Parrots’ Lifespans to Other BirdsSep 8, 2023 — Sep 8, 2023The oldest parrot on record is Cookie, a pink cockatoo that survived to the age of 83 and survived his entire life at the Brookfield Zoo.'}]\", additional_kwargs={'idx': 0}, name='tavily_search_results_json'), FunctionMessage(content=\"HTTPError('502 Server Error: Bad Gateway for url: https://api.tavily.com/search')\", additional_kwargs={'idx': 1}, name='tavily_search_results_json'), FunctionMessage(content='join', additional_kwargs={'idx': 2}, name='join'), AIMessage(content='Thought: The oldest parrot on record is Cookie, a pink cockatoo, who lived to be 83 years old. However, there was an error fetching additional search results to compare this age to the average lifespan of parrots.'), SystemMessage(content='Context from last attempt: I found the age of the oldest parrot, Cookie, who lived to be 83 years old. However, I need to search again to find the average lifespan of parrots to complete the comparison. - Begin counting at : 3'), FunctionMessage(content='[{\\'url\\': \\'https://www.turlockvet.com/site/blog/2023/07/15/parrot-lifespan--how-long-pet-parrots-live\\', \\'content\\': \"Parrot Lifespan the lifespan of a parrot?\\'. Parrot Lifespan: How Long Do Pet Parrots Live? how long they actually live and what you should know about owning a parrot.Jul 15, 2023 — Jul 15, 2023Generally, the average lifespan of smaller species of parrots such as Budgies and Cockatiels is about 5 - 15 years, while larger parrots such as\\\\xa0...\"}]', additional_kwargs={'idx': 3}, name='tavily_search_results_json'), AIMessage(content=\"Thought: I have found that the oldest parrot on record, Cookie, lived to be 83 years old. Additionally, I've found that the average lifespan of parrots varies by species, with smaller species like Budgies and Cockatiels living between 5-15 years, and larger parrots potentially living longer. This allows me to compare Cookie's age to the average lifespan of smaller parrot species.\"), AIMessage(content=\"The oldest parrot on record is Cookie, a pink cockatoo, who lived to be 83 years old. Compared to the average lifespan of smaller parrot species such as Budgies and Cockatiels, which is about 5-15 years, Cookie lived significantly longer. The average lifespan of larger parrot species wasn't specified, but it's implied that larger parrots may live longer than smaller species, yet likely still much less than 83 years.\")]}\n", "---\n" ] } ], "source": [ "steps = chain.stream(\n", - " [HumanMessage(content=\"What's the oldest parrot alive, and how much longer is that than the average?\")],\n", + " [\n", + " HumanMessage(\n", + " content=\"What's the oldest parrot alive, and how much longer is that than the average?\"\n", + " )\n", + " ],\n", " {\n", " \"recursion_limit\": 100,\n", " },\n", ")\n", "for step in steps:\n", " print(step)\n", - " print('---')" + " print(\"---\")" ] }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 21, "id": "6c65c414-7668-4fdf-ba97-f42f659b1317", "metadata": {}, "outputs": [ @@ -800,7 +854,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "The oldest parrot on record is Cookie, a cockatoo, who lived to be 83 years old. While specific average lifespan information for all parrot species has not been provided, it's mentioned that some parrots can live over 50 years. This suggests that Cookie lived significantly longer than the average lifespan for many parrot species. For instance, lovebirds, a type of parrot, have an average lifespan of 12 to 15 years, indicating that Cookie's lifespan was exceptional among parrots.\n" + "The oldest parrot on record is Cookie, a pink cockatoo, who lived to be 83 years old. Compared to the average lifespan of smaller parrot species such as Budgies and Cockatiels, which is about 5-15 years, Cookie lived significantly longer. The average lifespan of larger parrot species wasn't specified, but it's implied that larger parrots may live longer than smaller species, yet likely still much less than 83 years.\n" ] } ], @@ -819,7 +873,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 22, "id": "38d3ea91-59ba-4267-8060-ed75bbc840c6", "metadata": {}, "outputs": [ @@ -827,20 +881,26 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'plan_and_schedule': [FunctionMessage(content='3307.0', additional_kwargs={'idx': 0}, name='math'), FunctionMessage(content='7.565011820330969', additional_kwargs={'idx': 1}, name='math'), FunctionMessage(content='join', additional_kwargs={'idx': 2}, name='join')]}\n", - "{'join': [AIMessage(content='Thought: The first calculation resulted in 3307.0, and the second calculation gave 7.565011820330969. To find the sum of these two values, I will simply add them together.'), AIMessage(content='The sum of ((3*(4+5)/0.5)+3245) + 8 and 32/4.23 is approximately 3314.565.')]}\n", - "{'__end__': [HumanMessage(content=\"What's ((3*(4+5)/0.5)+3245) + 8? What's 32/4.23? What's the sum of those two values?\"), FunctionMessage(content='3307.0', additional_kwargs={'idx': 0}, name='math'), FunctionMessage(content='7.565011820330969', additional_kwargs={'idx': 1}, name='math'), FunctionMessage(content='join', additional_kwargs={'idx': 2}, name='join'), AIMessage(content='Thought: The first calculation resulted in 3307.0, and the second calculation gave 7.565011820330969. To find the sum of these two values, I will simply add them together.'), AIMessage(content='The sum of ((3*(4+5)/0.5)+3245) + 8 and 32/4.23 is approximately 3314.565.')]}\n" + "{'plan_and_schedule': [FunctionMessage(content='3307.0', additional_kwargs={'idx': 1}, name='math'), FunctionMessage(content='7.565011820330969', additional_kwargs={'idx': 2}, name='math'), FunctionMessage(content='3314.565011820331', additional_kwargs={'idx': 3}, name='math'), FunctionMessage(content='join', additional_kwargs={'idx': 4}, name='join')]}\n", + "{'join': [AIMessage(content=\"Thought: The calculations for each part of the user's question have been successfully completed. The first calculation resulted in 3307.0, the second in 7.565011820330969, and the sum of those two values was correctly found to be 3314.565011820331.\"), AIMessage(content='The result of ((3*(4+5)/0.5)+3245) + 8 is 3307.0, the result of 32/4.23 is approximately 7.565, and the sum of those two values is approximately 3314.565.')]}\n", + "{'__end__': [HumanMessage(content=\"What's ((3*(4+5)/0.5)+3245) + 8? What's 32/4.23? What's the sum of those two values?\"), FunctionMessage(content='3307.0', additional_kwargs={'idx': 1}, name='math'), FunctionMessage(content='7.565011820330969', additional_kwargs={'idx': 2}, name='math'), FunctionMessage(content='3314.565011820331', additional_kwargs={'idx': 3}, name='math'), FunctionMessage(content='join', additional_kwargs={'idx': 4}, name='join'), AIMessage(content=\"Thought: The calculations for each part of the user's question have been successfully completed. The first calculation resulted in 3307.0, the second in 7.565011820330969, and the sum of those two values was correctly found to be 3314.565011820331.\"), AIMessage(content='The result of ((3*(4+5)/0.5)+3245) + 8 is 3307.0, the result of 32/4.23 is approximately 7.565, and the sum of those two values is approximately 3314.565.')]}\n" ] } ], "source": [ - "for step in chain.stream([HumanMessage(content=\"What's ((3*(4+5)/0.5)+3245) + 8? What's 32/4.23? What's the sum of those two values?\")]):\n", + "for step in chain.stream(\n", + " [\n", + " HumanMessage(\n", + " content=\"What's ((3*(4+5)/0.5)+3245) + 8? What's 32/4.23? What's the sum of those two values?\"\n", + " )\n", + " ]\n", + "):\n", " print(step)" ] }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 23, "id": "a6cf5fe0-f178-4197-950f-257711bff8d2", "metadata": { "scrolled": true @@ -850,7 +910,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "The sum of ((3*(4+5)/0.5)+3245) + 8 and 32/4.23 is approximately 3314.565.\n" + "The result of ((3*(4+5)/0.5)+3245) + 8 is 3307.0, the result of 32/4.23 is approximately 7.565, and the sum of those two values is approximately 3314.565.\n" ] } ], @@ -858,6 +918,28 @@ "# Final answer\n", "print(step[END][-1].content)" ] + }, + { + "cell_type": "markdown", + "id": "c647d5f3-5e00-4449-9cec-5a9f438c9cff", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "Congrats on building your first LLMCompiler agent! I'll leave you with some known limitations to the implementation above:\n", + "\n", + "1. The planner output parsing format is fragile if your function requires more than 1 or 2 arguments. We could make it more robust by using streaming tool calling.\n", + "2. Variable substitution is fragile in the example above. It could be made more robust by using a fine-tuned model and a more robust syntax (using e.g., Lark or a tool calling schema)\n", + "3. The state can grow quite long if you require multiple re-planning runs. To handle, you could add a message compressor once you go above a certain token limit.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "431217e6-4c00-409f-a2bd-40ebff902489", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/examples/llm-compiler/img/llm-compiler.png b/examples/llm-compiler/img/llm-compiler.png new file mode 100644 index 000000000..3c9ec7a57 Binary files /dev/null and b/examples/llm-compiler/img/llm-compiler.png differ diff --git a/examples/multi_agent/agent_supervisor.ipynb b/examples/multi_agent/agent_supervisor.ipynb index 53c0d6b30..8f2d01fa4 100644 --- a/examples/multi_agent/agent_supervisor.ipynb +++ b/examples/multi_agent/agent_supervisor.ipynb @@ -107,10 +107,7 @@ "from langchain_openai import ChatOpenAI\n", "\n", "\n", - "\n", - "def create_agent(\n", - " llm: ChatOpenAI, tools: list, system_prompt: str\n", - "):\n", + "def create_agent(llm: ChatOpenAI, tools: list, system_prompt: str):\n", " # Each worker node will be given a name and some tools.\n", " prompt = ChatPromptTemplate.from_messages(\n", " [\n", @@ -255,7 +252,11 @@ "research_node = functools.partial(agent_node, agent=research_agent, name=\"Researcher\")\n", "\n", "# NOTE: THIS PERFORMS ARBITRARY CODE EXECUTION. PROCEED WITH CAUTION\n", - "code_agent = create_agent(llm, [python_repl_tool], \"You may generate safe python code to analyze data and generate charts using matplotlib.\")\n", + "code_agent = create_agent(\n", + " llm,\n", + " [python_repl_tool],\n", + " \"You may generate safe python code to analyze data and generate charts using matplotlib.\",\n", + ")\n", "code_node = functools.partial(agent_node, agent=code_agent, name=\"Coder\")\n", "\n", "workflow = StateGraph(AgentState)\n", @@ -369,11 +370,7 @@ ], "source": [ "for s in graph.stream(\n", - " {\n", - " \"messages\": [\n", - " HumanMessage(content=\"Write a brief research report on pikas.\")\n", - " ]\n", - " },\n", + " {\"messages\": [HumanMessage(content=\"Write a brief research report on pikas.\")]},\n", " {\"recursion_limit\": 100},\n", "):\n", " if \"__end__\" not in s:\n", diff --git a/examples/multi_agent/hierarchical_agent_teams.ipynb b/examples/multi_agent/hierarchical_agent_teams.ipynb index a4794a319..37c9e46bf 100644 --- a/examples/multi_agent/hierarchical_agent_teams.ipynb +++ b/examples/multi_agent/hierarchical_agent_teams.ipynb @@ -291,9 +291,7 @@ " return {\"messages\": [HumanMessage(content=result[\"output\"], name=name)]}\n", "\n", "\n", - "def create_team_supervisor(\n", - " llm: ChatOpenAI, system_prompt, members\n", - ") -> str:\n", + "def create_team_supervisor(llm: ChatOpenAI, system_prompt, members) -> str:\n", " \"\"\"An LLM-based router.\"\"\"\n", " options = [\"FINISH\"] + members\n", " function_def = {\n", @@ -374,10 +372,18 @@ "\n", "llm = ChatOpenAI(model=\"gpt-4-1106-preview\")\n", "\n", - "search_agent = create_agent(llm, [tavily_tool], \"You are a research assistant who can search for up-to-date info using the tavily search engine.\")\n", + "search_agent = create_agent(\n", + " llm,\n", + " [tavily_tool],\n", + " \"You are a research assistant who can search for up-to-date info using the tavily search engine.\",\n", + ")\n", "search_node = functools.partial(agent_node, agent=search_agent, name=\"Search\")\n", "\n", - "research_agent = create_agent(llm, [scrape_webpages], \"You are a research assistant who can scrape specified urls for more detailed information using the scrape_webpages function.\")\n", + "research_agent = create_agent(\n", + " llm,\n", + " [scrape_webpages],\n", + " \"You are a research assistant who can scrape specified urls for more detailed information using the scrape_webpages function.\",\n", + ")\n", "research_node = functools.partial(agent_node, agent=research_agent, name=\"Web Scraper\")\n", "\n", "supervisor_agent = create_team_supervisor(\n", @@ -388,7 +394,7 @@ " \" task and respond with their results and status. When finished,\"\n", " \" respond with FINISH.\",\n", " [\"Search\", \"Web Scraper\"],\n", - ")\n" + ")" ] }, { @@ -417,17 +423,14 @@ "research_graph.add_conditional_edges(\n", " \"supervisor\",\n", " lambda x: x[\"next\"],\n", - " {\n", - " \"Search\": \"Search\",\n", - " \"Web Scraper\": \"Web Scraper\",\n", - " \"FINISH\": END\n", - " }\n", + " {\"Search\": \"Search\", \"Web Scraper\": \"Web Scraper\", \"FINISH\": END},\n", ")\n", "\n", "\n", "research_graph.set_entry_point(\"supervisor\")\n", "chain = research_graph.compile()\n", "\n", + "\n", "# The following functions interoperate between the top level graph state\n", "# and the state of the research sub-graph\n", "# this makes it so that the states of each graph don't get intermixed\n", @@ -438,11 +441,7 @@ " return results\n", "\n", "\n", - "\n", - "research_chain = (\n", - " enter_chain\n", - " | chain\n", - ")" + "research_chain = enter_chain | chain" ] }, { @@ -474,9 +473,8 @@ ], "source": [ "for s in research_chain.stream(\n", - " \"when is Taylor Swift's next tour?\",\n", - " {\"recursion_limit\": 100}\n", - " ):\n", + " \"when is Taylor Swift's next tour?\", {\"recursion_limit\": 100}\n", + "):\n", " if \"__end__\" not in s:\n", " print(s)\n", " print(\"---\")" @@ -539,7 +537,6 @@ " }\n", "\n", "\n", - "\n", "llm = ChatOpenAI(model=\"gpt-4-1106-preview\")\n", "\n", "doc_writer_agent = create_agent(\n", @@ -551,7 +548,9 @@ ")\n", "# Injects current directory working state before each call\n", "context_aware_doc_writer_agent = prelude | doc_writer_agent\n", - "doc_writing_node = functools.partial(agent_node, agent=context_aware_doc_writer_agent, name=\"Doc Writer\")\n", + "doc_writing_node = functools.partial(\n", + " agent_node, agent=context_aware_doc_writer_agent, name=\"Doc Writer\"\n", + ")\n", "\n", "note_taking_agent = create_agent(\n", " llm,\n", @@ -560,7 +559,9 @@ " \" taking notes to craft a perfect paper.{current_files}\",\n", ")\n", "context_aware_note_taking_agent = prelude | note_taking_agent\n", - "note_taking_node = functools.partial(agent_node, agent=context_aware_note_taking_agent, name=\"Note Taker\")\n", + "note_taking_node = functools.partial(\n", + " agent_node, agent=context_aware_note_taking_agent, name=\"Note Taker\"\n", + ")\n", "\n", "chart_generating_agent = create_agent(\n", " llm,\n", @@ -569,7 +570,9 @@ " \"{current_files}\",\n", ")\n", "context_aware_chart_generating_agent = prelude | chart_generating_agent\n", - "chart_generating_node = functools.partial(agent_node, agent=context_aware_note_taking_agent, name=\"Chart Generator\")\n", + "chart_generating_node = functools.partial(\n", + " agent_node, agent=context_aware_note_taking_agent, name=\"Chart Generator\"\n", + ")\n", "\n", "doc_writing_supervisor = create_team_supervisor(\n", " llm,\n", @@ -578,7 +581,7 @@ " \" respond with the worker to act next. Each worker will perform a\"\n", " \" task and respond with their results and status. When finished,\"\n", " \" respond with FINISH.\",\n", - " [\"Doc Writer\", \"Note Taker\", \"Chart Generator\"]\n", + " [\"Doc Writer\", \"Note Taker\", \"Chart Generator\"],\n", ")" ] }, @@ -618,20 +621,21 @@ " \"Doc Writer\": \"Doc Writer\",\n", " \"Note Taker\": \"Note Taker\",\n", " \"Chart Generator\": \"Chart Generator\",\n", - " \"FINISH\": END\n", - " }\n", + " \"FINISH\": END,\n", + " },\n", ")\n", "\n", "authoring_graph.set_entry_point(\"supervisor\")\n", "chain = research_graph.compile()\n", "\n", + "\n", "# The following functions interoperate between the top level graph state\n", "# and the state of the research sub-graph\n", "# this makes it so that the states of each graph don't get intermixed\n", "def enter_chain(message: str, members: List[str]):\n", " results = {\n", " \"messages\": [HumanMessage(content=message)],\n", - " \"team_members\": \", \".join(members)\n", + " \"team_members\": \", \".join(members),\n", " }\n", " return results\n", "\n", @@ -664,9 +668,9 @@ ], "source": [ "for s in authoring_chain.stream(\n", - " \"Write an outline for poem and then write the poem to disk.\",\n", - " {\"recursion_limit\": 100}\n", - " ):\n", + " \"Write an outline for poem and then write the poem to disk.\",\n", + " {\"recursion_limit\": 100},\n", + "):\n", " if \"__end__\" not in s:\n", " print(s)\n", " print(\"---\")" @@ -720,6 +724,7 @@ " messages: Annotated[List[BaseMessage], operator.add]\n", " next: str\n", "\n", + "\n", "def get_last_message(state: State) -> str:\n", " return state[\"messages\"][-1].content\n", "\n", @@ -727,6 +732,7 @@ "def join_graph(response: dict):\n", " return {\"messages\": [response[\"messages\"][-1]]}\n", "\n", + "\n", "# Define the graph.\n", "super_graph = StateGraph(State)\n", "# First add the nodes, which will do the work\n", @@ -746,8 +752,8 @@ " {\n", " \"Paper writing team\": \"Paper writing team\",\n", " \"Research team\": \"Research team\",\n", - " \"FINISH\": END\n", - " }\n", + " \"FINISH\": END,\n", + " },\n", ")\n", "super_graph.set_entry_point(\"supervisor\")\n", "super_graph = super_graph.compile()" @@ -814,13 +820,15 @@ ], "source": [ "for s in super_graph.stream(\n", - " {\n", - " \"messages\": [\n", - " HumanMessage(content=\"Write a brief research report on the North American sturgeon. Include a chart.\")\n", - " ],\n", - " },\n", - " {\"recursion_limit\": 150},\n", - " ):\n", + " {\n", + " \"messages\": [\n", + " HumanMessage(\n", + " content=\"Write a brief research report on the North American sturgeon. Include a chart.\"\n", + " )\n", + " ],\n", + " },\n", + " {\"recursion_limit\": 150},\n", + "):\n", " if \"__end__\" not in s:\n", " print(s)\n", " print(\"---\")" diff --git a/examples/multi_agent/multi-agent-collaboration.ipynb b/examples/multi_agent/multi-agent-collaboration.ipynb index 8afa66194..bad5669a8 100644 --- a/examples/multi_agent/multi-agent-collaboration.ipynb +++ b/examples/multi_agent/multi-agent-collaboration.ipynb @@ -118,9 +118,7 @@ " )\n", " prompt = prompt.partial(system_message=system_message)\n", " prompt = prompt.partial(tool_names=\", \".join([tool.name for tool in tools]))\n", - " return prompt | llm.bind_functions(functions)\n", - "\n", - "\n" + " return prompt | llm.bind_functions(functions)" ] }, { @@ -162,8 +160,7 @@ " result = repl.run(code)\n", " except BaseException as e:\n", " return f\"Failed to execute. Error: {repr(e)}\"\n", - " return f\"Succesfully executed:\\n```python\\n{code}\\n```\\nStdout: {result}\"\n", - "\n" + " return f\"Succesfully executed:\\n```python\\n{code}\\n```\\nStdout: {result}\"" ] }, { @@ -251,8 +248,8 @@ "\n", "# Research agent and node\n", "research_agent = create_agent(\n", - " llm, \n", - " [tavily_tool], \n", + " llm,\n", + " [tavily_tool],\n", " system_message=\"You should provide accurate data for the chart generator to use.\",\n", ")\n", "research_node = functools.partial(agent_node, agent=research_agent, name=\"Researcher\")\n", @@ -286,6 +283,7 @@ "tools = [tavily_tool, python_repl]\n", "tool_executor = ToolExecutor(tools)\n", "\n", + "\n", "def tool_node(state):\n", " \"\"\"This runs tools in the graph\n", "\n", diff --git a/examples/plan-and-execute/img/plan-and-execute.png b/examples/plan-and-execute/img/plan-and-execute.png new file mode 100644 index 000000000..829f2aee8 Binary files /dev/null and b/examples/plan-and-execute/img/plan-and-execute.png differ diff --git a/examples/plan-and-execute/plan-and-execute.ipynb b/examples/plan-and-execute/plan-and-execute.ipynb index d191a20c5..c681480ba 100644 --- a/examples/plan-and-execute/plan-and-execute.ipynb +++ b/examples/plan-and-execute/plan-and-execute.ipynb @@ -12,11 +12,21 @@ "The core idea is to first come up with a multi-step plan, and then go through that plan one item at a time.\n", "After accomplishing a particular task, you can then revisit the plan and modify as appropriate.\n", "\n", + "\n", + "The general computational graph looks like the following:\n", + "\n", + "\n", + "![plan-and-execute diagram](./img/plan-and-execute.png)\n", + "\n", + "\n", "This compares to a typical [ReAct](https://arxiv.org/abs/2210.03629) style agent where you think one step at a time.\n", "The advantages of this \"plan-and-execute\" style agent are:\n", "\n", "1. Explicit long term planning (which even really strong LLMs can struggle with)\n", - "2. Ability to use smaller/weaker models for the execution step, only using larger/better models for the planning step" + "2. Ability to use smaller/weaker models for the execution step, only using larger/better models for the planning step\n", + "\n", + "\n", + "The following walkthrough demonstrates how to do so in LangGraph. The resulting agent will leave a trace like the following example: ([link](https://smith.langchain.com/public/d46e24d3-dda6-44d5-9550-b618fca4e0d4/r))." ] }, { @@ -59,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "ce438281-08d5-4804-afe7-e4089f7b016b", "metadata": {}, "outputs": [], @@ -81,24 +91,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "01f460d1-f26f-47d1-ae76-de74d5d851de", "metadata": {}, "outputs": [], "source": [ "os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n", - "os.environ[\"LANGCHAIN_API_KEY\"] = getpass.getpass(\"LangSmith API Key:\")" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "e475c7f9-4c46-4f21-8ba6-2e4d67b09cae", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "os.environ[\"LANGCHAIN_PROJECT\"] = \"brex\"" + "os.environ[\"LANGCHAIN_API_KEY\"] = getpass.getpass(\"LangSmith API Key:\")\n", + "os.environ[\"LANGCHAIN_PROJECT\"] = \"Plan-and-execute\"" ] }, { @@ -113,7 +113,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 5, "id": "25b9ec62-0675-4715-811c-9b32c635b22f", "metadata": {}, "outputs": [], @@ -136,7 +136,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 6, "id": "72d233ca-1dbf-4b43-b680-b3bf39e3691f", "metadata": {}, "outputs": [], @@ -144,6 +144,7 @@ "from langchain import hub\n", "from langchain.agents import create_openai_functions_agent\n", "from langchain_openai import ChatOpenAI\n", + "\n", "# Get the prompt to use - you can modify this!\n", "prompt = hub.pull(\"hwchase17/openai-functions-agent\")\n", "# Choose the LLM that will drive the agent\n", @@ -154,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 7, "id": "a3ea9bd3-87d9-4a78-aec6-8ab4bf34479b", "metadata": {}, "outputs": [], @@ -164,7 +165,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 8, "id": "998aebde-c204-494f-930c-14747ed34861", "metadata": {}, "outputs": [], @@ -174,7 +175,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 9, "id": "746e697a-dec4-4342-a814-9b3456828169", "metadata": {}, "outputs": [ @@ -183,18 +184,20 @@ "text/plain": [ "{'input': 'who is the winnner of the us open',\n", " 'chat_history': [],\n", - " 'agent_outcome': AgentFinish(return_values={'output': 'The winners of the US Open in 2023 are:\\n\\n- For tennis, Coco Gauff won her first Grand Slam title at the US Open 2023 with a comeback victory against Aryna Sabalenka. [Source](https://sports.yahoo.com/us-open-2023-coco-gauff-wins-1st-grand-slam-title-with-wild-comeback-vs-aryna-sabalenka-222431287.html)\\n\\n- In golf, Wyndham Clark won the 2023 US Open, marking his first major championship victory. The tournament took place at the Los Angeles Country Club. [Source](https://www.nbclosangeles.com/news/sports/golf/wyndham-clark-wins-2023-us-open-for-first-major-championship/3172672/)'}, log='The winners of the US Open in 2023 are:\\n\\n- For tennis, Coco Gauff won her first Grand Slam title at the US Open 2023 with a comeback victory against Aryna Sabalenka. [Source](https://sports.yahoo.com/us-open-2023-coco-gauff-wins-1st-grand-slam-title-with-wild-comeback-vs-aryna-sabalenka-222431287.html)\\n\\n- In golf, Wyndham Clark won the 2023 US Open, marking his first major championship victory. The tournament took place at the Los Angeles Country Club. [Source](https://www.nbclosangeles.com/news/sports/golf/wyndham-clark-wins-2023-us-open-for-first-major-championship/3172672/)'),\n", + " 'agent_outcome': AgentFinish(return_values={'output': 'The winners of the US Open in 2023 are as follows:\\n\\n- **Golf:** Wyndham Clark won the 2023 US Open in golf, holding his nerve against Rory McIlroy.\\n \\n- **Tennis:** The 2023 US Open tennis tournament details include information about the event and its prize money, but the winner has not been specified in the provided information. As of the last update, Carlos Alcaraz won the 2022 US Open tennis title.'}, log='The winners of the US Open in 2023 are as follows:\\n\\n- **Golf:** Wyndham Clark won the 2023 US Open in golf, holding his nerve against Rory McIlroy.\\n \\n- **Tennis:** The 2023 US Open tennis tournament details include information about the event and its prize money, but the winner has not been specified in the provided information. As of the last update, Carlos Alcaraz won the 2022 US Open tennis title.'),\n", " 'intermediate_steps': [(AgentActionMessageLog(tool='tavily_search_results_json', tool_input={'query': 'US Open winner 2023'}, log=\"\\nInvoking: `tavily_search_results_json` with `{'query': 'US Open winner 2023'}`\\n\\n\\n\", message_log=[AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\"query\":\"US Open winner 2023\"}', 'name': 'tavily_search_results_json'}})]),\n", - " '[{\\'url\\': \\'https://sports.yahoo.com/us-open-2023-coco-gauff-wins-1st-grand-slam-title-with-wild-comeback-vs-aryna-sabalenka-222431287.html\\', \\'content\\': \\'— US Open Tennis (@usopen) September 9, 2023 — US Open Tennis (@usopen) September 9, 2023 US Open 2023: Coco Gauff wins 1st Grand Slam title with wild comeback vs. Aryna Sabalenka What a backhand winner from Coco Gauff! pic.twitter.com/JhDcFpsJ4E — US Open Tennis (@usopen) September 9, 2023— US Open Tennis (@usopen) September 9, 2023 Gauff got the momentum change the crowd was looking for early in the second set, breaking Sabalenka to go up 3-1 and holding serve from there to take ...\\'}, {\\'url\\': \\'https://www.nbclosangeles.com/news/sports/golf/wyndham-clark-wins-2023-us-open-for-first-major-championship/3172672/\\', \\'content\\': \"Wyndham Clark wins 2023 US Open for first major championship 2023 US Open features a record purse. Here\\'s how much the winning golfer will make Clark on Sunday claimed the 2023 US Open title at the Los Angeles Country Club, making it his first major championship US Open champion in 2011 and a four-time total major winner -- who recorded a nine-under.Clark on Sunday claimed the 2023 US Open title at the Los Angeles Country Club, making it his first major championship triumph. The 29-year-old finished the tournament going 10-under, just edging ...\"}, {\\'url\\': \\'https://www.sportingnews.com/us/golf/news/us-open-2023-live-scores-results-leaderboard/jbmxrpro5jc37drgq8e2lehn\\', \\'content\\': \\'MORE: Watch the 2023 U.S. Open live with Fubo (free trial) U.S. Open leaderboard 2023 Edition Who won the U.S. Open in 2023? Complete scores, results, highlights from Los Angeles Country Club The golf world headed to the City of Angels — Los Angeles — for the 2023 U.S. Open. MORE:\\\\xa0How much prize money does the U.S. Open winner make?Nick Brinkerhoff 06-19-2023 • 23 min read (Getty Images) The golf world headed to the City of Angels — Los Angeles — for the 2023 U.S. Open. And the tournament got its Hollywood ending....\\'}]')]}" + " '[{\\'url\\': \\'https://en.wikipedia.org/wiki/2023_U.S._Open_(golf)\\', \\'content\\': \\'Contents 2023 U.S. Open (golf) was selected to host the 123rd U.S. Open in June 2023. The USGA had made overtures to the club for at least 26 years. Final round[edit] Sunday, June 18, 2023 Third round[edit] Saturday, June 17, 2023Rory McIlroy falls short as Wyndham Clark holds nerve to win 2023 US Open. The Guardian. Archived from the original on June 19, 2023. Retrieved June 20, 2023.\\'}, {\\'url\\': \\'https://en.wikipedia.org/wiki/2023_US_Open_(tennis)\\', \\'content\\': \"The 2023 US Open is the 143rd consecutive edition of the tournament and will take place at the USTA Billie Jean King The total overall prize money for the 2023 US Open totals $65 million, 8% more than the 2022 edition.[4] Contents 2023 US Open (tennis) Wheelchair boys\\' singles Dahnon Ward Wheelchair girls\\' singles Ksénia Chasteau contract with ESPN, in which the broadcaster holds exclusive rights to the entire tournament and the US Open Series.Carlos Alcaraz defeats Casper Ruud for 2022 US Open title, world No. 1 ranking. US Open. Archived from the original on September 12, 2022. Retrieved September\\\\xa0...\"}]')]}" ] }, - "execution_count": 42, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "agent_executor.invoke({\"input\": \"who is the winnner of the us open\", \"chat_history\": []})" + "agent_executor.invoke(\n", + " {\"input\": \"who is the winnner of the us open\", \"chat_history\": []}\n", + ")" ] }, { @@ -215,7 +218,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 10, "id": "8eeeaeea-8f10-4fbe-8e24-4e1a2381a009", "metadata": {}, "outputs": [], @@ -226,8 +229,7 @@ "\n", "\n", "class PlanExecute(TypedDict):\n", - "\n", - " input: str \n", + " input: str\n", " plan: List[str]\n", " past_steps: Annotated[List[Tuple], operator.add]\n", " response: str" @@ -245,7 +247,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 11, "id": "4a88626d-6dfd-4488-87f0-a9a0dd6da44c", "metadata": {}, "outputs": [], @@ -255,12 +257,15 @@ "\n", "class Plan(BaseModel):\n", " \"\"\"Plan to follow in future\"\"\"\n", - " steps: List[str] = Field(description=\"different steps to follow, should be in sorted order\")\n" + "\n", + " steps: List[str] = Field(\n", + " description=\"different steps to follow, should be in sorted order\"\n", + " )" ] }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 12, "id": "ec7b1867-1ea3-4df3-9a98-992a1c32ec49", "metadata": {}, "outputs": [], @@ -268,17 +273,21 @@ "from langchain.chains.openai_functions import create_structured_output_runnable\n", "from langchain_core.prompts import ChatPromptTemplate\n", "\n", - "planner_prompt = ChatPromptTemplate.from_template(\"\"\"For the given objective, come up with a simple step by step plan. \\\n", + "planner_prompt = ChatPromptTemplate.from_template(\n", + " \"\"\"For the given objective, come up with a simple step by step plan. \\\n", "This plan should involve individual tasks, that if executed correctly will yield the correct answer. Do not add any superfluous steps. \\\n", "The result of the final step should be the final answer. Make sure that each step has all the information needed - do not skip steps.\n", "\n", - "{objective}\"\"\")\n", - "planner = create_structured_output_runnable(Plan, ChatOpenAI(model=\"gpt-4-turbo-preview\", temperature=0), planner_prompt)" + "{objective}\"\"\"\n", + ")\n", + "planner = create_structured_output_runnable(\n", + " Plan, ChatOpenAI(model=\"gpt-4-turbo-preview\", temperature=0), planner_prompt\n", + ")" ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 13, "id": "67ce37b7-e089-479b-bcb8-c3f5d9874613", "metadata": {}, "outputs": [ @@ -288,13 +297,15 @@ "Plan(steps=['Identify the current year.', 'Search for the Australia Open winner of the current year.', 'Find the hometown of the identified winner.'])" ] }, - "execution_count": 46, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "planner.invoke({'objective': 'what is the hometown of the current Australia open winner?'})" + "planner.invoke(\n", + " {\"objective\": \"what is the hometown of the current Australia open winner?\"}\n", + ")" ] }, { @@ -309,17 +320,22 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 14, "id": "ec2d12cc-016a-44d1-aa08-4c5ce1e8fe2a", "metadata": {}, "outputs": [], "source": [ "from langchain.chains.openai_functions import create_openai_fn_runnable\n", + "\n", + "\n", "class Response(BaseModel):\n", " \"\"\"Response to user.\"\"\"\n", + "\n", " response: str\n", "\n", - "replanner_prompt = ChatPromptTemplate.from_template(\"\"\"For the given objective, come up with a simple step by step plan. \\\n", + "\n", + "replanner_prompt = ChatPromptTemplate.from_template(\n", + " \"\"\"For the given objective, come up with a simple step by step plan. \\\n", "This plan should involve individual tasks, that if executed correctly will yield the correct answer. Do not add any superfluous steps. \\\n", "The result of the final step should be the final answer. Make sure that each step has all the information needed - do not skip steps.\n", "\n", @@ -332,10 +348,15 @@ "You have currently done the follow steps:\n", "{past_steps}\n", "\n", - "Update your plan accordingly. If no more steps are needed and you can return to the user, then respond with that. Otherwise, fill out the plan. Only add steps to the plan that still NEED to be done. Do not return previously done steps as part of the plan.\"\"\")\n", + "Update your plan accordingly. If no more steps are needed and you can return to the user, then respond with that. Otherwise, fill out the plan. Only add steps to the plan that still NEED to be done. Do not return previously done steps as part of the plan.\"\"\"\n", + ")\n", "\n", "\n", - "replanner = create_openai_fn_runnable([Plan, Response], ChatOpenAI(model=\"gpt-4-turbo-preview\", temperature=0), replanner_prompt)\n" + "replanner = create_openai_fn_runnable(\n", + " [Plan, Response],\n", + " ChatOpenAI(model=\"gpt-4-turbo-preview\", temperature=0),\n", + " replanner_prompt,\n", + ")" ] }, { @@ -350,20 +371,24 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 15, "id": "6c8e0dad-bcea-4c9a-8922-0d820892e2d0", "metadata": {}, "outputs": [], "source": [ "async def execute_step(state: PlanExecute):\n", - " task = state['plan'][0]\n", + " task = state[\"plan\"][0]\n", " agent_response = await agent_executor.ainvoke({\"input\": task, \"chat_history\": []})\n", - " return {\"past_steps\": (task, agent_response['agent_outcome'].return_values['output'])}\n", + " return {\n", + " \"past_steps\": (task, agent_response[\"agent_outcome\"].return_values[\"output\"])\n", + " }\n", + "\n", "\n", "async def plan_step(state: PlanExecute):\n", " plan = await planner.ainvoke({\"objective\": state[\"input\"]})\n", " return {\"plan\": plan.steps}\n", "\n", + "\n", "async def replan_step(state: PlanExecute):\n", " output = await replanner.ainvoke(state)\n", " if isinstance(output, Response):\n", @@ -371,8 +396,9 @@ " else:\n", " return {\"plan\": output.steps}\n", "\n", + "\n", "def should_end(state: PlanExecute):\n", - " if state['response']:\n", + " if state[\"response\"]:\n", " return True\n", " else:\n", " return False" @@ -380,7 +406,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 16, "id": "e954cea0-5ccc-46c2-a27b-f5b7185b597d", "metadata": {}, "outputs": [], @@ -401,7 +427,7 @@ "workflow.set_entry_point(\"planner\")\n", "\n", "# From plan we go to agent\n", - "workflow.add_edge('planner', 'agent')\n", + "workflow.add_edge(\"planner\", \"agent\")\n", "\n", "# From agent, we replan\n", "workflow.add_edge(\"agent\", \"replan\")\n", @@ -414,7 +440,7 @@ " # If `tools`, then we call the tool node.\n", " True: END,\n", " False: \"agent\",\n", - " }\n", + " },\n", ")\n", "\n", "# Finally, we compile it!\n", @@ -425,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 17, "id": "b8ac1f67-e87a-427c-b4f7-44351295b788", "metadata": {}, "outputs": [ @@ -433,18 +459,21 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'plan': ['Identify the winner of the 2024 Australia Open.', \"Research the winner's biography to find their place of birth or hometown.\", 'Confirm the hometown of the 2024 Australia Open winner.']}\n", - "{'past_steps': ('Identify the winner of the 2024 Australia Open.', \"The winners of the 2024 Australian Open were Jannik Sinner in the men's singles category and Aryna Sabalenka in the women's singles category.\")}\n", - "{'plan': [\"Research Jannik Sinner's biography to find his place of birth or hometown.\", \"Research Aryna Sabalenka's biography to find her place of birth or hometown.\", 'Confirm the hometown of Jannik Sinner.', 'Confirm the hometown of Aryna Sabalenka.']}\n", - "{'past_steps': (\"Research Jannik Sinner's biography to find his place of birth or hometown.\", 'Jannik Sinner was born in Innichen, Italy. This town is also known as San Candido, which is mentioned as his hometown.')}\n", - "{'plan': [\"Research Aryna Sabalenka's biography to find her place of birth or hometown.\", 'Confirm the hometown of Aryna Sabalenka.']}\n", - "{'past_steps': (\"Research Aryna Sabalenka's biography to find her place of birth or hometown.\", 'Aryna Sabalenka was born in Minsk, the capital of Belarus.')}\n", - "{'response': 'The hometown of the 2024 Australia Open winners are Innichen (San Candido), Italy for Jannik Sinner and Minsk, Belarus for Aryna Sabalenka. No further steps are needed.'}\n" + "{'plan': ['Wait until the 2024 Australian Open concludes.', 'Identify the winner of the 2024 Australian Open.', \"Research the winner's biography to find their hometown.\", 'The hometown of the 2024 Australian Open winner is the result found in the previous step.']}\n", + "{'past_steps': ('Wait until the 2024 Australian Open concludes.', \"I can't wait for real-time events. However, I can help you find out the schedule, expected dates, or any other information regarding the 2024 Australian Open. How can I assist you further?\")}\n", + "{'plan': ['Identify the winner of the 2024 Australian Open.', \"Research the winner's biography to find their hometown.\", 'The hometown of the 2024 Australian Open winner is the result found in the previous step.']}\n", + "{'past_steps': ('Identify the winner of the 2024 Australian Open.', \"The winners of the 2024 Australian Open were Jannik Sinner in the men's singles and Aryna Sabalenka in the women's singles. Jannik Sinner defeated Daniil Medvedev in the final, while specific details about Aryna Sabalenka's match are not provided in the information retrieved.\")}\n", + "{'plan': [\"Research Jannik Sinner's biography to find his hometown.\", \"Research Aryna Sabalenka's biography to find her hometown.\", 'The hometowns of the 2024 Australian Open winners are the results found in the previous steps.']}\n", + "{'past_steps': (\"Research Jannik Sinner's biography to find his hometown.\", 'Jannik Sinner was born in San Candido (Innichen), Italy, on August 16, 2001. This is considered his hometown.')}\n", + "{'plan': [\"Research Aryna Sabalenka's biography to find her hometown.\", 'The hometowns of the 2024 Australian Open winners are the results found in the previous steps.']}\n", + "{'past_steps': (\"Research Aryna Sabalenka's biography to find her hometown.\", 'Aryna Sabalenka was born in Minsk, the capital of Belarus.')}\n", + "{'response': 'The hometowns of the 2024 Australian Open winners are San Candido (Innichen), Italy for Jannik Sinner, and Minsk, Belarus for Aryna Sabalenka. No further steps are needed as the final answer has been reached.'}\n" ] } ], "source": [ "from langchain_core.messages import HumanMessage\n", + "\n", "config = {\"recursion_limit\": 50}\n", "inputs = {\"input\": \"what is the hometown of the 2024 Australia open winner?\"}\n", "async for event in app.astream(inputs, config=config):\n", @@ -454,12 +483,14 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "8c20341e-267d-4ba0-9a0b-dad055a76b1d", + "cell_type": "markdown", + "id": "8bf585a9-0f1e-4910-bd00-65e7bb05b6e6", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "## Conclusion\n", + "\n", + "Congrats on making a plan-and-execute agent! One known limitations of the above design is that each task is still executed in sequence, meaning embarassingly parallel operations all add to the total execution time. You could improve on this by having each task represented as a DAG (similar to LLMCompiler), rather than a regular list." + ] }, { "cell_type": "code", @@ -486,7 +517,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.1" + "version": "3.11.2" } }, "nbformat": 4, diff --git a/examples/rag/langgraph_crag_mistral.ipynb b/examples/rag/langgraph_crag_mistral.ipynb index c1289061e..5c84f59ab 100644 --- a/examples/rag/langgraph_crag_mistral.ipynb +++ b/examples/rag/langgraph_crag_mistral.ipynb @@ -2,26 +2,17 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "id": "19969669-b47f-47f3-b6d4-f7b155434840", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33mWARNING: There was an error checking the latest version of pip.\u001b[0m\u001b[33m\n", - "\u001b[0m" - ] - } - ], + "outputs": [], "source": [ - "! pip install --quiet langchain_community tiktoken langchain-openai langchainhub chromadb langchain langgraph tavily-python langchain-mistralai" + "! pip install --quiet langchain_community tiktoken langchain-openai langchainhub chromadb langchain langgraph tavily-python langchain-mistralai gpt4all" ] }, { "attachments": { - "9db7f9db-55aa-48cb-95d5-bcde3f937589.png": { + "a65940f9-5c51-4d7c-9ca1-ae576e4bb51a.png": { "image/png": "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9WPuJCABCUhAAn1NAAXeaqutVv41U0r2ohAogb///e8XF198cbHmmmtWXoI4Sy21VIHf8JGWZorqNC9vv/12sdtuuw2UwYMy5lxHpWXP7U855ZS54K6HhZkbuYTTBafjkfZDLVdseGC9k1ia5SWOl26naz2kx0d7v2qGRqt8BUMA8VJWrc5Nj4+F/iLNc6v9SSaZpBYlHT1fO/DuBn1LLPF5cXi6PVQldppOP+wPpQ2mTNP9TsoV9x2dnJebOdHq/NiI0CpuN4/HC653km6/91+dlMW4EpCABCQgAQn0DwFnevRPXZgTCUhAAhKQgASGQIAZJvx95zvfKV2G3HHHHeWCsbj9iAV/53fffXeli5w47nCUW3E6U001VbzbdPvaa6+tc9fFotb4bGctA9JBMcTIYxZzTsvWNOHk4EgrmHDLFAsjnOeee+44KLudnpeN1OPA2CUNMyjitSHmnXfegsWJEdy3pAuQV2UtdsWUjs5nBHh8vCqNNBy3Z0FGaoZMuF4vf1kHhDUokGYj3jvJQy/6i06u38243COBT+wiKL1Guth4M5du8bm4bRvPkt6fL7300pBxpH0eC5m3YySI13BKL447wB122CENLk455ZRyHSDWAhoLMqj911hgbx4lIAEJSEACg0xAo8cg165lk4AEJCABCYwjAiiQWDScv+2226549tlnCxaLvf/++0sKKIMxGuTWNUhH0zZTIPYK6X333VdLGmXvOeec06AUQwmXrhFRO6liI50xgT//kZRYocV1MR5sv/32I5mFIV0LheIVV1xROzf15x8vzM2MhC996UvFNNNMU4vfzkbqioqF6auMHulo/Tj9OB3aOG64cqP0hztbIr7mSGyzTkJQ6j/wwAOVl+z0niCh4fQXlRkZ4QPxOhL0b6ztgJE0lXSWW65tpOe4XzTcQxg511lnnSyaN998MxseAlMj7ic/+cly7alwfCi/hx9+eHY9D9Laeeedi1/84hd1i6IP5Rojcc6g9l8jwc5rSEACEpCABCRQTUD3VtVsPCIBCUhAAhKQwBgmgD96ZkvEUjVSFwVorCxEWTQURWp8rU63H3vssdopKM9zo4BZ4PzWW2+txWtnI13IHcX6SApuXRZaaKHaJU844YTilltuqe3368ZZZ51VW0yYPLKQdizpouPM9Gil+IzPZzsdcY8rtpwwO+fee+/NHSrD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kD8WK//Upz5VzD///MW8885bMBukXaVpQ2IGSEACo06g6v5dZJFFio997GPlfb7CCisUH/nIR0Y9r2ZAAhKQgAQkIIGxQWCi/7wrYyOr5lICEpCABCQgAQlIQAISGE8EXnjhheKdd94ppphiimKyySbTj/94qnzLOm4IsJ4H6/Zwj08++eTlr7M5xk31W1AJSEACEpBATwho9OgJVhOVgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhgpAlMPNIX9HoSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIoBcENHr0gqppSkACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkMOIENHqMOHIvKAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQQC8IaPToBVXTlMAYIPDmm2+OgVyaRQlIQAISkED3CAzis+/tt98u/v3vf3cPkimNGwK2nXFT1QNf0LfeequvyjiIz5q+AmxmxiUBn1njstottASGReA9wzrbkyUggTFH4Nlnny0OPfTQ4sorryyWW2654uCDDy7mmmuuMVeOfsjwYYcdVjzzzDOVWdltt92K+eabr/J4Px/42te+VrzwwgtlFldZZZVi3XXX7efs9k3eXnrppeL8888vHnnkkeKxxx4rfvvb3xbve9/7iplmmqmYeeaZi+OOO67c7psMD3BG7r333uK0006rLOG8885b7L777pXH2z1gnTcndcsttxTXXntt8fjjjxcPP/xw8fe//734wAc+UMw666zFmmuuWWy77bbFK6+8Uuyzzz7FO++8k01s4oknLo4//vjiPe8Z+mvr3XffXdBn0y422mij8tnHvTnW5cILLyyOOeaY4uWXXy6++tWvFttvv/1YL5L575DA6aefXtC+kbnnnrvYc88920rBttMWJiP1OQGUoEceeWRxxhlnFPPMM0+x3377FSuuuOKo5drvrFFD74UHnIDPrAGvYIsngR4RmOg/70qP0jZZCUhgCAT4cL3tttvqzvzc5z5XLLDAArUwRnSizItv32mmmabYbLPNanGqNiZMmFCcdNJJtcPrrLNOqYitBbjRNoEVVlihePLJJyvjo/xeZpllKo+PxAEUsijeUcA/+uijpTIe5TvtKfzNMsssDVlZcMEFi3/+859l+DbbbFMccMABDXEMqCdw/fXXl8omlLpV8uCDDxZTTz111WHDu0gAw+4OO+xQmeJiiy1WXHLJJZXH2zlgnVdTou/ByHDRRRdVRkJBv++++xYoiRZffPHKeBzAkPje9763aZxmB9dee+3i/vvvr0XhWYjxYyzLP/7xj2KRRRapK8INN9xQfPSjH60Lc2ewCWA4vPrqq8tC0h4uu+yylgW27bREZIQxQuDGG28stthii1puMarfeeedwzKS1xIbwobfWUOA5ikSaEHAZ1YLQB6WgAQqCQx9yFxlkh6QgASGQ+DWW28tjj766Loknn/++eKQQw6phaHE5qU6Fl7y2zF6hNGA4dx0P4T38nfLLbesKZ/WWGONUjHWy+uN17QvvfTSYtddd80W/4orrqiFb7rppuXIuLEw6rlf2w4f3eStmcBXg0czQmPrmHVeXV8Y5HkexUaGXOycwTUXb7hhr7/+ekNeHnjggRE1erz22mt1RvADDzywYNDBcOR3v/tdw+kPPfSQRo8GKgakBGw7KRH3xyoBBpPEwsCTv/3tb0U7z5eTTz65nCHC+dNPP305KzFOayjb6XdVuj+UND1HAmOJgO87Y6m2zKsEBp+ARo/Br2NLOAAErrvuujqjRzoTpJMirr/++sXtt99eO2WDDTaobY/UBh8jYTQ8IzfGqpx66qkFL3ZBmE2x9957h91R+2WENTMzfvrTn7aVh+9///vFX//61wIXGbiR6Wfpx7bDzKvDDz+8DtsnP/nJUumLq5HJJpusoE7eeOONujju9JbAZz/72YYRz7j2w73RcMU6b07wZz/7WYORYccddyyYXfOhD32ovBeee+652gzGGWaYoaGuMNqee+65zS/U5lFmiPDsu/jii2tnrLXWWrXtkdjABUt47nG9MJNuONdedNFFS55/+ctfasmMpluXWibc6HsCtp2+ryIz2CYB+vJ4sNiSSy7ZlsGD5HELGPrlbr2j9cN3VpvojCaBnhDwfacnWE1UAhIYIgGNHkME52kSGEkCf/zjH4s///nPtZf4m2++eciXZ2TptNNOWzBKGXciq6666pDTGu8nput1oNzuB9luu+0KZgzFgrKR+mYdg6effrqgDTH9Xxk+ARS88ahZZi+xdke/tIfhl3BspsCsmtT1z4wzztiVwljnzTF+85vfrIuAu520LuIIk0wyScPxVrNE4vPb2cbgRR4wTq+++urFEkss0c5pfR2H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mzx8X2t72gQ7v28fG/74XwNr7ljyoP7A8MdtwCX9bOcr77DHLuxjYz+fZSPHPG8PPfSQ9e7dOxCfEQQQQAABBBBAoJgC6hvCDyrIeOqpp6xv377+5MjD1Uqa9FTBxeTJk5PzDB482Jo2bZocL+ZARabP78si6jaPGTMmEPWOO+6wE088MTDNjahT8I8++siNlvkZ7rRe+1oFKLVq1SpzXj9Cu3btAgUz6sj+qKOO8qMwjAACCOQsUNJeAgEBBBBAAAEEEECgUALHH3+83VtS4NFx200SBR5az+u37mjffzvdHrp/WKnVttl6a7vrnj/b8lVr7JwH/mpjXn7F9ABLgUcpKiYggAACCCCAQJEFVNPj5JNPDqRi2LBhNmvWrMC0bEa23377QPS7777bwh2WByJU8Eic06eCDD/07NnTHw0M//3vfw+MRxlRgYUfvv76a3800vB2XvOumuHee++1pUuXRpqXSAgggEBUAQo9okoRDwEEEEAAAQQQyFJg33272gsvPG/dOtW3d+7pkpy7XasG1r9nI3vy8eH2yMMPJKdr4JOJE6zv2WeUdFxZw2qVVPV/6aWX7OCDDw7EYQQBBBBAAAEEEIiLwEUXXRRIijqbVpNUb731VmB61JFevXoFoqrJrBtvvNFWrFgRmF6skTinL9xfxi+//JKS6bHHHrMZM/6//7iUMVJPbN++feCLW2+91dauXRuYVtbIgQceGGj+bOrUqYk+7+bNm1fWrHyPAAIIRBaocW1JiBybiAgggAACCCCAAAKRBHbcob19WtI0w2mHbG6PDdyt1Dx77dDEJkydY8+++J59M/0bO+Sww+3xR4fbbTffYNWrVzO9OammHbbZZptS8zIBAQQQQAABBBCIi0CjRo1syZIlNmnSpGSS1qxZY2PHjrWvvvrKfvzxx8T36mRbNUAmTJhQ8lLIC8m4HTt2TBSSuAmtW7e22bNn2xdffOEm2SeffGKPPvpoojmlX3/9NVEzQIUr3377bWJ5L7/8csn9U3ULd6yuBahGg7+sE044wbSOVOG5555LpNd997//+78W7lsjX+lT01Affvhhon+LH374IWHl175Qvye6D9R3+lOhQLgPFZdO96nt9JsG07B8t9hii0ShkcaHDx9ud911l5sl+al99vPPP5tcFT9VPxval++9915yHnVcr30pe82nP9X+ULNZb775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Y61Pnz6Bzb/xxhvtsMMOs6233jownREEEECgGALVi7FS1okAAggggAACCBRTQG+pNWrUwNasXmGTH94rcoHH+E8XWPdLJ9uCX9cl3vqjwKOYe5F1I4AAAggggMDGLqDaBY8++mhgM1W747HHHotU4BGY0RvhHs7DKMfgIYccYqNGjSrVTJgKPggIIIBAHAQo9IjDXiANCCCAAAIIIFBhAur8cs8997DqG9bYrNH7W/PN60Ra9+C/fm0nXz/Vlq9ab9dcc40NGTIk0nxEQgABBBBAAAEEECifwMiRIwMzqkmre++912rXrh2Ynu2ImmeaP39+trMR3xPYa6+97Pbbb/emmL3++uv2008/BaYxggACCBRDgEKPYqizTgQQQAABBBAoisDQoUPtoIO625aNzGaOPiByGu4cNcPuGjXb1m+oZvfff79deeWVkeclIgIIIIAAAggggED2AqtWrbLRo0cHZjznnHOsZs38tNQ+ZsyYwLIZyV5AzVmpLw8/vPTSS/4owwgggEBRBCj0KAo7K0UAAQQQQACBiha4+OKL7eKLL7Ltmte0KY/vF3n1f3zwS7vlqZlWt179RKeNetgmIIAAAggggAACCBRWYMKECYEOyLW24447Lm8rfeSRR2zdunV5Wd6KFSvs888/T9wrjh8/3mbNmmUbNmwo17KXLl2a6HNEhTJaVrg/k/IsVH2VfP311/bqq6/aK6+8Yl999ZWtXr26PIsKzKO+Ps4666zAtHHjxgXGGUEAAQSKIZCf4vFipJx1IoAAAggggAACEQV69uxpL7zwgu21Yx177bbSnVamW8yRf/zIPvl6jW266eb2xhtvJDpwTBeX6QgggAACCCCAAAL5E5gyZUpgYepAu3HjxoFp2Y60a9cukfmv+WbPnm3vv/++HXBA9Nq/4fVNmjTJrrjiClPfI+FQv359O+mkk2zgwIFWp07Zzal+9tlndumllybT5y9PNSruvPNOf1KkYRV0DBo0KFGIkmqGAw880AYPHmytWrVK9XWkadrGO+64IxlXhT9r1qwxFYgQEEAAgWIJUNOjWPKsFwEEEEAAAQQqRGC77bYreevuBTu6S6OsCjx6XfOpTZq+1pq3aJl4G26XXXapkPSyEgQQQAABBBBAAAFL1JzwHfbZZx9/tFzDWkaHDh2S8/71r39NDmczsH79envggQcSNU9SFXhoWcuWLUt0wn700Ufb9OnTMy7+xRdftGOOOSZlgYdmVF8ZAwYMyLgM/0vVMlFn7epw/KOPPvK/Cgyrr7t999038XJQ4IssRpo2bWoqTPJDWdvrx2UYAQQQKIQAhR6FUGWZCCCAAAIIIBALgR122MG+/XaGHdu1iT05qFPkNHW79BP74IsV1mbrbey7774rqemxaeR5iYgAAggggAACCCCQu8C0adMCC9lqq60C4+UZqVatmp155pnJWV977bVEU1TJCREH1NeIakhECaptodoQK1euTBn9iy++sAsvvDDld/7EbDoJVxNTquERNagZ2G+//TZq9FLxWrZsGZj2/fffB8YZQQABBCpagEKPihZnfQgggAACCCBQIQItWzQveVtumt1+Xlt7bOCukdY5b9Eq63TuBPvyh1V24IHdLPywHWkhREIAAQQQQAABBBDIWWDRokWBZWy55ZaB8fKO9OjRw9T0lAujRo1yg5E+VXhxyy23lIqrZq6eeeYZGzZsmHXr1i3w/YIFC+ypp54KTHMj9913nxtMft5666324Ycf2sSJExPzudopUfr3UF8dt912W3JZGlBn45qmwhD9adg3UByts7yhefPmgVmXLFkSGGcEAQQQqGgBCj0qWpz1IYAAAggggEDBBTZt0th+/nmuvXJzR+tzVJtI6/v4q8W2T79JNmvBWuvZs5fpzT8CAggggAACCCCAQHEEfv3118CK81HTQwtUZv8pp5ySXPbjjz9u6ug7alDhhQox/KC+48477zxT81lHHXWUDR8+3Hr16uVHSfR7oSav/KDaFeGOv9UsldLXokULU0GPmp8aO3asde3a1Z817fDTTz8d6PxcTU+99dZbdvLJJ1vHjh0TfxpW01YqDHFBnZyrVkp5QrjQI7yd5Vkm8yCAAAK5CFDokYse8yKAAAIIIIBArATmzZtn9erVsZUrltiUx/exvXeK1izVix/MtWOv/NyWLF9v5557ro0cOTJW20ViEEAAAQQQQACBqiSgPinCGef16tXLG4Ey/V1QAYYKBaKG8ePHB6KquaxOnYLNqNasWTPRwbkfUdvz73//259k7733XmBcBRv77bdfYJpGtDx1iB4lvPnmm4FoqsHRpEmTwDSNqEBFtVP8UN6+OMK1cKjp4asyjAACxRCg0KMY6qwTAQQQQAABBPIuMGnSJGvZsoVV27DGZj93gG3ZuFakdTz40vd29m3TbNWaDXbVVVfZ0KFDI81HJAQQQAABBBBAAIHCCKjvjUKG7bff3vbYY4/kKrLp0Dzc/Kn660gVVDNFTWn5YebMmf6ozZ49OzCeblmKtOuu0ZprnTFjRnKZ2267rXXu3Dk5Hh7o3r17YNKPP/4YGI86Eq4pU6NGjaizEg8BBBAoiEDNgiyVhSKAAAIIIIAAAhUo8Oijj1rfc86xzRtVs6+e3D/ymq9/fJoNfWGu1ahR0wYMGJAo9Ig8MxERQAABBBBAAAEECiagZqj82h6LFy+2xo0b5219qqGhPjMU1NTTd999Zw0bNsy4fGXuhwsq2rZtm3ae9u3b28svv5z8Plyo8NNPPyW/04AKKTKFHXfc0aZOnZo2itLn9/uxYsUKe+mll9LGV40aP/jz+tPLGp4zZ04gSoMGDQLjjCCAAAIVLUChR0WLsz4EEEAAAQQQyKuAqvqrM8a2zWrYxw/uG3nZF977uT07frHVrVs/0UHk0UcfHXleIiKAAAIIIIAAAggUVkD9TfiFHj///HNeCz0OP/zwRP8ebh3qhPyckpdoMoVw5r7ihjsE9+cPN/sULvQI1/zYYost/NlLDW+6aeamW8PpUwFNv379Si0n3YSFCxem+yrj9Llz5wa+p9AjwMEIAggUQYDmrYqAzioRQAABBBBAID8C6uRR7RR3alcrqwKP026abKPf/dWabLqZvfvuu0aBR372B0tBAAEEEEAAAQTyJRDO4FffbfkMtWvXNtX2cEEdmq9cudKNpvysXj27bLRwTYpws13h9YW/T5mIDBM32WSTDN+W/VXdunXLjpQixqxZswJTU/UhEojACAIIIFBgAWp6FBiYxSOAAAIIIIBAYQQOPPDARIHF4Xs2sqevDnYemWmNRw2aZJO+XmWtWm9t//rXv2yzzTbLFJ3vEEAAAQQQQAABBIogsPPOO9vkyZOTaw7XJkh+kcOAOjS/7777EktQjY9XX30149LUT0c4qNPudM1ihdPcpk2bwOytW7e2zz//PDlNTXi1aNEiOZ7tQKr0HXLIIZEXE7XfkPACs22mKzw/4wgggEC+BSj0yLcoy0MAAQQQQACBggt06NDBpkz5ws46Yku76/c7RVrf6rXrrfuln9q3s1fbLrvsmijwiDQjkRBAAAEEEEAAAQQqXED9V/jh73//u/Xs2dOflPPwNttsY3qRRn16KKi2R6ZQs2ZNU8GF3/fF9OnTrVOn1C/gTJkyJbA4FXL4oVWrVv6oqbmr8HYHIpQxopoiKrjwC4sGDx5sTZs2LWPO8n/9zTffBDy0pHDhTvmXzpwIIIBA+QSyq5dXvnUwFwIIIIAAAgggkDeB5s2bl3TgOMWuP3vryAUe02cus059J9qM2Wtsv/0PoMAjb3uDBSGAAAIIIIAAAoUR6NixY2DB6hA83GdFIEI5R04//fTknH5hhiaGm6fStHBn4yNGjNDkUkEFGG+88UZgeriQIzw+ZsyYQPzwyLfffhueVGp8++23D0y7++67U25HIFIOI0899VRg7q5du1q2zYAFFsAIAgggkAcBCj3ygMgiEEAAAQQQQKBiBLbYfDObP2+uPXhpO+t33DaRVjp+0nw7eMBnNv/Xdfbb3/7WXn/99UjzEQkBBBBAAAEEEECgeAKqsaDOzP2gzsbzHQ466KBS68m0jiOPPDLw9ahRo2z8+PGBaeqr4+qrrw5M07aEC3L22GOPQBwV7Hz66aeBaW7kvffeM3VMXlbo1atXIMrIkSPtxhtvtBUrVgSm52NETYJp+X445phj/FGGEUAAgaIIUOhRFHZWigACCCCAAALZCtStW8eWLl1k00d0seMPbB5p9ptHTLf/ufFLW7F6gx133HH29NNPR5qPSAgggAACCCCAAALFFVBtgVNPPTWQCDU/le/MezVZ5XdoHlhhipETTjihVPNNml8FC6qp8eSTT9opp5xSqpbHH//4R6tTp05giWqyVYUuftBLOk888URJzeapieauJk2aZLfccouddtppfrS0w126dDH1VeKHhx9+2Dp37myq9fHaa68lCla++OKLRO3n559/3u644w775z//6c8SafiFF14wFXz44YgjjvBHGUYAAQSKIlCtpKrehqKsmZUigAACCCCAAAIRBNRO8E477Wi1aqy3H5/dL8Ic/4ly16gZNnjEzJKRanbllVfatddeG3leIiKAAAIIIIAAAggUX0BNRKm5JD8ce+yxdu+995r6r4gStt5662S0M844w2644YbkuBuYNWuWqbAgHAYOHGjnn39+eLKpRsYFF1xQanq6Cerj4u233zYVsITDxx9/bOHaGeE4bly1RRYsWOBGEzVM2rZtmxx3A4sWLUq4hQsk3PepPvv162eXXXZZqq9STlOhTLiA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gAACCCCAAAIIIIAAAggggAACEqCmB8cBAggggAACCORVYM6cOVa3bh1bs2qpfTOia+QCj4EPfmkj3lhoVq26/eEPf6DAI697hYUhgAACCCCAAAIIIIAAAgggUDUEKPSoGvuZrUQAAQQQQKBCBEaPHm2tW7eyOjVW26zR+1vDetEqlZ5z+2f2xN8X2oaS9zHuvvtuu+GGGyokvawEAQQQQAABBBBAAAEEEEAAAQQ2LoFqG0rCxrVJbA0CCCCAAAIIFEug1iY1bf36dTZ/7IGRk9Drmk9twlerrXqNTeyRRx6x448/PvK8REQAAQQQQAABBBBAAAEEEEAAAQR8AWp6+BoMI4AAAggggEC5BX7++eeSlqmqWb26tazn1RMjLefgyybZxK/XWsNGTey1116jwCOSGpEQQAABBBBAAAEEEEAAAQQQQCCdAIUe6WSYjgACCCCAAAJZCZx37lm2605tbMjNZ9nn36238+76d9r55y1ebXv//hObPmuDNWvWwiZMmGD77LNP2vh8gQACCCCAAAIIIIAAAggggAACCEQRoNAjihJxEEAAAQQQQCCjwLx58+xvr79pp/bqaod128X++sDFNv7zVaa+OsLhk68XW7f+k23OIrPf/KadTZs2zVq2bBmOxjgCCCCAAAIIIIAAAggggAACCCCQtQCFHlmTMQMCCCCAAAIIhAUuvvA827bNlnbicV0SX3XYobU9/VB/e/ffq+zUGyclo7/4wVzredUUW7KyhnXuvId9/PHHye8YQAABBBBAAAEEEEAAAQQQQAABBHIVoCPzXAWZHwEEEEAAgSousHTpUtu6TUu77epT7IiDdw1ofPbF99bn4vus83Y1bf9dNrWrH/nBataqY4cffrg999xzgbiMIIAAAggggAACCCCAAAIIIIAAArkKUOiRqyDzI4AAAgggUMUFDjm4m82f+529PPLylBKz5iy0I08ebL8sWmG1a9e23r1724MPPpgyLhMRQAABBBBAAAEEEEAAAQQQQACBXARo3ioXPeZFAAEEEECgigts2LChpBPyidarx55pJKrZ8Gc+s9p1m9imm25qu+++OwUeaaSYjAACCCCAAAIIIIAAAggggAACuQvUzH0RLAEBBBBAAAEEqqpA375nW9OtGluf07uXIrj8xnH25jsfW4MGDe2oo46yhx56qFQcJiCAAAIIIIAAAggggAACCCCAAAL5FKB5q3xqsiwEEEAAAQSqmECTJg2t3fa72G1X9rD22zSxxb8ut5uHvmkvv/5P22yzze3444+3W2+9tYqpsLkIIIAAAggggAACCCCAAAIIIFAsAWp6FEue9SKAAAIIIFDJBU499VSrVbOGbdWild3x8Ee2Zuls+3zq99aqVRu7//4H7KSTTqrkW0jyEUAAAQQQQAABBBBAAAEEEECgsglQ06Oy7THSiwACCCCAQEwENtussbX7zba2bu0q+2LqDNt7733s3HPPNRWGEBBAAAEEEEAAAQQQQAABBBBAAIFiCFDToxjqrBMBBBBAAIFKLtCzZ09btbKksOOLr+zAbt3t4Ueest12262SbxXJRwABBBBAAAEEEEAAAQQQQACByi5AoUdl34OkHwEEEEAAgSIIdO60s82cOdOee+45a926dRFSwCoRQAABBBBAAAEEEEAAAQQQQACB0gI0b1XahCkIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBQCQWqV8I0k2QEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJQAhR6lSJiAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAAClVGAQo/KuNdIMwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCJQSoCPzUiRMQAABBBBAAAEEEEAAAQQQQAABBBBAIHeBJYvW2oR3F9rPs1bbsiXrbdniNbZunVmzNrWtWava1rTlfz4326pW7itjCQgggAACCQE6MudAQAABBBBAAAEEEEAAAQQQQAABBBBAIE8CKuh4Y8wv9u20pfb5xKWRllqvfg3bsVN967RvI+uwRyNrtCnvKUeCIxICCCCQQoBCjxQoTEIAAQQQQOD/2DsP+CiKL44/SkIJvffeewdBBAERpVuxUFSwIBbEBlZUFEHEiv7tDQVBmhRBujRBlI703kMPvf3zmzjL7ObucpfcJVd+7/NZdnZ2Znbmuxtud96890iABEiABEiABEiABEiABEiABHwhcDrukvz40T5Z/scxOXfussRki1dk1MopJcpml+jo9BKdKUP8ll6i4rdTJy5K3MkL8dYfF+O3C7Lg94O2S5Uqn1Uq1oyRGg1zKGWI7SQPSIAESIAEPBKg0sMjHp4kARIgARIgARIgARIgARIgARIgARIgARIgAc8EZk88Kr9+v1+OH7vguWAyzpapFCPlqmWV0hUzS9nKMZKvEF1hJQMjq5AACUQQASo9Iuhmc6gkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAL+IzB9TKz8Me2o7N15RjVaukJ2yZ03WnLliZac8ZtTLl2+ImdOXfxvuySnVfqSxJ24IMePXpALFy47q9iOCxTOJI+/UVKKlMxsy+cBCZAACZDAVQJUelxlwRQJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJJElg7Bf7ZPGMY3L0SIJlR6UaOaVmg9ySv3CWJOt6KnA67mK88uO8HI9v90T8/hjSh8/LkdjzNoXIg/2LS6OWuT01xXMkQAIkELEEqPSI2FvPgZMACZAACZAACZAACZAACZAACZAACZAACfhC4MK5K/LZWztl+YLjqlqOnFHSoFl+qVQzpy/NJKvssXjlx6xJe2Xf7gSrkhYd8sm9jxdJVlusRAIkQALhTIBKj3C+uxwbCZAACZAACZAACZAACZAACZAACZAACZCAXwhsXnNWvhi8Qw7uP6fay18ok7TuXExy50vsxsovF3TTyNJ5h2Tp/Fh1tmGzPNLrhWKSPr2bwswmARIggQgkwP8SI/Cmc8gkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEI4EMobjoDgmEiABEiABEiABEiABEiABEiABEiABEiABEvAHgbOnrsjCGSdk5Mc7rOYKF8si7boUl0xZMlh5qZUoVyWn7NlxWjKkTyd/zjsiB/aekxc+KCsZolKrB7wOCZAACQQ3Abq3Cu77w96RAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmkEYEj+y/LhG8PyILfD1k9KF4qRjp2LWEdp2Viyujdsm3jScmUKb28+3MVyRJDpy5peT94bRIggeAgwP8Jg+M+sBckQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAJBRGDf9ssye+Ixm8KjXJUcQaPwAKobbykixUvHyLlzl+XJ29ZJ7P4LQUSQXSEBEiCBtCFApUfacOdVSYAESIAESIAESIAESIAESIAESIAESIAEgpQAFB5rl52WqWN2Wz1seF0+aXNrUes4GBIZo9LHB1MvKnC3deHCZRn48EY5sDsh0How9I99IAESIIG0IEClR1pQ5zVJgARIgARIgARIgARIgARIgARIgARIgASCksDRg5dl99aLMmX0Lqt/VWrlkvrN8lvHwZTIEpNBKT7yF8wkp+IuydB+W2Xn5jPB1EX2hQRIgARSlQCVHqmKmxcjARIgARIgARIgARIgARIgARIgARIgARIIVgKXL4kc2HlZpv28W44fS3AVVaJMNmnRvnCwdln1K3uuKGnZoYhExVt+HDl8Qb4YvEvOnYkfDIUESIAEIpAAlR4ReNM5ZBIgARIgARIgARIgARIgARIgARIgARIggcQEDuy6LDMn7pftm+PUybz5oqXNbcHl0ipxrxNy8hXKLHUb51EHu7eflck/HnBXlPkkQAIkENYEqPQI69vLwZEACUQ6gfPnz8u4cePkrrvukjfeeEO2bt0a6Ug4fhJIksDs2bNl9OjRahs/frxcvHgxyTosQAIkQAIkQAIkEHkEhg8fLvPnz5fLly9H3uDDdMRn4q7IqiVx8vfiI2qEmTKll5Ydi0h0/D5UpE6TfFKwSGbV3Sk/xcrGVQnKm1DpP/uZ9gQ+/PBDqVKlinTo0EFWrlyZ9h1iD0ggGQTSXYmXZNRjFRIgARLwGwF8JBw/ftxje1FRUZItWzaPZXgyMYFvvvlGXnnlFetE3rx5ZenSpZIxY0YrjwkScBI4c+aMUpBt3rxZsmbNKuXLl5fixYtLhgwZnEXD8hhKwkWLFlljmzt3rpQuXdo6ZoIESIAESIAESIAElixZInfeeacCgW+VVq1aSfPmzaVhw4Z8bwjhx2Pvtkvywwe75d/VCd+nLdoVliq1c4XciLb8e1Km/ReAvXr9bNL3rTIhNwZ2OG0ILFiwQO655x7r4jfddJN8+umn1jETJBAqBDjrFSp3iv0kgTAmEBsbK/Xr109yhDExMVK5cmWpVKmSPPDAA1KmTOq/uEFPPGbMGKuv0dHR0qlTJ+s42BLffvutrUuHDx8WvMTgg4xCAiaBHTt2yHvvvScrVqxwaxFUu3Ztadq0qfTq1Uty5MhhVmeaBEiABEiABEiABCKKQKNGjWTmzJkydepUtU2bNk2wQerUqSPXXHONNGjQQJo0aRIfYyEqotiE8mBXLz1lKTyKlYwJSYUH+JetlF0q18wl61cek9XL4uTPOUel4fW5Q/nWsO+pRGD58uW2K124kBDXxpbJAxIIAQK09AiBm8QukkC4Ezh48KBXSg8nh4ceekj69u0rWbJkcZ4K2DGsUswV31DErFu3LmDXS2nD3bp1k3nz5tma+e2335TyyJbJg4gmABdOTz75pNcM8NyPGjVKatSo4XWdUCpIS49QulvsKwmQAAmQAAkEB4Hp06fLlClTlALEnCQsVKiQNG7cWClBoAApWjQ0YkMEB9XU7cWxQ5dlxGs7ZfP6E+rCN99eTMrEKw9CVbZtjJMpo3ep7l97Y265/5nioToU9jsVCbRt21bWrFljXfGOO+6QoUOHWsdMkECoEEgfKh1lP0mABEjASeB///ufvP32285sHhsEevbsaRyJNGvWjAoPG5HIPjh79qxSHPqi8ACxU6dOSZcuXeTkyZORDZCjJwESIAESIAESIIH/CNx4443ywQcfKOuP5557TqpVq6bO7N+/X8XYe+aZZ+Taa69VbmM+/vhj+skPwifnrz9OWAqPcpVzhLTCA3hLV8gmMdkSHLysXHRS6Nw+CB+6IOvSvn37bAoPdA8usikkEIoE6N4qFO8a+0wCYU6gRIkS0r17d9sojx07JuvXr1cfEeaJr7/+WuBjEr5zKYkJXHfddQLz1Dlz5qiYDOSUmFEk58D9GQLdOwXKspo1aypXclipiGdo7Nixto9zWBFlzx66K9+cY+YxCZAACZAACZAACfiDQKlSpaR3795qmzVrluX6CotGYDUOV7PYhgwZouKAtG/fXtq1a8eYe/6An8I2Viy+GmeyRoPwcAVVrFSMbFhzPH6x0kVZu/yEVKtHF7WuHpPFixerxYG5coVe/BZX40lu3ujRoxNVzZkzZ6I8ZpBAKBCg0iMU7hL7SAIRRgDxJpwWChrB2rVrVTwPrEDQAsUHJ/M1jcT7fPnyye233574BHMimgAUie+//76NQeHCheWLL76wVibqk1WrVhWYNT/++OMC1w2PPPKIPP/88/o09yRAAiRAAiRAAiRAAi4ItGzZUrDBymPGjBkCN7MLFy60SiImCDbEVYPyA1uFChWs80ykHoFzpy/L9g1x6oIVquWUIiWypt7FA3il0hWzKaUHLrFsLpUerlBD4QErdkjdunVVTB7ML8AtHdz6RoocP35cPvvss0TDZSzHREiYESIEqPQIkRvFbpIACSQQwOTroEGD5P7777eQQBHijVy8eFG2bdsmmzdvjjftvSJly5ZV8TkQjNydnDt3TuACSMulS5d0Uu2xYgsvB57EuTLC2aZZFyvn06dP8DyIdtHXnTt3CtpA4PZixYq5XQUWFxcnzv6ZbSOdLl26ZAegTg4/rGZzukDCSxP64UnOnDkj58+ft4rgZTNjRs8/Wbine/fulU2bNgkm9LHKrly5cpItWzarHSauEvj000+VmyqdA4UHPsTdrW7KnDmzjBgxQubPny8tWrTQ1dQ+UM/00aNHZfv27ZIhQwZry5o1q0CRh31KBH8viMeze/duyZMnj/r7gpVZSiQ5fyMpuR7rkgAJkAAJkAAJhAYBxPWAlSy2FStWWAqQLVu2qAHgGwWusbBhoQkWLCEIOiX1CKxaelJOn0741itZLnwmustVySEZxu+VS5evyD8LT8h9T6ce01C50jXXXKNiVsACHgoQWLl//vnn6hsB57Dh+yfc4/HA7R7mN5xC634nER6HCgHPM0ihMgr2kwRIIKIIOCdcoRTAJLm7gOaYBB8wYIAsXbrUJSfEuXjzzTeVQsFZ4Oeff5YXX3zRmW07TiqY844dO2zlPbU5d+5cpYiB26GXX37ZVg8H5cuXVxPPrlaA3XfffW7HqBvCxPaSJUv0oVf7lPCDwsjJZ8KECVK7dm2P14ZFAVbDaYFVAawLXAmUQ6+99ppyv+TqPJRFb731ljRq1MjV6YjMO3z4sHzyySe2sSOuhzuFhy4IxZPz7w/nAvVM4xl49tln9eVt+8qVK6vJgM6dOyf5PJkVV61aJU899ZRSjpn5SLdu3VqGDRvmzE7yOCV/I0k2zgIkQAIkQAIkQAJhRaBWrVqCDe84WHCC95158+ZJbGysGifeq7AhmDAUILCCpwSewMolCbHqsmTJICXLhdeiqeJlYmT75jiJi3dxdeLoRcmRm1OBzicKf2vY8D2O79Xx48fLkSNHZMqUKWrDIjy4ocMGF9LhJqtXrxbETHUlSX0juqrDPBIIBgL8ny4Y7gL7QAIk4BMBWAlg8h8TjVpOnDiRSOmBlf8//vijUnjocq72+Mho0qSJcvXTqVMnV0VSLW/Pnj0qcJgrhQc6gTHfcMMNsmzZMilQoEBA++UPfliN37FjR5k4caLVV3zceVJ6YHWJqfBARXcvllBkQUFiujuzLvRfYuvWrXLnnXdKr169pH///spiwFkm0o7Nvx2MHcqwW265JSAYUvJMI/CnO0GMH2xQEKLvr776qrKIclce+ZMmTZLHHnvMbRE8d/369XN73nnCH38jzjZ5TAIkQAIkQALJJYDfJVjZYoP1LzbkuUqb5ZxplNdtOM+Z+bqcmafTnq7t7py+Fsav09hjDObYdJ65N9O6rN7jnD7vTZ7z+t7WNdvWab3XbZh7ndZloqKirHEjT0+2Pv300x7fX5L7vLCencCqPxOs94uXzSaZ4xUf4SR58kfHKz0SRnRg9zkqPTzcXCgZsWFBGBQgiI2JPb5REe8CW/369ZUrOihAwiHIN6zV4YLPnbhbXOqufHLy4TkAVjb//POPbNiwQeDNA8zhnePRRx9V9yQ57SanDv7/TcozRXLa1XWwYBceDbCgEM8PvBpQAkOASo/AcGWrJEACASYAN0amuHrZmDx5cpIKD7ONJ554QgVvLl26tJWdlEslq6APCU9t7tq1S5nWJtXcyJEjpW/fvkkVS9F5f/BDB6BIMpUeSMNyw92LxB9//GHrNyw14NbMKXBL5EusEpgoV6lSJWCT+87+BfMxrKNMue2228STmzezrKt0oJ5pT0oPsx8wRcfLI1x2uRO8OHtSeOh6UHx46+bKX38j+trckwAJkAAJhDeBl156SU3mYNLfOfGPCXBsyHemPeWZ51CPEn4E4O6WElgC/644GW8FEX6urTS1PPkz66Ts23VeylcPH/dd1sD8nICr5B49eqgN7nZNBQgWIGJDLB4sSIS1eKtWrfzcg9Rr7quvvlKLyfQVYdk/e/Zsfah+k6wDPybwm7VgwQJlVYPvOVcCDwX4joNb4kAL+vP222+rb0pY9uAeO2O64Df377//Vi6Y8f0Jqz3MVXijuPjpp59UzBQsyjQF8x2YM7n33nvDQolmji2t01R6pPUd4PVJgAR8JoCYAqavSSg8nJOuiAcxZMgQW9so99xzz6mJb5zAD+fAgQNtbekfOV3x1ltvtblnwo8cAgxqwY/gmDFj9GGivY7PYZ4w29y4caNaRaLPY3UDftghcMmE4GlYWYE4JqbiAC8FTqXH66+/bhsL2rhw4YKyckDaF/EXP1yzadOm6mVB3zNYZaxcuVK9ILjqEyxBTMGEvCsZPnx4omy4Lbr22mtVvAcokBCoe82aNVa5N954Q2666aZEVkFWgQhJgI0pxYsXNw99TgfqmYbf6xtvvFGw8gfPJNylHThwQMW5gcJBP1Po8LRp05QrCJiluxLEI3EK/t5hRYSVlfhbhJs7PC9OpZCzHo79+Tfiqn3mkQAJkAAJhB8B/MZgsoRCAr4QgKsdrDo3F2b5Up9lkyZw8thFVSgqKl3YubbCwGDpoeXAnqtxE3Ue954JmAoQxN+BQgAbJuy19Qc8UeC7pWXLlioQuucWg+cslKqYa9ACF8JQ0JtKD+dciy7rao94KJiHwZxGyZIl5Z133pHcuXPbimIBK6z1Mb/hyWODruQpkDoUInBFBuuM3r17qyquFsTqttztUR8u0aGYgOA7E3FCTaUH5qHwvQhvA6agTIcOHZR7cndxJ7/77jvF1ayn01CCvPvuu8q92NChQ5VrQ32O+5QRSBd/Y6+krAnWJgESIIGUETh48KAyEdWtYKITE/iu5K+//pIHH3zQUgygDFZgQHlhivNHBS8hY8eOTRSz4NChQ+rlRCsa0MbMmTOV+yyzPZ2G9t/84MAPXEpWHSB4oasYCfixhcJDC+JWOGNj4IXLlVJF18Eek8Vm/A9vY3r4mx/u5xdffGF1DS8kUEA5xdlfnIf7MbxomoIXjTZt2phZyicyXtJMgdIHz4v50gZl0t13320Wi7g0XIKZSjRYDkFZ5A8J9DOt+4iVNYi/AQseLbj/TqUZzuFvBWbqprgaM0y7u3btKosWLTKLqpVd5t89Tvr7b8R2QR6QAAmQAAmELQFfY6uFLQgXA8PUBCyBk9p0VU/lUEafN9M6D3tX+cnNc1VPX0ufwx7vprAq/f3339WGPEixYsXUwhxMmsINrK6r9wml+G+gCMyaeEhGfrhP8hXIJF0eKhOoy6RZuxcvXJZPB29Q129wXR55+OViadaXcLrwv//+aylAYBWgBX/Dd911l1J+YB4iWAVzDHDRZS74wsIyKA0QvF0Lvhth0aAF31tYbIhvLywq1N/gUHg4XSbXrFlTsGBTK07wDXf99dd7VHZgjgWW9zlz5lRbly5dXM6ZLFy40PZdr2N4QhHlqzhjqoKBXqQAV+p9+vRR8xKe2q1Xr55888034gz8DleFWiHjqb4+h0V8iFmaGm7F9DXDdU9Lj3C9sxwXCYQwAbwwYGLaFPg8xEps+Hh0Cn4EnTJr1ixbFlZ0uwrAlT9/fhXnAb5ytWC1Q1q+nMBlk6nwQL/wg4+XCXNVAZgkZxWDHqenvb/5wTrGVHpgNQaCN+oPTt0XWLqYgpckp8ID57HKwhS4y9IvW2Y+VvA7V6rAR2ikC0y0TXEVHwYWFU43cmadPHnyqNU7Zp67dCCeabwEYjUOnhltzYO/Dygu9Eu17g9WYZmCvy9XSh7Uw7OElTpJib//RpK6Hs+TAAmQAAmEBwE9KRMeo+EovCUAK+epU6cqy9QdO3ZY1eAWB1bIN998s2TOfNUFkVWAiVQhcPJogmurXHkzpcr1UvsiGaPSS46cUXLi+AU5evhCal8+bK9XqVIlwYYJ7VWrVikFCFw1Y6GmnrfARLh2gQU3RsEiWMwJxYWp8EBcj+rVq4vTxTC+qU2B9RksITDOH374QVmKYCErFo85Bf/3QRHQs2dPdQqLEV1Zd0DRgTKdO3dW3//OeQJnuzh2fuMld1EB4l06Y6p+/PHH6pIYJxbl6vvpqh86Dzyg4OnevbvOUi4rXS3ohTeMQoUKqW9XzG2Yi3B//vln5QoTC2HBhZJ8AlR6JJ8da5IACQSIACYuzcl9T5cZPHiwy8lu008iXi7q1q3rthmsNDDF6frHPJcaaXfB1KHx1+PKlCmTcuEUqP7o66B9f/CD8gKrNfRLFV50YIparVo12xCw6s0Ud66tdDu6LNwruRP0H5sek3PC3129cM53WgjBbZRTENDbGV/FLANrGady0jxvpgP1TGMcWIWklR64Jp4N3G9TnC/W7lxgoQ6eVW9EP08o64+/EW+uyTIkQAIkQAIkQAKhRWDSpEny66+/KusO3XMsrtKKDleLdnQ57lOPwIn/3Fvlzmuf3E29HgT+StlyZFRKD387e8E7Mb6nsXhIb5gkR1rvzTTydL5z7yznqj1nHX3sqi7OaYGVFTa4qNWb81jnw/uAdq+LPb6V9DEsFZDG3txQ15VgIhwbvpuwsOrDDz90VSzV87788kvl4UJfuEGDBvLwww+rQ6fCwRmvAgtHtWCyHhwQbNx0PazPYz9q1ChL6eFsS5d74YUXlFtu3Edvxd31XC2Cc9cm+u6M+4iFdfjGxLn7778/kcID5bHwFteBgkIrSHANKLdNpQe+p81vUSgxUMZc2Im/SViVwHUWnhUIlEVQPiGQOyX5BLx/mpJ/DdYkARIgAb8TgIUD3Nq4Umbgx8ecFMePFT423Inzxc+s665OIPPdrQDED25qSCD44cUJLwZmnBWYxZpKD1wXFiCm4IPQlZgTzjj/559/uipm5ZkvV866VqEISuAly1ytghcqp/s0fAT4S1LyTONFGi+TUGxAIYkA9siDq7Zy5cpJbGysrZs451R6oI4pzvPmOaSdVlXO84H4G3Feg8ckQAIkQAIkQAKhSQCWHFrZoS2M4ZMe77VY8Y2NElwEThxNeO/NbQT8Dq4eprw3Fy8meLbPkdO/04BY4Q/B+zE2imsC0dHRQRPrY8WKFcotle4pJuIRC1MrHBDH1BRTeYR8M24FXGQ99NBDsnTpUqsK2jMVErCkwMJDfIMi4Ds2uBQ3BYoGeIaA1T0s4JyKF7OsToOpKVhkCdHjMM+5S8MrhLngFi4G4R4b8r///U9M6xGMC0HfzW9bWMtgrknPIa1evdp2KXzHmgLlFziYgrFiXgvu2OHaG9/p+KYtWLCgWYzpZBDw7/92yegAq5AACZBAcgggJoErhQfacppjQrMOH4zeCtxGpZXgh9SXH+lA9DNQ/ODiylR6wDeo6VYMP+7my1GzZs3EXEVijhUxGkzx5f7iBSLSBX6jTXHec/NcStPJfaaxWgqWXFiF5Erwd22umnFVRuft2bNHJ9U+X758tmPngTPYnvO8k1co/R/jHAuPSYAESIAESIAE/ENg7ty5An/4mADTVrSYQMMEHhQdcFdLCU4Cp+Iuq44hpke4CuJ6QLLFu7nyp9x5550pbg7W23BdCxdv2HuTRllMeusNnhB0GpP0Oo2FXFDGaKsOfYxvDaSdG/KTUx714uLi1N8+/v5NxYEvFvIphplEA1BSaIsOXfTTTz+VIkWK6ENBGVPguguumPBdB9GKLqSdsRCxOBWT91ho+MADD6CIEnzrY7Ifcx2ffPKJwP246f4ahVAHCgfERIESBNYnnqR48eK205hv0IJ7+Msvv6jFc/gWROwRKFtMgfuoMWPGWFmwwhs+fLhSuOD7DmlTYKmDxZRoG+OAMgfzG1rhgbJ16tQxq9gUKlh4Z/bRVjD+AMoPxKHERvEPASo9/MORrZAACfiRgKtA5vAVCZNHLZgIvffee10qCJwrEXQdb/d4yUor0asT0ur6uG6g+GFs8GmqTTbxcoBVFdqs3+naCv483UlK+kh/yQnBMk22pm9pnY9VNk4F4H333adPe71PzjONjwQosqZPn+71dTwV1BMPuow3K4d0WVf7lDx/aC8t/49xNR7mkQAJkAAJkAAJJI8AFtNAyYFNv+NWqVJF4KIVE2wlS5ZMXsOslSYE8oSx0uPShQRLj5x5/Kv0eOedd5QbIFhhOwM4O28ilBuwEtCKDexxDIVFKAomxjHpj4Da2OvFdfj+gcITW/369YNmaIjjgbgd5sIxWGng/yxYYiCGKqxAYG1gypNPPqkOEXMDlhFHjhwxT1tpKDygRMDkPhQcONZMDh06ZJWDQgrtwAUyvjlNV8UoBAUJYkIi7gUWuyal/NANm14i8H8yYohqQTuIBamVz7BMwbW1QKGDOSat2Bk2bJg+Ze2hJMEGQTlzwaYu5JzDML1MYN7D6WZa1+M+MASo9AgMV7ZKAiTgZwKI2QAfh/qHBRPmcIWEH0OnuArK7NTqO+uYx9769Dfr+Cud1Apzf13HUzuB5IdYCvqDEH2Aiyv8+MPFGNwAmOLpnqGOuaICL0TevixjlUqki7mSByzw8gbTXP2ShzyssHGKu5c7ZznzODnPNHyfOhUeepUknk8orrCaCm6r8P+AaU5tXlunsQrIfJnG6iUnA13Wm30g/0a8uT7LkAAJkAAJkAAJpD0BuD3Rq9zhvgqrmjGJ53QZmvY9ZQ+SIpAuXYJC4HTcRcmaLTynyS5eShhjvkL+VXq4+h5Pincon4dyAFZdc+bMUcoOWIpAcuXKJfjWve6665SyAxP7wSYfffRRom8suHDC5o1oa/cDBw64LA6lgY5Bgcl9KH1+/PFHVda0DtGVETQdygkEJP/2228TubzCNyE2KD2geGnSpImuqvamNQ0y4PoYgrkFWHmYgnkkKFNgRQEXVM7nFn3XSmoohUwLELMdndbzUvoYe8xf3HLLLVYWvldNSWuPHmZfIiUdnv+bR8rd4zhJIIIIYBXIE088oRQfetjQvkOT7vzxwCpuKC4Q/EkLFCb+8Ino1Mzjxw4/Zv56qTFjT+i+p/Y+kPzw4mOuuICio2/fvrJu3TrbipN27dp5XCkE01NzUhwmwzfffHNqowrZ6+kXQj0APMd4Ie3Vq5fO8ts+Oc/0uHHjbNfHCjLni6kugA+PpJQeTndeMHHWFka6HV/2gfwb8aUfLEsCJEACJEACJJB2BODXHRNxWCWNd1xK6BLInDm96nxYKz3+c2+Vv3DwTcYH+5NjKjqg8DAFSo42bdqoDZYNwSr4dnZlveBNf2HFA8sM/b3tSoEBrxzORXPm9xasSFwJ5lfAEBsWtI0ePVo++OADW1F86+F7v0WLFgLFjV6oB8sVU7Q1PeJuQFniFCg7ihYtaimr9XnMFSFwuZYZM2bopNqjT4gtCX6mlYxZCFYw/fv3t8UicSpGnHNJZn2mA0Mg4X/2wLTNVkmABEjArwTwQ6d/4NAwfnCck6P6ghUrVtRJtYc/RmfAclsBHw4w4W4KfDmGmwSKH1bAtG3b1sIFc89///1XfHFthcp6BYluCC9G8KFK8Y4ArBz0ykRdA75V9+7dqw/TdI8PC1OcZsLmOeezY57TaafSw93/G7q8M2aMzjf3gfobMa/BNAmQAAmQAAmQQHATwOIdKjyC+x5507tMWTKoYqfiLT3CVS7+596qQDH/WnqEKy9MWMNaAO6fEGvylVdeURYeGG/p0qXlkUceUZ4Kvv/+e7nnnnuUK6dgZTF//nwrOLenPsItFxYfmm6iUB7WC/iGx8KvM2fOWC6rdFvwuoBJf6fAzZUWuMxCLAxPgm+2fv36KRdb2qWWWX727Nly1113WS6YnQtPodjBNnDgQLOalcZCuo4dO1reQ3ACi/5w/0wxPQRg7gcKbizAg0UKLELw/z7awTOANv/++2+lFHIuxnVaerizkDGvzbR/CVDp4V+ebI0ESCCABOAj1LkS/d1331XBx5yXNc0KcQ7uexC8Cj/SKZUKFSrYmkAQrqR+wG0VQuAgkPycE9h4MUFQcy1QbOHFyZPgxdNUgCE2CFwKmL5CPdXnOVH+UU0O8LcKk1y8TKa1OGNmuPMb+80336iAd0n1F7FkTJkyZYp6mTbzdBovs+5W8Ogy2Afyb8S8DtMkQAIkQAIkQAIkQAKBJRCVKZ26wOm4S4G9UBq1fubUJbl0+Yrkjo/nkSsPHb54ug2wNoBVA6wK4P4X7pi1YOL/448/Vm6YEA8iLd1i6z4ltcd3T9euXW3FYLkBqxSM8eWXX1YLSTHRD+sIjA+Bzc24jHALpcXVxD2UDK6sGExLD9TfsGGDbkb+/PNPQWDwDz/8UI4dO2blIwH3yFAsIIA6vH2YAm8eULBgQavT5TCCoGPzJKb1BRTWsM5wivktaLrQglID38tQyGDRJZ4BKEPcWfg4lR54tiipS4D/26Uub16NBEgghQQQ5Py9996zWsEP0tixY5XG38qMT8A8ESvZYYqo5YsvvlDKDyhOYIYOd1eYXIWFAFa4b9myRa699lqlydd1XO3hpxcvD1qwauH6669Xk+6IHQCfvvgxhdkn/F5iFYD2D4kfPtMVD9zsmBIbG6tWEOg8mGjWrVtXH7rd48f/5MmTic47f2hPnDhha19XaNiwoS2AeSD5aYWFfuGAD1GdRn+gFEn0Kpo4AABAAElEQVQqPgdeLAYNGqReOPQY4FcZk9uwCEL/8TKXLVs2OX36tLoXuL958uRR53WdSN5jJQ0URVitogX3AcHKsboHL/GwZsALLwKBI9i5eZ90nUA801WrVrXFfnn00Ufltddek0qVKinFJdyhTZs2TfA37ZSRI0cKlGAYHwIHQllarVo19VJvKnTwd/n666+rMvibxd8rFHCwePFGAvk34s31WYYESCA4COA9RH+s4/8bp2UZfH1v3rxZdRZBPbXrheDoPXtBAiRAAiQAApks91YJ8RnCjcqRQ+fUkKo3yCnpE4xawm2IfhkPFlTBosMULHiEWycoPJyLH81ywZjGd9GAAQNsXcO3HhQdrpQUZkF8H2lBkHa4kkIdp/cMzK04vTDoevhmh6WE9owxa9YswXceBHEZMYeB7euvv5YhQ4ao7zWzXwg6DsUTLDGgiMK3GgQxQvHtn1SsTswHQEwlhsqI/wffh5hXcuWK2Rw7PFMguHutWrV0Va/3psIElRCT9OjRo0qp43UjLJgiAuniH9iEaEYpaoaVSYAESCD5BDDZiMlJLVBsYDLSncBi4/PPP7dO48d08eLFiSbKMQnRuHFjlxO1VmVHok+fPvLMM884cu2HsBaBksPVj6e9ZMLRiBEjLJdOWBmBQFy+CFZWYLLek2CFgalM8VTW1Tn4vWzZsqXtVKD44SJ40UKwMlcCRRVMSJMS/Hx1795doHTyVjCR7wyY7m3dcCyHly6snvGFoeYA5dJbb70lgXimoZzAC7k3AqsgKEFgqeIUBKDTf2/Lly9PZJ3hLK+P8X+K2R5898KM3SmB/BtxXovHJEACwUkAPqx/+OEH1Tn834HfYtO9AVb16cCb+KB3uhYMzlGxVyRAAiQQWQR++XKvTPkpVoqVipFOXUuE3eD/mH5AVi49Iv3fLSfla2QNu/H5Y0A33HCD6LgT+PaGFQQ20zWzP66TWm3g+wXfyqZ4M9eB8vBi4VRkYL4FLpIhn332mVqACM8LsA7B+487GTVqlDz33HPqdOvWra15nKeffjpRsHC4w8I3Jq4Dt9hQgGDRHWJxwI2Y+X02dOhQ9W2Hbz0zX/cDVibfffed+laFyy5TsKgPC2fdxXyFtQve2bSgLZTHgkpfBPNFznmNZcuWJbJQ8aVNlvWNAN1b+caLpUmABIKAwP3332/rBX7kMLnpFPxQYjUBzCa9FW98+WOVJnw3eisIepUSSQ3dtKtrBIofWGCVvSvBC5OpAHNVRufBpyisRGD66q3o1bbelg/3cjAdxoomT0rGQDBw9byZ18EHBpSf3gj8vpquztzVgcUUYvskJc2bN/daORLIv5Gk+snzJEACwUcA7yMzZ85027Gk/u9zW5EnSIAESIAEAkogZ94o1f7u7afk/Dl7cOSAXjiVGt+9LSH2IRUe7oHDIgHfH1jIAEsCBK0OVYUHRonvZFNefPHFJBd36vLnziVYBulj7LFYTgtcSGEBIwJ+e1J4oPwdd9yhFqIi3b59e+yUYNGmU2BVgQWuvXv3VsqPLl26KM8EsMhwKjby5cunFpm8+uqrzmbUXAPiscD9VfXq1WXChAnKsgMKCChg0G93Cg801qNHD9u44EXg4YcftjFIdNH/MmDhi5ilcJmMxYFmzCcswHS65HLXDvP9Q4BKD/9wZCskQAIpIOB0ZZSU6wdo/hHAyhTnj7o+B5NG+IlETA+sCE9qctTbYNhwgwUzT/xYJ9UmLFlCVQLFr06dOsr9lJMLXopcmZg6y+ljPCvwqQlLBShStAmrPu9q78pFk6tykZKHFTR4wZ8zZ47ce++9Urt2bY9DxwoclHPGtPBYKRknYVoOX6mmP1mzGfw94wUW/U3qb1DXQ5+nTp2q3KDpPL3HdbCyCCt79Comfc7TPlB/I56uyXMkQALBS0BbfQRvD9kzEiABEiABJ4FqdbNbWVv/Tewy2DoZgonY/Wfl8KHzUqhY5hDsfep1Gd4ZsBAM3xi+fI+mXg99u5KOn4FvnHHjxiWKjeqpNXxbPfvss7YipssnnMBCMadLT1uF/w7wrQmLC/THXIwK99qTJ09W7biq5ykP33RwmQ1Bm4hBgoWQ77//vtrwDWl+H+J7Ee7J4VECCpWk5ptQ1xkMHRYtsNyFxYnp8QMLWnAMd12PP/64chENRQdccmF+At+0mDPCNzTcNVNSlwDdW6Uub16NBEggCAggrgX8KWIP083MmTMrTT4mOpP6AXTVffzQwUIEQbTh6xIrI9AOXgwwIYrV4OEk/ubnbzaIPwF3IoiPgjTuL/yB4v5iT0maAJ5pxKNBzBnE7IBFCFbTYG+6bUm6pZSXQF+wsgd9QXwW/G3hXpqrZBCTB+UQowdKVOyjo6M99hV/+7D8OX78uMDPvrnaB/Fx8JxnzZpVbU7FbFKjCva/kaT6z/MkQALeEzDdW+laUCLj4xZiurd6++23BasW3QmU8vh/Ln/+/O6KMJ8ESIAESCBABJ7v9q8c3HteKlXPKa06JbjxCdClUrXZlX8elj9mHJQmrXPLA88WT9Vr82JpRwDuqOCu67bbbrMpALztEeY1sBgMAccR0wSLwwIlcOcNpdPChQs9uiaHogUukLEPtODb8qOPPnLr4QOKEXw/wjrFk8DFMr6jKWlDgEqPtOHOq5IACZAACZAACZAACZAACYQ4AVPpARcPUNLCBUL//v3VyJJSemChBNw2YLUjFmRA8CENi1KsDixatKjK4z8kQAIkQAKBJfDDh7tl9sQjkj1HRun2eHmJ96QbFvLz59vkYLy1R9cnCsv17alUD4ubGsaDwMJFLCjFIjTE0MBCUiwixTsWFraltvz+++/Ss2fPZF128ODBiTyUJKshVko2gfTJrsmKJEACJEACJEACJEACJEACJEACSlEB138QuD6ApWFScuzYMeUqEKsbtcIDdWDxMX36dEFQVQRGp5AACZAACQSeQIVqMeoiJ09clO0bw8PF1dq/jymFR978UdKoRZ7AQ+QVSCCFBGAVgRifiPGIIOWVKlWSQoUKpYnCA0PBuxhivMB9lukyy9Uw4UoMliiwEFm1ahUVHq4gpXJexlS+Hi9HAiRAAiRAAiRAAiRAAiRAAmFHAHGp4E8aSovffvtNOnXq5HGMiEe2Zs0aqwwsRLJnzy4Ivgl3CWgHATexyjC1XQtanWKCBEiABCKEQLmq2ayRrll+VEpXvBrnwzoRYom18eOANGyZU7LEZAix3rO7JBAcBOB2FHFEH3roIVm3bp3s2LFDdu3apVylw8UVlB1ly5aldW5w3C5bL6j0sOHgAQmQAAmQAAmQAAmQAAmQAAn4TgABPVu1aiUzZ85U1h6elB5HjhxR/qv1VSZOnCi1atVSh926dVPBL6H4wAarj7Zt2+qi3JMACZAACQSAQJ4CUdKpRwGZ8M1B2bHllKxaekRqNAhd6wht5QFUjVrkDgAxNkkCkUUAsSXr1q2rtsgaeeiOlu6tQvfeseckQAIkQAIkQAIkQAIkQAJBROCee+5RvYErhPXr17vt2aZNm6xzUJRohQcy4b8aqwm1rF69Wie5JwESIAESCCCBDvcWkmp1E9xcIQD4qZMXA3i1wDa97u8EK49GLXJKsTJZAnsxtk4CJEACQUiASo8gvCnsEgmQAAmQAAmQAAmQAAmQQOgRuO6666Rw4cKq4z/99JPbASDAuRasGnRKzZo1rSwz3oeVyQQJkAAJkEBACHTqUUgyZUonx49dlBVLDgfkGoFudN60/XJgX0JsqYa08gg0brZPAiQQpASo9AjSG8NukQAJkAAJkAAJkAAJkAAJhBYBxN6AeyrIt99+KydPug6Ge+DAAWtgefIkdp+SK1cu6/zevXutNBMkQAIkQAKBJVCmcox07FFQXeSfJUdk87oTgb2gn1v/Z9FhWf1XgpVHx64FpGajHH6+ApsjARIggdAgQKVHaNwn9pIESIAESIAESIAESIAESCAECNx6661WLxGrw5Xky5fPyj527JiV1onjx4/rpBQoUMBKM0ECJEACJBB4Am1uLyD1r0tQFvz2y56QUXxAQbNw1kEFqE6T7NKxe6HAw+IVSIAESCBICVDpEaQ3ht0iARIgARIgARIgARIgARIIPQIFCxaUdu3aqY5/9913LgdQvHhxK3/VqlVWWifWrVunk1KiRAkrzQQJkAAJkEDqEHjk5VIhpfjYufWUQEEDKVA4WvoMLJ06oHgVEiABEghSAlR6BOmNYbdIgARIgARIgARIgARIgARCk4AOaH7q1CmXAyhXrpyVP2XKFDEDm585c0Y+++wz63zVqlWtNBMkQAIkQAKpRyBUFB9/L4yVSSN3WmBeHlHeSjNBAiRAApFKgEqPSL3zHDcJkAAJkAAJkAAJkAAJkEBACDRq1MijhUb+/PmlR48e1rU7duyoFB0Ifn7XXXfJ+vXr1TlYeWirEaswEyRAAiRAAqlGwKn4WL/iqvvBVOuEmwtdOH9ZJv6wQxbNPmSVGPBeGcmaPYN1zAQJkAAJRCqBjJE6cI6bBEiABEAAPrO3bt0qsbGxcvToUSlbtqzUrVuXcPxM4MqVKzJ58mS5dOmSYKIH/snBOn166t79jNrr5vjse40qRQX57KcIHyuTQMgSwO/bfffdJwMHDnQ7hj59+sjs2bNl586dAouQQYMGJSr7+uuvS1RUVKJ8ZpAACZAACaQeASg+5LXtsmz+CZn1617Zve1UvOurfJIrb3TqdcJxpU1r4+N3/L5f4k5eUmcKFImWlz4uJzHZOc3nQMVDEiCBCCXA/w0j9MZz2CQQyQQwCfnbb7/Jzz//rCYbTBZPPvkklR4mED+loezA5I4pefPmlVtuuUXuv/9+KVKkiHmK6QAR4LMfILAemuWz7wEOT5FAmBPo3LmzR6UHFgFMmzZNlYGLK9MVVr169eTNN9+UihUrhjklDo8ESIAEQoMAFB+lRh+Q30bHyoY1x2XPjlNS99q8Ur1enlQdQNyJi7Ll36Pyx/RY67otO+WRe/oUs46ZIAESIAESEEkXPwFyhSBIgARIIFII7NmzR/r37y/z5s1zOeS3335bunTp4vJcuGRiVemhQwkm0NHR0dK+fXvJmDHwOvA6derI4cOHXWLEStauXbtKunTpXJ5nZsoJ8NkXpeTks5/yZ4ktkAAJ+J8APsl2794tp0+fltKlSwt+nykkQAIkQALBR2D/rrMydfQhWfDbUdW5spWyS90meaVAkSwB7eyxw+dl09pjsvbvY5Z1By54x0OFpM3tBQJ6bTZOAiRAAqFIIPCzXKFIhX0mARIISwKY9MUEv7uJdwy6UKFCLseO1Zfnz5+3zmEyIiYmxjp2JuLi4uTChQsqO3PmzJIlS2Bfgp3X93T8+eefy6JFi6witWrVUhMsVkaAEpjEccf+pZdekr1798rzzz8foKtHdrN89hPuP5/9yP474OhJIJgJQOlfvHjxYO4i+0YCJEACJBBPoFDxzHL/08WlTuMcSvmxee3JeMuLk1K6fDYpWzmHlKuSXTJG+c+F7+EDZ+XfVcdk3T/H5dy5y9Y9KFk+i7S5I580vD63lccECZAACZDAVQJUelxlwRQJkEAYE0D8AlhwOCfdESC0bdu2Urt2bcHkf8GCBV1SqF+/vs3tRJkyZdSqcVeWCbhWjRo1rHYwkf/II49Yx5GaGDVqlArMumLFCvnrr79k4sSJNhSffPKJwOVVr169bPk8SBkBPvsp4+eP2nz2/UGRbZAACZAACZAACZBA8BCo1TinYJsW7/Jq7q9HZdumOLUtmx8Vr/zIHq/8yJEs649Ll67IgT1n1HZo/1nZHB+747LhnwXKjmbt8kjztnmDBwZ7QgIkQAJBSIBKjyC8KewSCZCA/wkMHz5cBQo1W27cuLFg5Xe2bNnMbJdp0882CiD4+dKlS6Vhw4aJyl+8eNGW50oxYisQIQcIxAplELZu3bpJhw4d5IEHHrCN/o033pDWrVtLyZIlbfk8SD4BPvvJZ+evmnz2/UWS7ZAACZAACZAACZBAcBG46c6C0qpzAfl74TFZ/sdx+fuPE/L34iNqK146RnLmiZbceaMkb4HMaovOnF4unL/833Ylfn9JTp+6KAd2n5F98RsUHhcvGlqO/4ZLZUdw3Xf2hgRIIPgJUOkR/PeIPSQBEkghgfXr18vXX39tawXWHZgMzpQpky3fl4ORI0e6VHr40kYkl23VqpWMGTNGevToYbOigeIDyihKygnw2U85w0C0wGc/EFTZJgmQAAmQAAmQAAmkDYGo6HTKzRRcTe3ffU6WLzgma5bFyYaVp2TXtlPJ7lT2HBmkQo0YqVo/Oy07kk2RFUmABCKVgP8cDUYqQY6bBEgg6An89NNPtj7CpdUHH3yQIoUHGoR7ptjYWFvbPPCNQIMGDWTo0KG2SjNmzFDBXG2ZPEgWAT77ycKWKpX47KcKZl6EBEiABEiABEiABFKVQKFimaRtl4Ly3LCyMvjbitL7pRLS7p78UrNhdsmVJ0OSfalYM0Y6dM0vz75TWt4fV1UefbUUFR5JUmMBEiABEkhMgJYeiZkwhwRIIIwInDt3TsaOHWsbUc+ePSVjRv/89zdu3Dh58MEHbe3zwDcCcGeFWB5mvJVff/2VcVB8w5ioNJ/9REiCLoPPftDdEnaIBEiABEiABEiABPxGoEDRTIKtXrNcVptHYy9I7L5zEp0pvUTFb3B3lTl+i86cIT4vnVWOCRIgARIggZQRoKVHyvixNgmQQJATWLZsmc11ErrbqVMnv/X6q6++kkuXLvmlvTNnzsiaNWuUBcncuXNl7969cuVKYn+u3lwsLi5OxRyBUgZt7dy505tqHssgVsmmTZtk2rRpMnXqVNmwYYOcP3/eYx1vTiLewX333WcrOnnyZNsxD3wnwGefz77vTw1rkAAJkAAJkAAJkAAJBJJA7nxRUr56NilZIasUKZlZ8hWMlmw5M1LhEUjobJsESCAiCfhnqXNEouOgSYAEQoHAunXrbN1EAO2cOXPa8nw9KF++vJr8R719+/bJwoUL5brrrvO1Gav8P//8I/379xfEX3BKTEyM3HHHHfL888/HrwDK7Dyd6HjVqlXy1FNPWf0zC2BV+bBhw8wsr9JQdAwYMEApUVxVaNasmbz55ptSrFgxV6e9ysMY33nnHasslD8XLlwQKEQoySPAZ/8qNz77V1kwRQIkkJjAlClTBLG+KCRAAiRAAiRAAiRAAiRAAuFBgJYe4XEfOQoSIAE3BDB5bkqjRo3Mw2Sl0Ua1atWsuj/88IOV9iVx+fJl+d///qcsT1wpPNDWqVOnVBD2du3ayebNmz02P2nSJGnfvr1LhQcqIlZGv379PLZhnoSVCYK1I+jy0qVLzVO29Lx586RJkyYyYcIEW74vBwULFhQok0xJarxmWaYTE+Czf5UJn/2rLJgiARKwE3j33Xeld+/esnHjRvsJHpEACZAACZAACZAACZAACYQsASo9QvbWseMkQALeEHBOYhQoUMCbah7LpEuXTrp3726VmT59unJFZWV4mUCsEVhIeCOwtoA1xNmzZ10WX7t2rTz22GMuz5mZvgQJh4spWHh4K0888YRs27bN2+KJyhUtWtSWt2PHDtsxD3wjwGffzovPvp0Hj0gg0glAYd+wYUN5//33JU+ePFKhQoVIR8LxkwAJkAAJkAAJkAAJkEDYEKDSI2xuJQdCAiTgisCxY8ds2fnz57cdJ/cAbjDgekrLmDFjdNKrPZQXgwcPTlQWbq5Gjx4tn3zyiTRv3tx2HoG+f/zxR1uePhgxYoROWvu3335bFi9eLH/99Zeqp61TvInvgVgdQ4YMsdpCAsHGkQdlCDakTQYog2smVwoXLmyrevLkSdsxD3wjwGefz75vTwxLk0BkEBg1apTceuutAneX+/fvV4OuVatWZAyeoyQBEiABEiABEiABEiCBCCFApUeE3GgOkwQilcCJEydsQ/eHpQcaxGR/ly5drLa//fZbQaBvbwXKCygxTIF7qIcffljgPuvmm2+WL7/8Um655RaziIp7AZdXpsC6whn4G26p0L8iRYoIFD1wPzVx4kRp3LixWdVtGpNCpnIErqdmz54td955p1SvXl1tSGOlLJQhWhDkHFYpyRGn0sM5zuS0Gcl1+Ozz2Y/k559jJwEnAfzuwlXkc889pxYD6PP58uVTbiT1MfckQAIkQAIkQAIkQAIkQAKhT4BKj9C/hxwBCZCAGwKISeGcOM+aNaub0r5nY9JfCxQYUAp4K3PnzrUVhbus2rVr2/IyZsyoApybmRjP6tWrzSxZsGCB7RiKjWuvvdaWhwO0h4Do3sisWbNsxWDBkStXLlseDqBQgXWKKcmNxeG0wqGlh0nVtzSffTsvPvt2HjwigUgioJUd+K3C72fu3Lltw3/66adtxzwgARIgARIgARIgARIgARIIfQJUeoT+PeQISIAE3BBA7I1ASsWKFaVevXrWJXwJaO6Mt4B4Ha4ElilwpWXKnj17zEPZt2+f7dhdWyhUs2ZNW1l3B1u3brVOlSlTRurWrWsdOxPXX3+9LWvXrl22Y28PnJYyGTJk8LYqyzkI8Nl3AIk/5LOfmAlzSCBcCRw9elS++uorZdmhlR34LbvmmmsE5yCZMmWSYsWKJbKoDFcmHBcJkAAJkAAJkAAJkAAJRBKBjJE0WI6VBEgg8gjADZVp7XH8+HHJmTOn30DAQgMxMyBw9bR9+3bJnj27x/Yxue9UVJQuXdptHQRXnTJlinXeqVTYvXu3dQ4JTOx4ksqVK8v69evdFkH/TNdWZ86ckV9//dVteVgVmGLWNfOTSmvf6rpctmzZdJL7ZBDgs58YGp/9xEyYQwLhRGDDhg0yfvx4tenflBIlSsi9996rfp91XKwOHTrIpEmT5K677lLKj3BiwLGQAAmQAAmQAAmQAAmQAAnEezshBBIgARIIZwKIN2EqPQ4ePOhXpceNN96o4nvoayAIec+ePT0i1RMxZiFnQHDznNPtk1Pp4bT8gH9yT+J07eEs6+wfFDR9+vRxFnN7rFfRui3g5sSBAwdsZ6j0sOHw+YDPfmJkfPYTM2EOCYQDgT/++MNSdly+fFkNCTGt7rnnHhUra8CAAYLfZ8iHH34ogwYNUm6uENCcQgIkQAIkQAIkQAIkQAIkEH4E6N4q/O4pR0QCJGAQcE5yHjp0yDib8iTcY8DaQwsCmp89e1YfutynT+/bf71OSwqn6yLn9ZznXXbCQ2ZUVJSHs0mfypIlS9KFXJTYu3evLddVDBFbAR54JMBn3yMelyf57LvEwkwSCFoCsLDs1auXsuT45ZdfBAoPWDs++eSTykIRCvtnn33WUniMHDlSWTJCuX/77bdL4cKFg3Zs7BgJkAAJkAAJkAAJkAAJkEDyCdDSI/nsWJMESCAECFStWlVWrlxp9dRpTWCdSEECAc1HjBihWoDFx7Rp0zy2hjgdTkHQbndusZx9hqsOU4oXLy5r1qyxsuDCCytckyuu+teqVSuvm/M2doKzQV/ddDnr89hOgM++nYc3R3z2vaHEMiSQ9gSWLFkiX3/9tfz2229WZ5o2bSodO3ZUW3R0tMp/7LHHlBsrHPz0009SrVo1QYwPLD6glYeFjgkSIAESIAESIAESIAESCDsCVHqE3S3lgEiABEwC8OFvyu+//y6dO3c2s1KcLlWqlDRr1kzF9EBjsPbwJBkzZhQoLszYF5s3b5batWu7rLZu3TpbPpQcpiAQqylwd+Uct3k+qTQsRaC4MJVFb775phQsWDCpqsk+v2XLFhsPNORU7iS78Qit6HwG+Own/SDw2U+aEUuQQFoSQAwtuKeaO3eu1Q0sPMDvOoKUm9K7d28rHhZcWzVq1Eg+//xz9Vtzxx13SKVKlcziTJMACZAACZAACZAACZAACYQRAd98rITRwDkUEiCByCBQvXp120ARENwZs8JWIJkHCJKqxVRmIM/pngp5zmDjcLnhSqDAmDlzpu2UU8nhPB43bpytvPNg27ZtzqxExxUrVrTlDR8+3OU4bIVScKCDy+omGjdurFbi6mPufSfAZz8xMz77iZkwhwRCgQB+I9q1a6esM6DwQMwnuLBCLI8hQ4YkUng8+OCDlsJj7NixSuEBV5CjRo1Sw6WVRyjcdfaRBEiABEiABEiABEiABJJPgEqP5LNjTRIggRAgAIsFBHQ2RQczNfNSmm7RokWi63hq86abbrKdHjNmjG3lKk5igubll1+2lcNYnJPZ9erVs5WBYmfFihW2PH2wYMECQWDypOSWW26xFYFbkDfeeEPOnDljy/fHAVyCoX1T2rdvbx4ynQwCfPbt0Pjs23nwiARChcDixYuVS6rVq1dL+fLllZID6b59+7q0CHzggQdk+vTpanjjx4+X+vXrqzR++2FVeeONNyolSKiMn/0kARIgARIgARIgARIgARLwnUCGV+PF92qsQQIkQAKhQQDuahAvY+nSpVaHN27cKN26dRNfgha/9957Vn1MJkPJYQr8g0NJgckZp1x77bXWpIs+B7caEyZMEMTf0IJjKABiY2MFLjxef/11WbRokT6t9gMHDpRatWrZ8hCHYNWqVWKuYsdqVihI4Nf8/PnzAvdRcLsFX+ZO6dGjhziDXsOFFpQja9eutYr//fffyoc62jtx4oTExcXJ4cOH1XWXLVumVtWCg9PyxGrATQIKH9MvO4q98847ktyA6G4uE3HZfPb57EfcQ88BhyUB7dIR7qqwEABxOfD/myvp3r27zJ49W52aOHGi5TYSAc4HDBgghw4dkn79+kmFChVcVWceCZAACZAACZAACZAACZBAmBBIF+925UqYjIXDIAESIAGXBOAiCu6STOnQoYN88MEHbidOzLJIlyxZ0sqCwgQKCafs3bs3kYsNlHn++eflkUcecRZXSgJM4ngriHExZ84cQUwQpyxfvlyc1hnOMvoYyhAoK7TAVUjp0qX1obU/duyY4gZFjLfSp08feeaZZ7wtLuvXr5c2bdrYyt99993y1ltv2fJ4kDwCfPbt3Pjs23nwiATCiQDcTMLdFWTy5Mk2q0hYE+K3GMoOxDeikAAJkAAJkAAJkAAJkAAJhDcBurcK7/vL0ZEACcQTKFq0qDz99NM2FpMmTZInnnhCWSzYTqTgoEiRIspthrdNtG3bVt59912vijdo0EBgEeFK4YEG6tatK4i7kZQ0b97ca+VIrly5ZNasWQIFkbdiWpskVWf+/PnKP7tZLiYmJtG9Ms8z7RsBPvtXefHZv8qCKRIINwJdunSxFB5Tp061KTwwVu3WEr+7FBIgARIgARIgARIgARIggfAnQKVH+N9jjpAESCCeQK9evQRuqUyB6wtMhA4bNkz++ecfgaXGxYsXzSIu057cLpkBzXXlrFmz6mSiPYKpwhUH+oEJf6fAugMKG6xSLVSokPO07RiWHpjsccb4QCG0AwuKjz/+WKCc8VYKFy4sH374obp+06ZNXfbRbAsur9wJ3IzBnzpijsDneteuXZU7L7P84MGDfYqNYtZl2jUBPvt89l0/GcwlgfAgcPvtt1uuJeEqsWrVqraBIa4HfuMhVHrY0PCABEiABEiABEiABEiABMKWAN1bhe2t5cBIgAScBOCu6bbbbpNNmzY5T1nHX3/9daJ4HdbJACfgbRCKF2yIN4KAra4UId50A8obKBgQM6RUqVJSsGBBqxqUD4jJAWUMtkyZMlnnvEmg7s6dO1UbuE7mzJmVogLKFE8KIViMrFy50u0l4DIMrsMo/ifAZz+BKZ99/z9bbJEE0pJA586dBfGmIHBb5SpWB6xAEG8LCo8RI0akZXd5bRIgARIgARIgARIgARIggVQikNgxfCpdmJchARIggdQmAHdNv/zyiwwaNMhydeHsA4J3p5UgMCvcEWFLqcANFoKlu5Ls2bMLtuRKjhw5VCBZX+vv3r3bZRXEWYCFR+vWrV2eZ2bKCfDZT2DIZz/lzxJbIIFgIdC+fXtZtWqV6g4sJsuWLZuoa9OmTbOsQGBZSSEBEiABEiABEiABEiABEogMAnRvFRn3maMkARL4j0DOnDllyJAhMm7cOLnzzjsTWVLs37+frAJA4Pz587bg6bhEtWrV5MUXXxQEUqfCIwDQHU3y2XcASaVDPvupBJqXiSgCN910k6XwwG+IK4UHgOhYHq1atZKWLVtGFCMOlgRIgARIgARIgARIgAQimQDdW0Xy3efYSYAEVAwPuJM6fPiwnD59WllZwB0Uxf8EsBI3OjpaucIqUKAAY3f4H7FPLcI1GZ99n5AluzCf/WSjY0USSEQASvINGzao/Pnz50vJkiUTlUEGlCHdu3dX57766isqPVxSYiYJkAAJkAAJkAAJkAAJhCcBKj3C875yVCRAAiRAAiRAAiRAAiQQVgRatGghW7ZsUWNauHChFCtWzO34evfuLVOmTBFYeXz55Zduy/EECZAACZAACZAACZAACZBA+BFgTI/wu6ccEQmQAAmQAAmQAAmQAAmEFYFmzZrJ9u3b1ZgQmLxIkSJuxwfFCBQekK5du7otxxMkQAIkQAIkQAIkQAIkQALhSYBKj/C8rxwVCZAACZAACZAACZAACYQFgSZNmsju3bvVWJYuXSoFCxb0OK5vvvlGne/YsaM0b97cY1meJAESIAESIAESIAESIAESCD8CdG8VfveUIyIBEiABEiABEiABEiCBsCDQqFEj2bdvnxrL8uXLJV++fEmOS8f5GDdunNStWzfJ8ixAAiRAAiRAAiRAAiRAAiQQXgRo6RFe95OjIQESIAESIAESIAESIIGwIFCvXj05dOiQGss///wjefLk8Wpcbdu2lQoVKlDh4RUtFiIBEiABEiABEiABEiCB8CNAS4/wu6ccEQmQAAmQAAmQAAmQAAmENIHatWvLkSNH1BhWrlwpuXLlCunxsPMkQAIkQAIkQAIkQAIkQAKpR4CWHqnHmlciARIgARIgARIgARIgARJIgkC1atXk5MmTqtSaNWske/bsSdTgaRIgARIgARIgARIgARIgARK4SoBKj6ssmCIBEiABEiABEiABEiABEkhDApUrV5bTp0+rHqxbt05iYmLSsDe8NAmQAAmQAAmQAAmQAAmQQCgSoNIjFO8a+0wCJEACJEACJEACJEACYUagfPnycv78eTWqDRs2SObMmcNshBwOCZAACZAACZAACZAACZBAahCg0iM1KPMaJEACJEACJEACJEACJEACbgmUKVNGLl26pM5v3rxZoqKi3JblCRIgARIgARIgARIgARIgARLwRIBKD090eI4ESIAESIAESIAESIAESCBgBK5cuSKlS5cW7CFbtmyRjBn5iRIw4GyYBEiABEiABEiABEiABCKAAL8oIuAmc4gkQAIkQAIkQAIkQAIkEGwELl++LOXKlbMUHtu3b5d06dIFWzfZHxIgARIgARIgARIgARIggRAjkD7E+svukgAJkAAJkAAJkAAJkAAJhDiBixcvCmJ4wKVV+vTpZdu2bVR4hPg9ZfdJgARIgARIgARIgARIIFgIUOkRLHeC/SABEiABEiABEiABEiCBCCAAhUflypUF+wwZMsimTZuU4iMChs4hkgAJkAAJkAAJkAAJkAAJpAIBKj1SATIvQQIkQAIkQAIkQAIkQAIkIHLhwgWpWrWqnD9/XsXu2LBhA2N48MEgARIgARIgARIgARIgARLwKwEqPfyKk42RAAmQAAmQAAmQAAmQAAm4InDu3DmpUaOGnD17VqKiomTdunVq76os80iABEiABEiABEiABEiABEgguQSo9EguOdYjARIgARIgARIgARIgARLwigAUHXXq1JHTp09LdHS0rF69WjJlyuRVXRYiARIgARIgARIgARIgARIgAV8IUOnhCy2WJQESIAESIAESIAESIAES8InAmTNnpF69ehIXFyeZM2eWFStWSJYsWXxqg4VJgARIgARIgARIgARIgARIwFsCVHp4S4rlSIAESIAESIAESIAESIAEfCJw6tQpadiwoZw8eVIpOpYvXy4xMTE+tcHCJEACJEACJEACJEACJEACJOALASo9fKHFsiRAAiRAAiRAAiRAAiRAAl4RgMKjSZMmcvz4ccmaNassXbpUsmXL5lVdFiIBEiABEiABEiABEiABEiCB5BKg0iO55FiPBEiABEiABEiABEiABEjAJQG4smratKkcPXpUWXYsXrxYcuTI4bIsM0mABEiABEiABEiABEiABEjAnwSo9PAnTbZFAiRAAiRAAiRAAiRAAhFO4MSJE9KsWTM5fPiwsuxYsGCB5MqVK8KpcPgkQAIkQAKRRgCK/5IlS0rFihUjbegcLwmQAAmkOQEqPdL8FrADJEACJEACJEACJEACJBAeBODKqmXLlhIb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gNUGrDngvqpXr15K6EAlP/74o7Lw0FYgoRY8dMfnz58v1atX16dC4cNGwQMSIAESIAESSJYARY9k8fAmCZAACYSMAEWPkKFlxSRAAiRAAiRAAiRAAiSQOgIQPsaOHSs9evRQBSF01KtXT4kdEEAghiBo+SeffCIIfB6uNGnSpESBWCl8hIs82yEBEiABEnAjgfPnz6tu072VG58e+0wCJOAFAhQ9vPAUOQYSIAESIAESIAESIAFPEXj55ZeV+KGDiWvrjhYtWsiMGTOkZcuWYR/v6NGjpWPHjna7FD5sFDwgARIgARIggUQELly4oM5p6ZEIC09IgARIIGwEMoetJTZEAiRAAiRAAiRAAiRAAiQQMAG4uYLAgTgesABB0vuAKwlyxiFDhsjll18un3/+uaoZwgfSE088ofb8QwIkQAIkQAIkIELRg68CEiABEogsAYoekeXP1kmABEiABEiABEiABEggWQIlSpRI9n64b7766quSL18+GTRokGqawke4nwDbIwESIAESiHYCFD2i/QmxfyRAAl4nQPdWXn/CHB8JkAAJkAAJkAAJkAAJBJlAnz59ZMCAAXatdHVlo+ABCZAACZAACdiWHozpwRcDCZAACUSGAEWPyHBnqyRAAiRAAiRAAiRAAiTgagL33HOPvPfee/YYKHzYKHhAAiRAAiQQ4wRo6RHjLwAOnwRIIOIEKHpE/BGwAyRAAiRAAiRAAiRAAiTgTgIdOnQQBDjXicKHJsE9CZAACZBALBOg6BHLT59jJwESiAYCFD2i4SmwDyRAAiRAAiRAAiRAAiTgUgKNGjWSyZMn272n8GGj4AEJkAAJkECMEjh//rwaOd1bxegLgMMmARKIOAGKHhF/BOwACZAACZAACZAACZAACbibQLVq1eSXX36xB0Hhw0bBAxIgARIggRgkQEuPGHzoHDIJkEBUEaDoEVWPg50hARIgARIgARIgARIgAXcSKFWqlKxZs8buPIUPGwUPSIAESIAEYowARY8Ye+AcLgmQQNQRoOgRdY+EHSIBEiABEiABEiABEiABdxLInTu3bNu2TS677DI1AAof7nyO7DUJkAAJkED6CGjRg+6t0seRpUmABEggrQQoeqSVHMuRAAmQAAmQAAmQAAmQAAn4JLBu3TopXry4ukfhwyciXiQBEiABEvAwAcb08PDD5dBIgARcQYCihyseEztJAiRAAiRAAiRAAiRAAu4isHDhQqlatarqNIUPdz079pYESIAESCB9BLSlR3x8fPoqYmkSIAESIIE0EaDokSZsLEQCJEACJEACJEACJEACJJASgalTp0r9+vVVNgofKdHifRIgARIgAa8Q0G6t9N4r4+I4SIAESMAtBCh6uOVJsZ8kQAIkQAIkQAIkQAIk4EICX331ldx8882q5xQ+XPgA2WUSIAESIIFUE6B7q1QjYwESIAESCCoBih5BxcnKSIAESIAESIAESIAESIAEnATef/996datm7pM4cNJh+ckQAIkQAJeI0D3Vl57ohwPCZCA2whQ9HDbE2N/SYAESIAESIAESIAESMCFBF577TXp3bu36jmFDxc+QHaZBEiABEggYAJa9KB7q4CRMSMJkAAJBJUARY+g4mRlJEACJEACJEACJEACJEAC/gg89dRT8uKLL6rbFD78UeJ1EiABEiABtxPQokdcXJzbh8L+kwAJkIArCVD0cOVjY6dJgARIgARIgARIgARIwJ0EevbsKQMHDlSdp/DhzmfIXpMACZAACSRPQMf0oOiRPCfeJQESIG9pDswAAEAASURBVIFQEaDoESqyrJcESIAESIAESIAESIAESMAngc6dO8tnn32m7lH48ImIF0mABEiABFxMQFt60L2Vix8iu04CJOBqAhQ9XP342HkSIAESIAESIAESIAEScCeBpk2bypQpU1TnKXy48xmy1yRAAiRAAr4JaNGDlh6++fAqCZAACYSaAEWPUBNm/SRAAiRAAiRAAiRAAiRAAj4JXHPNNbJgwQJ1j8KHT0S8SAIkQAIk4EICFD1c+NDYZRIgAU8RoOjhqcfJwZAACZAACZAACZAACZCAuwiUKFFCli5dKqVKlRIIH6+//rq7BsDekgAJkAAJkICDgBY96N7KAYanJEACJBAmAhQ9wgSazZAACZAACZAACZAACZAACfgmUKhQIeXqqn79+vLJJ5/IM8884zsjr5IACZAACZCACwho0YPurVzwsNhFEiABTxKg6OHJx8pBkQAJkAAJkAAJkAAJkIC7COTNm1dGjBghLVq0kDFjxsjDDz8s586dc9cg2FsSIAESIAESsAhQ9ODLgARIgAQiS4CiR2T5s3USIAESIAESIAESIAESIIFLBLJnzy4ff/yxtGnTRqZOnSo9e/aUw4cPkw8JkAAJkAAJuIrA+fPnVX/p3spVj42dJQES8BABih4eepgcCgmQAAmQAAmQAAmQAAm4nUDGjBll2LBh0rJlS5k3b54SPrZv3x7QsCCU3H777QHlZSYSIAESIAESCBUBWnqEiizrJQESIIHACFD0CIwTc5EACZAACZAACZAACZAACYSRAGJ7wNXV8uXLlfCxbt26FFvfsGGD/Pbbb/Ldd9+lmJcZSIAESIAESCBUBLToQUuPUBFmvSRAAiSQPAGKHsnz4V0SIAESIAESIAESIAESIIEIEfj000+lWbNm8tdffynhY8mSJcn25O6771b3v//++2Tz8SYJkAAJkAAJhJKAFj0YyDyUlFk3CZAACfgnQNHDPxveIQESIAESIAESIAESIAESiDCBkSNHSuPGjWXXrl1K+Pjpp5/89uiKK64QCB/z58+XuXPn+s3HGyRAAiRAAiQQSgI6pgdFj1BSZt0kQAIk4J8ARQ//bHiHBEiABEiABEiABEiABEggCgiMGjVKGjZsKMeOHVPCx+TJk/32qlOnTurehAkT/ObhDRIgARIgARIIJQFt6UH3VqGkzLpJgARIwD8Bih7+2fAOCZAACZAACZAACZAACZBAlBD44osvpF69eoIJpN69e8vXX3/ts2c1atSQ9u3bC4SRFStW+MzDiyRAAiRAAiQQSgJa7IiPjw9lM6ybBEiABEjADwGKHn7A8DIJkAAJkAAJkAAJkAAJkEB0EYDQceONN6pOPffcc4Jg575S586d1eVx48b5us1rJEACJEACJBBSAtq9lRY/QtoYKycBEiABEkhCgKJHEiS8QAIkQAIkQAIkQAIkQAIkEK0ExowZI7Vr11bde/3112XgwIFJuooYIPXr1/drDZKkAC+QAAmQAAmQQBAJ0L1VEGGyKhIgARJIAwGKHmmAxiIkQAIkQAIkQAIkQAIkQAKRIwALjuuvv151YMiQITJgwIAknenYsaO6NmjQoCT3eIEESIAESIAEQklAix50bxVKyqybBEiABPwToOjhnw3vkAAJkAAJkAAJkAAJkAAJRCkBBCpH/A6kESNGSL9+/RL1FKJHuXLllLXHvn37Et3jCQmQAAmQAAmEkoAWPejeKpSUWTcJkAAJ+CdA0cM/G94hARIgARIgARIgARIgARKIYgITJ06UatWqqR6OHTtWHn74Ybu3WbJkEQgf+/fvp5srmwoPSIAESIAEwkGAMT3CQZltkAAJkIB/AhQ9/LPhHRIgARIgARIgARIgARIggSgnMHnyZLn22mtVL6dOnSp333233WOIHjlz5qS1h02EByRAAiRAAuEgoC096N4qHLTZBgmQAAkkJUDRIykTXiEBEiABEiABEiABEiABEogCAhAx5s+fn2JPfvjhB9vV1bx586RTp06qTKlSpWjtkSI9ZiABEiABEgg2AS160L1VsMmyPhIgARIIjABFj8A4MRcJkAAJkAAJkAAJkAAJkECYCYwePVq6desmXbp0SdFFFVxd1apVS/Vw+fLl0qJFC3WsA5p//fXXsnfv3jCPgM2RAAmQAAnEIgGKHrH41DlmEiCBaCKQ6RUrRVOH2BcSIAESIAESIAESIAESIAESAAHE6zh79qzMmjVL5syZozZcv/rqqyVDhgw4TJRuvfVWWbx4sezcuVMOHTok48ePlxdeeEFWr14ta9eulezZs0u9evUSleEJCZAACZAACQSbQOHChVVMqaxZsyrhPtj1sz4SIAESIIHkCWSw/AvGJ5+Fd0mABEiABEiABEiABEiABEggcgQWLVoko0aNkmnTpqlOVKlSRW677Ta1IWaHM91///0yc+ZMdTlv3rzSr18/JX7kzp1bEAPkyiuvdBbhOQmQAAmQAAkEncCJEyckV65cQa+XFZIACZAACSRPgJYeyfPhXRIgARIgARIgARIgARIggQgTKFGihLRr104FLD958qQsWbJE5s6dK9OnT5fTp09LuXLlJEeOHHYv27dvL9u3b5f169crSxHE+ahcubLs2rVLMmbMKI0bN7bz8oAESIAESIAEQkUAlh5MJEACJEAC4SdAS4/wM2eLJEACJEACJEACJEACJEAC6SAAV1eI0TF79mxVS7FixQSurTp37iwIXq7Tiy++KIgLYqZMmTIpa4+qVaual3lMAiRAAiRAAiRAAiRAAiTgEQK09PDIg+QwSIAESIAESIAESIAESCBWCMA9VYcOHWzLj5UrVwpcYI0bN04FK8+XL58ULVpUmjZtKufPn5elS5faaODdFwFmdaBz+wYPSIAESIAESIAESIAESIAEPEGAlh6eeIwcBAmQAAmQAAmQAAmQAAnELoHly5eroOUTJ05U7q5AAu6wYPkB4ePNN9+Ujz76KBGgb775RurWrZvoGk9IgARIgARIgARIgARIgATcT4Cih/ufIUdAAiRAAiRAAiRAAiRAAiRwiQBcX40dO1Z+/PFHdaVmzZrKKuT3338XiCI6wb3V1KlT9Sn3JEACJEACJEACJEACJEACHiFA0cMjD5LDIAESIAESIAESIAESIAES+JfA4sWL5fvvv1dCB4KdFypUSHLmzClbt261M3Xv3l1effVV+5wHJEACJEACJEACJEACJEAC7idA0cP9z5AjIAESIAESIAESIAESIAES8EPgyJEj8vnnnyvxwxQ8dPY+ffrIE088oU+5JwESIAESIAESIAESIAEScDmBjC7vP7tPAiRAAiRAAiRAAiRAAiRAAn4JIKg5RI158+bJiBEjpEGDBony+hJCEmXgCQmQAAmQAAmQAAmQAAmQgKsI0NLDVY+LnSUBEiABEiABEiABEiABEkgvgd27d8t//vMfOXDggPz999/prY7lSYAESIAESIAESIAESIAEoogARY8oehjsCgmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQNoJ0L1V2tmxJAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQBQRoOgRRQ+DXSEBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEkg7AYoeaWfHkiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAlFEgKJHFD0MdoUESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCDtBCh6pJ0dS5IACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACUQRAYoeUfQw2BUSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIG0E6DokXZ2LEkCJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBBFBDJHUV/YFRIgARIgARIgARIgARIgARJwNYELFy7Ixo0b1RiyZs0q5cqV8zueixcvyoYNG9T9XLlyScmSJf3m5Q0SIAESIAESIAESIAESIIHACGSIt1JgWZmLBEiABEiABEiABEiABEiABEggOQIQPZo3by5///23yjZv3jwpU6aMzyIzZsyQBx54QN3r1KmTDBo0yGc+XiQBEiABEiABEiABEiABEgicAN1bBc6KOUmABEiABEiABEiABEiABEggWQKZM2eWfv362Xk+/PBD+9g8iIuLk8GDB9uXHnvsMfuYByRAAiRAAiRAAiRAAiRAAmknQNEj7exYkgRIgARIgARIgARIgARIgASSEGjZsqVUqVJFXR87dqzs3LkzSZ6ff/5Z1q9fr6537dpVypYtmyQPL5AACZAACZAACZAACZAACaSeAEWP1DNjCRIgARIgARIgARIgARIgARLwSyBjxoyJrD0++eSTRHnhYXjIkCH2td69e9vHvg7OnDkje/fuFViHpDadPn1ald2zZ4+cPHkytcWZnwRIgARIgARIgARIgARcR4Cih+seGTtMAiRAAiRAAiRAAiRAAiQQ7QSaNGkiNWrUUN0cNWqUEh50n3/55RdZuXKlOr333nulePHi+pa9R2yQoUOHCuqpVKmS1K5dW1mDdO7cWVasWGHncx4cOXJERowYIe3bt5fSpUtL5cqVVdk6derIVVddpa599dVXzmI8JwESIAESIAESIAESIAHPEKDo4ZlHyYGQAAmQAAmQAAmQAAmQAAlEC4EMGTIksvb49NNP7a6ZVh4PPfSQfV0fnDhxQm677TZ599137YDo+t6yZcukY8eOMm7cOH3J3qMcXGUNGDDAFlXsm8ZBvnz5jDMekgAJkAAJkAAJkAAJkIC3CGT21nA4GhIgARIgARIgARIgARIgARKIDgJ169YVbAsXLpThw4fLgw8+KJs3bxYIF0gQPAoXLpyksxBIdJ7LLrtMlcufP7/88ccfMn78eJX/lVdekRYtWsjll19ul0dgdB0nBBdvueUWZemRO3dugcstuMmCJUjVqlXtMjwgARIgARIgARIgARIgAa8RyGD5k4332qA4HhIgARIgARIgARIgARIgARKIBgLLly+XTp06qa48/PDDSriACIIEN1UQM8wEUaJ69er2pSVLliQSRkaPHi0vvviiuo99z5497bxwfaXFEgRQh0srJhIgARIgARIgARIgARKINQJ0bxVrT5zjJQESIAESIAESIAESIAESCBuBmjVrStOmTVV7H374obL6wEnfvn2TCB64vnHjRuxU6tKlSyLBAxfvuOMOgfUH0pYtW9Re/8maNas+lO+++y7JffsmD0iABEiABEiABEiABEjAwwTo3srDD5dDIwESiE0CMOCDH/FoTtrIMNr7Gc0M2TcSIAESIAH3EHjqqafkp59+sjsM0QIBzH2lHTt22JfxOandWdkXrYPs2bPLyZMnk8T7aN26tS2qwNIDW9GiRaVBgwbSuHFjadSokeTKlcusisckQAIkQAIkQAIkQAIk4DkCFD0890g5IBIggVgngAkSLSqYLPwJDOkRSQJpx1ce9Ev3R9/X52afU3Os6zHr9lU+0Hy+yvIaCZAACZAACaSFwNVXXy1t27aVqVOnquKPP/645MmTx2dV+/fvt69D8PAleugMED7MdNddd0mWLFnknXfekUOHDqlbe/bsUUHPdeDz559/Xnr16mV/DpvleUwCJEACJEACJEACJEACXiBA0cMLT5FjIAESIIFkCKRXTEim6jRPmOg+aQFC73Vb+r4+D+Y+0Lp1nwLNH8w+si4SIAESIAHvEahfv74teiQXawOWGTrhuFChQvo0yd6M/YGbCFbetWtXQWyPpUuXyoIFC+TXX3+VlStX2mXfeOMNyZcvn9x66632NR6QAAmQAAmQAAmQAAmQgJcIUPTw0tPkWEiABEjAIoDJ+kAm6vWkPvb6GOWcZfU9wHXeCwQ4yut6dV1676wzpfp1OZ1Pnzv7ges6j/Neas+DWVdq22Z+EiABEiCB2CNQtmxZe9Bt2rSRl156yT4P9ACxPerVq6e2fv36ydGjR2Xo0KEyfPhwVcX06dMpegQKk/lIgARIgARIgARIgARcR4Cih+seGTtMAiRAAskTSMtkf1xcnC1MmLX7ExXMPCkd++uPeR3HgbRllkkpP8WKlJ4M75MACZAACUQjgfLly6tA5XBdNWLECKlbt67cdNNN6erq5ZdfLjfffLMtehw5ciRd9YW68NlT8bJ0+SIZ+v5ggWuwypUry5VXXqm2/Pnzh7p51k8CJEACKRLYt2+frF69Wm2IlZQzZ0713q33BQsWlCJFivh1ZZhiA8xAAiRAAiSQLgIUPdKFj4VJgARIwD0E/IkEcIWBBEHBn/hgig3JjRhtYNN1mnn9iRD++mWWNY9Tm98sm5rjQMecmjqZlwRIgARIgARSIoAg57DueOaZZ1TW++67T4keLVu2lLx580q2bNkEcT/27t0rjz32WKLqhgwZIufOnZPixYvbeU+dOiWbNm2SL7/80s4LISGa0oXzIufPxsuFCyJxFxOsVjdt3CGLFi1Sm9nXJg1bSpt2reTm9q0lR44c5i0ekwAJkEBICfz5558yadIkmTNnjvz1118BtQURBOKH3uC2EMfY586dW9WRnMvDgBphJhIgARIggSQEMliTR/FJrvICCZAACZCAZwgk9zavJ/b95dH3A4Gh68DeFD30dV2HWad5z7yu82Jv5jGvp3Tsrz6znFl3IPnNsjwmARIgARIggdQQ+Prrr+W5555TRSZPnizVqlXzWxwWmE8++aR89913fvPgBibgzIl/TJwhcHly6YorrpCZM2dKgQIFkssWknvWsOSfI/Hyz9E4OXksXs6dtcSOc/GycfNK+X3VPPnnxFE5cfKotT8mp06fkD83Lvfbj8IFi0uTxi2lrSWANGxc228+3iABEiCB9BL46aefZOLEiUrwSG9d/spv27bN3y1eJwESIAESSAMBWnqkARqLkAAJkIBbCJiT+s4+m5P8ODbzmvec5VI691XW1zWzvZTqNO+bfXUem/lSc6z74qufqamHeUmABEiABEggGASweGDQoEEqIPnbb7+dKBC5WT/cq5QpU0Zdunjxohw/fty8negYFiRdunSR7t27h13wOLQ3To4egNgRL3Fx8bJv/05Zs36RrF630BI75ss/ltDhTLkvu1wqXFlNzl84J//8c1iOHT8sFy5aJiGX0r4Du2TM+JFqu65aHalbr47kL5BHucPiqmlNiXsSIIH0EIDQASu5pUuXpqeaFMv26dNHWbUhplPhwoVTzM8MJEACJEACKROgpUfKjJiDBEiABFxLQE/mYwC+JvT1fb1HHl/5ggVAt+OvP77aMcvgPs51P817aem3v1gmvvrBayRAAt4loN9XvDtCjsztBPB5BXdWiMUBQQRurgoVKiSZMyddw3bw4EE5fPiwnD9/XiCE5MmTR/Lly6fcqJiWmOFgcu5MvOzZGifLl6yTRctnyo7dG2XLtnWyZ1/CiuZclrBRpHApKV6kjBQtXEaKFCojxYqUtq6Vkdy58ibp4pGjB2TfgR2WaGJtB3bKfhxb25o/FyfKO3bsWKHwkQgJT0iABFJJ4L333pP//e9/iUrBdWD16tWlVKlSUqJECbVlz549UR59AlEa79vYO4/hhtBf+vDDD6Vt27b+bvM6CZAACZBAgAQoegQIitlIgARIwC0ETCHA7LNTFND5sNcTflpMMMsF61i3p+vT/dHX9Tnu62s6r7lHPud9s6yZ19exWTY15XzVxWskQALeIID3Bb4feONZchTRQ2DTnwdl4oQZsnDxLFm+cq7dsRrXNJSrKtWS6lXrSfkr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8bnXbj1XYZvN2FWuxtnIKHQbNQChH4yzlMeaCQvcR33pvHKZW9h7wX2vKD93jG452ut4NF/H5bZx3ai5+blea58qR1kgX6+1LCzOpJ6295nF6SdOHZXPmARIoLQIXHvttfL1118HBtWvXz/BE8NLL710ID8s4SrnUY7Dz99++23ZbLPN6lWvrq4O5HHtSOAABxiL8Bo0aJAceuihMmTIEPnuu++SvF555RV55plnZI899kjm8YIESECEa1jDvwu4hjX8PeAISIAE8k+gRf5FUiIJkAAJkAAJJM4piKPYh1LXr9fU+S1evDjpfqgpKYz0XiJGwNxymV9YW5XtvkfcPPca7f10rmNy+83mGuPBK2xurjyt5+ZFXbt108mNksF8EiCBxkng448/lrvuuisweOzugCulOAaPQEMncf/99zspXmZKAMaPp556StZcc81A0wsvvDCwqyZQyAQJNEMCXMNK86ZzDSvN+8JRkQAJZEaARo/MeLE2CZAACZBADAKqhEWMEKWIhbFD66aqZ4U0kX90RwGexlcFfBSfxjRl915jPjq/TOeQion2obEr230fab6+v5AOkxvWRtvmGuciW9siThVQrgZDnV+q+iwjARJoegQefPDBwKTg0ur666+X1q1bB/IzTUBh//PPP2fajPUdAnAndu+99zo5Yl2QvfTSS4E8JkigORPgGla6d59rWOneG46MBEggHgEaPeJxYi0SIAESIIEYBFQJixhK2PLy8noGD5RpPYgMq6d1EDeFoPPVHR5qEMDcm0Jw7xPmpvPL19yUH2Lty2Xn5vt9ho3Flaf1w+ppWSZx2FgwVv+lMrW+G6NM62s9N3bHr+N2ebh1eU0CJNB0CSxcuFAeffTRwAQPP/xwqajIjwfjxx9/PCCbicwJ4HDg3XbbLdDwiSeeCKSZIIHmSoBrWOnfea5hpX+POEISIIFoAvn5izhaPktIgARIgASaAQFfYQtFrBtQrkHrplLqhtVFXmNS7OIJfHDQ3QYYuyqodX5NJc7kvuh7IU4brav3Hmlt55ehjuZpnVTvQ62jshE3VHDnpWNwx4c8nZvW9eem7RiTAAk0HwLvvPNOPVdJOEw7X+HOO++Uww47zD7AkKtMnAWCc0c+/fRTu56ttdZasvrqq2dloFm0aJH897//tbLatWsnq666qqy77rrJ74dsxoq19dtvv7Vy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buYMET9A0QjDCuJ0AU9au66krrrqKtl3333rNcNP4OHDhyfPKqlXISQDBqGnn346pCQ8CwYp3ItZs2YlK8DYgbNXcG4AAwmQgJTsGgZD6jHHHBP7FsE134QJE0I/2++99574uzOiBPtrGHaYVFZW1qv+v//9T7D2x1kXtfFxxx0np59+uibTxlzD0iJiBRIggRInQPdWJX6DODwSIAESIAESIAESIAESIAESCCOw6qqr2h0ObhkU8yeeeKJ92tfNz+UaZ2vsuOOOsUXgaeKnnnpK/IPIwwSgDvzchxk8UB+uqPBkdDpZKI+r0INB6JZbbpGTTz45bEihedjpETd8+eWXMnTo0IDBA21hUKLBIy5F1msOBEp1Ddt1113lmmuuiXULNt10U4ELrKjPdp8+fQTnbqQLAwYMiG0cWXbZZeXVV1+1htV0crXc3W2ieVEx17AoMswnARJoTARo9GhMd4tjJQESIAESIAESIAESIAESIAGHwBFHHCHYheAGGBygQBs1apRMnTrVupuqrq52q4Ret23bNjQfme6B5loJrqKiAty84IyNAw44IPRMEDzRvM8++wjcTEEpmCr06tXLumfZbbfdAudxoA2MIvDBjwPTM3E/hbmedNJJdrfHnnvumdaogr6inqpeuHChfPXVVwKf/P/85z8F54bALZYb4LoL7sAYSIAEggRKdQ3be++9BYd4Yy11zwHS0WN3B9zq4UyNlVdeWbNDY+z0eP7558U/4wOVIWfIkCGCc45gYI4bYOjFeUnof6uttgodoysLLq+iAtewKDLMJwESaMwE6N6qMd89jp0ESIAESIAESIAESIAESKDZE4Crk7///e/23IwoGDhDwz+vI6puIfJ//fXXpF977OqA0SObANdU33zzjfVp36lTJ3s+hrrygmEHrrigoIRBpk2bNrHdfGEsOLsErrngtx/XaL/MMstYRSTiqAA3WjfccENUsX0aG096Rz0JHtmQBSTQTAiU+hqGdQdrC144a2jNNddMa2SIunVYp7BzDGeGYC1caaWVklXhUgpncmD9wqt169bJsjgXaIuziBCjH6xhWGthTEll1OYaFocu65AACTQ2AnQm2tjuGMdLAiRAAiRAAiRAAiRAAiRAAg4BuDp57LHH7KHZDz/8sFNSd4mDbxsy4IBzvHINMHDgyWi8/ACjQli+Xy8qDQVhjx497CuqTlg+FKFRAeee4El2GjyiCDGfBERKfQ3DugNXXHjlGrAW4LD0sNC+fXvBK9vQoUMHWX/99TNuzjUsY2RsQAIk0AgI0L1VI7hJHCIJkAAJkAAJkAAJkAAJkAAJpCKAnQhXXnmlPR9jv/32q/cU8vfff5+qOctyIIDdIW6A2xkc8I7D2RHT4OHS4TUJhBPgGhbOpRi5XMOKQZl9kAAJFJsA3VsVmzj7IwESIAESIAESIAESIAESIIECE1BXT7/88ovMnz/fPqEMVyoM+SeAc1PgqgY7WeByC0YPdbmV/94okQSaBwGuYcW7z1zDiseaPZEACRSPAI0exWPNnkiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABApIgO6tCgiXokmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABIpHgEaP4rFmTyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAgUkQKNHAeFSNAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQPEI0OhRPNbsiQRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIoIAEaPQoIFyKJgESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESKB4BGj2Kx5o9kQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJFJAAjR4FhEvRJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACxSNAo0fxWLMnEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBAhKg0aOAcCmaBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEigeARo9Cgea/ZEAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRQQAI0ehQQLkWTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkUjwCNHsVjzZ5IgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQKSIBGjwLCpWgSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHiEaDRo3is2RMJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEABCdDoUUC4FE0CJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJFA8AjR6FI81eyIBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiggARo9CgiXokmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABIpHgEaP4rFmTyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAgUkQKNHAeFSNAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQPEI0OhRPNbsiQRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIoIAEaPQoIFyKJgESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESKB4BGj2Kx5o9kQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJFJAAjR4FhEvRJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACxSNAo0fxWLMnEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBAhKg0aOAcCmaBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEigeARo9Cgea/ZEAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRQQAI0ehQQLkWTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkUjwCNHsVjzZ5IgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQKSIBGjwLCpWgSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHiEaDRo3is2RMJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEABCdDoUUC4FE0CJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJFA8AjR6FI81eyIBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiggARo9CgiXokmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABIpHgEaP4rFmTyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAgUkQKNHAeFSNAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQPEI0OhRPNbsiQRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIoIAEaPQoIFyKJgESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESKB4BGj2Kx5o9kQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJFJAAjR4FhEvRJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACxSNAo0fxWLMnEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBAhKg0aOAcCmaBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEigeARo9Cgea/ZEAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRQQAI0ehQQLkWTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkUjwCNHsVjzZ5IgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQKSIBGjwLCpWgSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHiEaDRo3is2RMJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEABCdDoUUC4FE0CJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJFA8AjR6FI81eyIBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiggARo9CgiXokmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABIpHgEaP4rFmTyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAgUkQKNHAeFSNAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQPEI0OhRPNbsiQRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIoIAEaPQoIFyKJgESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESKB4BGj2Kx5o9kQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJFJAAjR4FhEvRJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACxSNAo0fxWLMnEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBAhKg0aOAcCmaBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEigeARo9Cgea/ZEAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRQQAL/D2QsXoszqvK7AAAAAElFTkSuQmCC" } }, @@ -39,35 +30,71 @@ "\n", "We'll focus on ideas from one paper, `Corrective RAG (CRAG)` [here](https://arxiv.org/pdf/2401.15884.pdf).\n", "\n", - "![Screenshot 2024-02-07 at 1.21.51 PM.png](attachment:9db7f9db-55aa-48cb-95d5-bcde3f937589.png)\n", + "![Screenshot 2024-02-07 at 1.21.51 PM.png](attachment:a65940f9-5c51-4d7c-9ca1-ae576e4bb51a.png)\n", "\n", - "## Dependencies\n", + "## Setup\n", "\n", - "Set `MISTRAL_API_KEY` and set up Subscription to activate it.\n", + "### Using APIs \n", "\n", - "Set `TAVILY_API_KEY` to enable web search [here](https://app.tavily.com/sign-in).\n", + "* Set `MISTRAL_API_KEY` and set up Subscription to activate it.\n", + "* Set `TAVILY_API_KEY` to enable web search [here](https://app.tavily.com/sign-in).\n", "\n", - "If you want to run this locally, use [Ollama](https://ollama.ai/library/mistral/tags):\n", + "### Using CoLab \n", "\n", - "* Download [Ollama app](https://ollama.ai/)\n", - "* Download Mistral e.g., `ollama pull mistral:7b-instruct`\n", + "* [Here](https://colab.research.google.com/drive/1U5OcwWjoXZSud30q4XOk1UlIJNjaD3kX?usp=sharing) is a link to a CoLab for this notebook. \n", "\n", - "Optionally, use [LangSmith](https://docs.smith.langchain.com/) for tracing (shown at bottom)." + "### Running Locally \n", + "\n", + "If you want to run this locally (e.g., on your laptop), use [Ollama](https://ollama.ai/library/mistral/tags):\n", + "\n", + "* Download [Ollama app](https://ollama.ai/).\n", + "* Download a `Mistral` model e.g., `ollama pull mistral:7b-instruct`, from various Mistral versions [here](https://ollama.ai/library/mistral) and Mixtral versions [here](https://ollama.ai/library/mixtral) available.\n", + "* Download LLaMA2 `ollama pull llama2:latest` to use Ollama embeddings.\n", + "* Set flags indicating we will run locally and the Mistral model downloaded:\n", + " \n", + "```\n", + "run_local = \"Yes\"\n", + "local_llm = \"mistral:7b-instruct\"\n", + "```\n", + "\n", + "### Tracing \n", + "\n", + "* Optionally, use [LangSmith](https://docs.smith.langchain.com/) for tracing (shown at bottom) by setting: \n", + "\n", + "```\n", + "export LANGCHAIN_TRACING_V2=true\n", + "export LANGCHAIN_ENDPOINT=https://api.smith.langchain.com\n", + "export LANGCHAIN_API_KEY=\n", + "```" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 13, "id": "abc064ab-7de1-4d03-a987-cd3078438d61", "metadata": {}, "outputs": [], "source": [ + "# Check API keys\n", "import os\n", "\n", "mistral_api_key = os.environ.get(\"MISTRAL_API_KEY\")\n", "tavily_api_key = os.environ.get(\"TAVILY_API_KEY\")" ] }, + { + "cell_type": "code", + "execution_count": 12, + "id": "9f644869-436e-4bf6-a267-b2465c7b5aef", + "metadata": {}, + "outputs": [], + "source": [ + "# Flags for running locally\n", + "\n", + "run_local = \"No\"\n", + "local_llm = \"mistral:instruct\"" + ] + }, { "cell_type": "markdown", "id": "6e2b6eed-3b3f-44b5-a34a-4ade1e94caf0", @@ -75,14 +102,18 @@ "source": [ "## Indexing\n", "\n", - "First, let's index a popular blog post on agents using [Mistral embeddings](https://python.langchain.com/docs/integrations/text_embedding/mistralai).\n", + "First, let's index a popular blog post on agents. \n", + "\n", + "We can use [Mistral embeddings](https://python.langchain.com/docs/integrations/text_embedding/mistralai).\n", + "\n", + "For local, we can use [GPT4All](https://python.langchain.com/docs/integrations/text_embedding/gpt4all), which is a CPU optimized SBERT model [here](https://docs.gpt4all.io/gpt4all_python_embedding.html).\n", "\n", "We'll use a local vectorstore, [Chroma](https://python.langchain.com/docs/integrations/vectorstores/chroma)." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "254ae533-79e0-42f4-b200-1ec9160e1d3d", "metadata": {}, "outputs": [], @@ -91,6 +122,7 @@ "from langchain_community.document_loaders import WebBaseLoader\n", "from langchain_community.vectorstores import Chroma\n", "from langchain_mistralai import MistralAIEmbeddings\n", + "from langchain_community.embeddings import GPT4AllEmbeddings\n", "\n", "# Load\n", "url = \"https://lilianweng.github.io/posts/2023-06-23-agent/\"\n", @@ -104,7 +136,12 @@ "all_splits = text_splitter.split_documents(docs)\n", "\n", "# Embed and index\n", - "embedding = MistralAIEmbeddings(mistral_api_key=mistral_api_key)\n", + "if run_local == \"Yes\":\n", + " embedding = GPT4AllEmbeddings()\n", + "else:\n", + " embedding = MistralAIEmbeddings(mistral_api_key=mistral_api_key)\n", + "\n", + "# Index\n", "vectorstore = Chroma.from_documents(\n", " documents=all_splits,\n", " collection_name=\"rag-chroma\",\n", @@ -150,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 14, "id": "10028794-2fbc-43f9-aa4c-7fe3abd69c1e", "metadata": {}, "outputs": [], @@ -187,7 +224,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 15, "id": "447d1333-082d-479a-a6fa-0ac0df78bb9d", "metadata": {}, "outputs": [], @@ -197,14 +234,13 @@ "from typing import Annotated, Sequence, TypedDict\n", "\n", "from langchain import hub\n", - "from langchain.output_parsers import PydanticOutputParser\n", + "from langchain_core.output_parsers import JsonOutputParser\n", "from langchain.prompts import PromptTemplate\n", "from langchain.schema import Document\n", "from langchain_community.chat_models import ChatOllama\n", "from langchain_community.tools.tavily_search import TavilySearchResults\n", "from langchain_community.vectorstores import Chroma\n", "from langchain_core.output_parsers import StrOutputParser\n", - "from langchain_core.pydantic_v1 import BaseModel, Field\n", "from langchain_core.runnables import RunnablePassthrough\n", "from langchain_mistralai.chat_models import ChatMistralAI\n", "\n", @@ -250,7 +286,7 @@ "\n", " # LLM\n", " if local == \"Yes\":\n", - " llm = ChatOllama(model=\"mistral:7b-instruct\", temperature=0)\n", + " llm = ChatOllama(model=local_llm, temperature=0)\n", " else:\n", " llm = ChatMistralAI(\n", " model=\"mistral-medium\", temperature=0, mistral_api_key=mistral_api_key\n", @@ -289,25 +325,12 @@ "\n", " # LLM\n", " if local == \"Yes\":\n", - " llm = ChatOllama(model=\"mistral:7b-instruct\", format=\"json\", temperature=0)\n", + " llm = ChatOllama(model=local_llm, format=\"json\", temperature=0)\n", " else:\n", " llm = ChatMistralAI(\n", " mistral_api_key=mistral_api_key, temperature=0, model=\"mistral-medium\"\n", " )\n", "\n", - " # Data model\n", - " class grade(BaseModel):\n", - " \"\"\"Binary score for relevance check.\"\"\"\n", - "\n", - " score: str = Field(description=\"Relevance score 'yes' or 'no'\")\n", - "\n", - " # Set up a parser + inject instructions into the prompt template.\n", - " parser = PydanticOutputParser(pydantic_object=grade)\n", - "\n", - " from langchain_core.output_parsers import JsonOutputParser\n", - "\n", - " parser = JsonOutputParser(pydantic_object=grade)\n", - "\n", " prompt = PromptTemplate(\n", " template=\"\"\"You are a grader assessing relevance of a retrieved document to a user question. \\n \n", " Here is the retrieved document: \\n\\n {context} \\n\\n\n", @@ -315,12 +338,11 @@ " If the document contains keywords related to the user question, grade it as relevant. \\n\n", " It does not need to be a stringent test. The goal is to filter out erroneous retrievals. \\n\n", " Give a binary score 'yes' or 'no' score to indicate whether the document is relevant to the question. \\n\n", - " Provide the binary scor as a JSON with no premable or explaination and use these instructons to format the output: {format_instructions}\"\"\",\n", - " input_variables=[\"query\"],\n", - " partial_variables={\"format_instructions\": parser.get_format_instructions()},\n", + " Provide the binary score as a JSON with a single key 'score' and no premable or explaination.\"\"\",\n", + " input_variables=[\"question\",\"context\"],\n", " )\n", "\n", - " chain = prompt | llm | parser\n", + " chain = prompt | llm | JsonOutputParser()\n", "\n", " # Score\n", " filtered_docs = []\n", @@ -330,7 +352,6 @@ " {\n", " \"question\": question,\n", " \"context\": d.page_content,\n", - " \"format_instructions\": parser.get_format_instructions(),\n", " }\n", " )\n", " grade = score[\"score\"]\n", @@ -377,14 +398,14 @@ " \\n ------- \\n\n", " {question} \n", " \\n ------- \\n\n", - " Formulate an improved question: \"\"\",\n", + " Provide an improved question without any premable, only respond with the updated question: \"\"\",\n", " input_variables=[\"question\"],\n", " )\n", "\n", " # Grader\n", " # LLM\n", " if local == \"Yes\":\n", - " llm = ChatOllama(model=\"mistral:7b-instruct\", temperature=0)\n", + " llm = ChatOllama(model=local_llm, temperature=0)\n", " else:\n", " llm = ChatMistralAI(\n", " mistral_api_key=mistral_api_key, temperature=0, model=\"mistral-medium\"\n", @@ -468,7 +489,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 16, "id": "0a63776c-f9cd-46ce-b8cf-95c066dc5b06", "metadata": {}, "outputs": [], @@ -512,12 +533,14 @@ "source": [ "## Run\n", "\n", - "`Mistral API -` " + "`Mistral API -` \n", + "\n", + "Trace for below run: https://smith.langchain.com/public/0a5cbc97-a2f6-4697-856c-90a6302fd13e/r" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "id": "3ab1d8df-a74e-4b48-a30b-e39bbfd5925a", "metadata": {}, "outputs": [ @@ -548,14 +571,13 @@ "'\\n---\\n'\n", "\"Node '__end__':\"\n", "'\\n---\\n'\n", - "('Episodic memory stores specific events or experiences, making them unique to '\n", - " 'each individual. Semantic memory, on the other hand, involves general '\n", - " 'knowledge and facts that are not tied to personal experiences. Procedural '\n", - " 'memory is responsible for learning and remembering sequences of actions, '\n", - " \"such as riding a bike. These memory types contribute to an agent's learning \"\n", - " 'and decision-making processes by allowing it to recall past experiences '\n", - " '(episodic), understand and use information (semantic), and perform tasks '\n", - " '(procedural).')\n" + "('In agent-based systems, episodic memory can be likened to a long-term memory '\n", + " \"module that records agents' experiences in natural language, with retrieval \"\n", + " 'based on relevance, recency, and importance. Semantic memory is similar to '\n", + " 'an external vector store that provides agents with the ability to retain and '\n", + " 'recall information over extended periods. Procedural memory can be seen as '\n", + " 'the reflection mechanism that synthesizes memories into higher-level '\n", + " \"inferences, guiding the agent's future behavior.\")\n" ] } ], @@ -564,7 +586,7 @@ "inputs = {\n", " \"keys\": {\n", " \"question\": \"Explain how the different types of agent memory work?\",\n", - " \"local\": \"No\",\n", + " \"local\": run_local,\n", " }\n", "}\n", "for output in app.stream(inputs):\n", @@ -584,12 +606,14 @@ "id": "03ee2be9-2368-46ea-9edd-dc064a7c7c96", "metadata": {}, "source": [ - "`Locall (Ollama) -` " + "`Local (Ollama) -` \n", + "\n", + "Trace for blow run: https://smith.langchain.com/public/3b23a1d4-720a-4b26-8f34-70d2f20f8832/r" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 11, "id": "16ea2032-59c7-433d-aca4-2828a1239074", "metadata": {}, "outputs": [ @@ -601,34 +625,45 @@ "\"Node 'retrieve':\"\n", "'\\n---\\n'\n", "---CHECK RELEVANCE---\n", - "---GRADE: DOCUMENT NOT RELEVANT---\n", - "---GRADE: DOCUMENT NOT RELEVANT---\n", + "---GRADE: DOCUMENT RELEVANT---\n", + "---GRADE: DOCUMENT RELEVANT---\n", "---GRADE: DOCUMENT RELEVANT---\n", "---GRADE: DOCUMENT RELEVANT---\n", "\"Node 'grade_documents':\"\n", "'\\n---\\n'\n", "---DECIDE TO GENERATE---\n", - "---DECISION: TRANSFORM QUERY and RUN WEB SEARCH---\n", - "---TRANSFORM QUERY---\n", - "\"Node 'transform_query':\"\n", - "'\\n---\\n'\n", - "---WEB SEARCH---\n", - "\"Node 'web_search':\"\n", - "'\\n---\\n'\n", + "---DECISION: GENERATE---\n", "---GENERATE---\n", "\"Node 'generate':\"\n", "'\\n---\\n'\n", "\"Node '__end__':\"\n", "'\\n---\\n'\n", - "('There are three types of agent memory in artificial intelligence systems: '\n", - " 'sensory memory, short-term memory, and long-term memory. Sensory memory is '\n", - " 'the learning embedding representations for raw inputs such as text, image or '\n", - " 'other modalities. Short-term memory is in-context learning that is short and '\n", - " 'finite, restricted by the finite context window length of Transformer. '\n", - " 'Long-term memory is an external vector store that the agent can attend to at '\n", - " 'query time, accessible via fast retrieval. The external memory can alleviate '\n", - " 'the restriction of finite attention span by using approximate nearest '\n", - " 'neighbors (ANN) algorithms such as maximum inner product search (MIPS).')\n" + "(' In an LLM (large language model)-powered autonomous agent system, LLM '\n", + " 'functions as the agent’s brain, complemented by several key components: '\n", + " 'planning and memory.\\n'\n", + " '\\n'\n", + " 'Planning involves breaking down large tasks into smaller subgoals for '\n", + " 'efficient handling of complex tasks and self-criticism and refinement to '\n", + " 'improve results.\\n'\n", + " '\\n'\n", + " 'Memory includes short-term memory, which utilizes in-context learning, and '\n", + " 'long-term memory, providing the agent with the capability to retain and '\n", + " 'recall information over extended periods using an external vector store and '\n", + " 'fast retrieval. The agent also learns to call external APIs for missing '\n", + " 'information.\\n'\n", + " '\\n'\n", + " 'Types of Memory:\\n'\n", + " '1. Sensory Memory: retains impressions of sensory information for a few '\n", + " 'seconds.\\n'\n", + " '2. Short-Term Memory (STM) or Working Memory: stores information needed for '\n", + " 'complex cognitive tasks and lasts for 20-30 seconds.\\n'\n", + " '3. Long-Term Memory (LTM): stores information for a remarkably long time, '\n", + " 'with two subtypes: explicit/declarative memory and implicit/procedural '\n", + " 'memory.\\n'\n", + " '\\n'\n", + " 'The agent uses LLM as its core controller, which can be extended beyond '\n", + " 'generating well-written copies, stories, essays, and programs to a powerful '\n", + " 'general problem solver.')\n" ] } ], @@ -637,7 +672,7 @@ "inputs = {\n", " \"keys\": {\n", " \"question\": \"Explain how the different types of agent memory work?\",\n", - " \"local\": \"Yes\",\n", + " \"local\": run_local,\n", " }\n", "}\n", "for output in app.stream(inputs):\n", @@ -653,20 +688,12 @@ ] }, { - "cell_type": "markdown", - "id": "0931b76a-3ea8-4f2f-9d27-242d48ec3fe3", + "cell_type": "code", + "execution_count": null, + "id": "deb28175-27a1-4afc-9747-2983e87fc881", "metadata": {}, - "source": [ - "## LangSmith Traces\n", - "\n", - "`Mistral API -` \n", - "\n", - "https://smith.langchain.com/public/1c9ce3f2-76bb-4514-a107-076823e9849e/r\n", - "\n", - "`Locall (Ollama) -` \n", - "\n", - "https://smith.langchain.com/public/6b626f5e-248d-4d52-b36b-5cc3bf0b95d3/r" - ] + "outputs": [], + "source": [] } ], "metadata": { diff --git a/examples/rewoo/img/rewoo-paper-workflow.png b/examples/rewoo/img/rewoo-paper-workflow.png new file mode 100644 index 000000000..cdfc7261f Binary files /dev/null and b/examples/rewoo/img/rewoo-paper-workflow.png differ diff --git a/examples/rewoo/img/rewoo.png b/examples/rewoo/img/rewoo.png new file mode 100644 index 000000000..48af25d57 Binary files /dev/null and b/examples/rewoo/img/rewoo.png differ diff --git a/examples/rewoo/rewoo.ipynb b/examples/rewoo/rewoo.ipynb new file mode 100644 index 000000000..218713d2e --- /dev/null +++ b/examples/rewoo/rewoo.ipynb @@ -0,0 +1,486 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1c161710-fc66-426f-8c96-28440b9c9626", + "metadata": {}, + "source": [ + "# Reasoning without Observation\n", + "\n", + "In [ReWOO](https://arxiv.org/abs/2305.18323), Xu, et. al, propose an agent that combines a multi-step planner and variable substitution for effective tool use. It was designed to improve on the ReACT-style agent architecture in the following ways:\n", + "\n", + "1. Reduce token consumption and execution time by generating the full chain of tools used in a single pass. (_ReACT-style agent architecture requires many LLM calls with redundant prefixes (since the system prompt and previous steps are provided to the LLM for each reasoning step_)\n", + "2. Simplify the fine-tuning process. Since the planning data doesn't depend on the outputs of the tool, models can be fine-tuned without actually invoking the tools (in theory).\n", + "\n", + "\n", + "The following diagram outlines ReWOO's overall computation graph:\n", + "\n", + "![ReWoo Diagram](./img/rewoo.png)\n", + "\n", + "ReWOO is made of 3 modules:\n", + "\n", + "1. 🧠**Planner**: Generate the plan in the following format:\n", + "```text\n", + "Plan: \n", + "#E1 = Tool[argument for tool]\n", + "Plan: \n", + "#E2 = Tool[argument for tool with #E1 variable substitution]\n", + "...\n", + "```\n", + "3. **Worker**: executes the tool with the provided arguments.\n", + "4. 🧠**Solver**: generates the answer for the initial task based on the tool observations.\n", + "\n", + "The modules with a 🧠 emoji depend on an LLM call. Notice that we avoid redundant calls to the planner LLM by using variable substitution.\n", + "\n", + "In this example, each module is represented by a LangGraph node. The end result will leave a trace that looks [like this one](https://smith.langchain.com/public/39dbdcf8-fbcc-4479-8e28-15377ca5e653/r). Let's get started!\n", + "\n", + "## 0. Prerequisites\n", + "\n", + "For this example, we will provide the agent with a Tavily search engine tool. You can get an API key [here](https://app.tavily.com/sign-in) or replace with a free tool option (e.g., [duck duck go search](https://python.langchain.com/docs/integrations/tools/ddg)).\n", + "\n", + "To see the full langsmith trace, you can s" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7f52bded-9d23-4826-8bfc-20b0d3a51182", + "metadata": {}, + "outputs": [], + "source": [ + "# %pip install -U langgraph langchain_community langchain_openai tavily-python" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4215f9fb-71ff-4d88-8484-f73174db5592", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import getpass\n", + "\n", + "\n", + "def _set_if_undefined(var: str):\n", + " if not os.environ.get(var):\n", + " os.environ[var] = getpass.getpass(f\"{var}=\")\n", + "\n", + "\n", + "os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n", + "os.environ[\"LANGCHAIN_PROJECT\"] = \"ReWOO\"\n", + "_set_if_undefined(\"TAVILY_API_KEY\")\n", + "_set_if_undefined(\"LANGCHAIN_API_KEY\")\n", + "_set_if_undefined(\"OPENAI_API_KEY\")" + ] + }, + { + "cell_type": "markdown", + "id": "55239a14-a14d-4117-adb5-07199e1e5e16", + "metadata": {}, + "source": [ + "**Graph State**: In LangGraph, every node updates a shared graph state. The state is the input to any node whenever it is invoked.\n", + "\n", + "Below, we will define a state dict to contain the task, plan, steps, and other variables." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9a92c875-c20b-4b7e-9d88-61c62382f8e2", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import TypedDict, List\n", + "\n", + "\n", + "class ReWOO(TypedDict):\n", + " task: str\n", + " plan_string: str\n", + " steps: List\n", + " results: dict\n", + " result: str" + ] + }, + { + "cell_type": "markdown", + "id": "997f9181-41c0-4c44-937d-94bd3946a929", + "metadata": {}, + "source": [ + "## 1. Planner\n", + "\n", + "The planner prompts an LLM to generate a plan in the form of a task list. The arguments to each task are strings that may contain special variables (`#E{0-9}+`) that are used for variable subtitution from other task results.\n", + "\n", + "\n", + "![ReWOO workflow](./img/rewoo-paper-workflow.png)\n", + "\n", + "Our example agent will have two tools: \n", + "1. Google - a search engine (in this case Tavily)\n", + "2. LLM - an LLM call to reason about previous outputs.\n", + "\n", + "The LLM tool receives less of the prompt context and so can be more token-efficient than the ReACT paradigm." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c8836921-c89e-42b6-8c71-27aeaeac5368", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_openai import ChatOpenAI\n", + "\n", + "model = ChatOpenAI(temperature=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7e7faa92-30a1-4942-b3c7-acd3a7bfccbc", + "metadata": {}, + "outputs": [], + "source": [ + "prompt = \"\"\"For the following task, make plans that can solve the problem step by step. For each plan, indicate \\\n", + "which external tool together with tool input to retrieve evidence. You can store the evidence into a \\\n", + "variable #E that can be called by later tools. (Plan, #E1, Plan, #E2, Plan, ...)\n", + "\n", + "Tools can be one of the following:\n", + "(1) Google[input]: Worker that searches results from Google. Useful when you need to find short\n", + "and succinct answers about a specific topic. The input should be a search query.\n", + "(2) LLM[input]: A pretrained LLM like yourself. Useful when you need to act with general\n", + "world knowledge and common sense. Prioritize it when you are confident in solving the problem\n", + "yourself. Input can be any instruction.\n", + "\n", + "For example,\n", + "Task: Thomas, Toby, and Rebecca worked a total of 157 hours in one week. Thomas worked x\n", + "hours. Toby worked 10 hours less than twice what Thomas worked, and Rebecca worked 8 hours\n", + "less than Toby. How many hours did Rebecca work?\n", + "Plan: Given Thomas worked x hours, translate the problem into algebraic expressions and solve\n", + "with Wolfram Alpha. #E1 = WolframAlpha[Solve x + (2x − 10) + ((2x − 10) − 8) = 157]\n", + "Plan: Find out the number of hours Thomas worked. #E2 = LLM[What is x, given #E1]\n", + "Plan: Calculate the number of hours Rebecca worked. #E3 = Calculator[(2 ∗ #E2 − 10) − 8]\n", + "\n", + "Begin! \n", + "Describe your plans with rich details. Each Plan should be followed by only one #E.\n", + "\n", + "Task: {task}\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "72b4ab0f-7215-4f4b-9407-0ebad8b13b92", + "metadata": {}, + "outputs": [], + "source": [ + "task = \"what is the hometown of the 2024 australian open winner\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "56ecb45b-ea76-4303-a4f3-51406fe8312a", + "metadata": {}, + "outputs": [], + "source": [ + "result = model.invoke(prompt.format(task=task))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8a733caa-d75b-422c-93aa-6ad913c995f3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Plan: Use Google to search for the 2024 Australian Open winner.\n", + "#E1 = Google[2024 Australian Open winner]\n", + "\n", + "Plan: Retrieve the name of the 2024 Australian Open winner from the search results.\n", + "#E2 = LLM[What is the name of the 2024 Australian Open winner, given #E1]\n", + "\n", + "Plan: Use Google to search for the hometown of the 2024 Australian Open winner.\n", + "#E3 = Google[hometown of 2024 Australian Open winner, given #E2]\n", + "\n", + "Plan: Retrieve the hometown of the 2024 Australian Open winner from the search results.\n", + "#E4 = LLM[What is the hometown of the 2024 Australian Open winner, given #E3]\n" + ] + } + ], + "source": [ + "print(result.content)" + ] + }, + { + "cell_type": "markdown", + "id": "37166985-5bec-4615-bd40-54d16fd7b4ea", + "metadata": {}, + "source": [ + "#### Planner Node\n", + "\n", + "To connect the planner to our graph, we will create a `get_plan` node that accepts the `ReWOO` state and returns with a state update for the\n", + "`steps` and `plan_string` fields." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f9f042b6-90d8-430f-abf3-04ad2bb047c7", + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "\n", + "# Regex to match expressions of the form E#... = ...[...]\n", + "regex_pattern = r\"Plan:\\s*(.+)\\s*(#E\\d+)\\s*=\\s*(\\w+)\\s*\\[([^\\]]+)\\]\"\n", + "prompt_template = ChatPromptTemplate.from_messages([(\"user\", prompt)])\n", + "planner = prompt_template | model\n", + "\n", + "\n", + "def get_plan(state: ReWOO):\n", + " task = state[\"task\"]\n", + " result = planner.invoke({\"task\": task})\n", + " # Find all matches in the sample text\n", + " matches = re.findall(regex_pattern, result.content)\n", + " return {\"steps\": matches, \"plan_string\": result.content}" + ] + }, + { + "cell_type": "markdown", + "id": "0d97942f-27d3-4761-b6cc-6614dbb90c77", + "metadata": {}, + "source": [ + "## 2. Executor\n", + "\n", + "The executor receives the plan and executes the tools in sequence.\n", + "\n", + "Below, instantiate the search engine and define the toole execution node." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "3412cfc4-6796-4295-aea4-7eeb304e10bd", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_community.tools.tavily_search import TavilySearchResults\n", + "\n", + "search = TavilySearchResults()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "aa96fbac-28bc-4afe-ae35-ddb3383d1147", + "metadata": {}, + "outputs": [], + "source": [ + "def _get_current_task(state: ReWOO):\n", + " if state[\"results\"] is None:\n", + " return 1\n", + " if len(state[\"results\"]) == len(state[\"steps\"]):\n", + " return None\n", + " else:\n", + " return len(state[\"results\"]) + 1\n", + "\n", + "\n", + "def tool_execution(state: ReWOO):\n", + " \"\"\"Worker node that executes the tools of a given plan.\"\"\"\n", + " _step = _get_current_task(state)\n", + " _, step_name, tool, tool_input = state[\"steps\"][_step - 1]\n", + " _results = state[\"results\"] or {}\n", + " for k, v in _results.items():\n", + " tool_input = tool_input.replace(k, v)\n", + " if tool == \"Google\":\n", + " result = search.invoke(tool_input)\n", + " elif tool == \"LLM\":\n", + " result = model.invoke(tool_input)\n", + " else:\n", + " raise ValueError\n", + " _results[step_name] = str(result)\n", + " return {\"results\": _results}" + ] + }, + { + "cell_type": "markdown", + "id": "28e20b31-d721-470d-94d2-db0c177fae75", + "metadata": {}, + "source": [ + "## 3. Solver\n", + "\n", + "The solver receives the full plan and generates the final response based on the responses of the tool calls from the worker." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "0a4d9851-8590-42be-8c53-9969ebff85f4", + "metadata": {}, + "outputs": [], + "source": [ + "solve_prompt = \"\"\"Solve the following task or problem. To solve the problem, we have made step-by-step Plan and \\\n", + "retrieved corresponding Evidence to each Plan. Use them with caution since long evidence might \\\n", + "contain irrelevant information.\n", + "\n", + "{plan}\n", + "\n", + "Now solve the question or task according to provided Evidence above. Respond with the answer\n", + "directly with no extra words.\n", + "\n", + "Task: {task}\n", + "Response:\"\"\"\n", + "\n", + "\n", + "def solve(state: ReWOO):\n", + " plan = \"\"\n", + " for _plan, step_name, tool, tool_input in state[\"steps\"]:\n", + " _results = state[\"results\"] or {}\n", + " for k, v in _results.items():\n", + " tool_input = tool_input.replace(k, v)\n", + " plan += f\"Plan: {_plan}\\n{step_name} = {tool}[{tool_input}]\"\n", + " prompt = solve_prompt.format(plan=plan, task=state[\"task\"])\n", + " result = model.invoke(prompt)\n", + " return {\"result\": result.content}" + ] + }, + { + "cell_type": "markdown", + "id": "8ce26c3f-6ced-4a91-a9f2-d0bc235e4010", + "metadata": {}, + "source": [ + "## 4. Define Graph\n", + "\n", + "Our graph defines the workflow. Each of the planner, tool executor, and solver modules are added as nodes." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "73b235d7-fa83-4e84-9f2e-2908f16deb26", + "metadata": {}, + "outputs": [], + "source": [ + "def _route(state):\n", + " _step = _get_current_task(state)\n", + " if _step is None:\n", + " # We have executed all tasks\n", + " return \"solve\"\n", + " else:\n", + " # We are still executing tasks, loop back to the \"tool\" node\n", + " return \"tool\"" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "cf173aa1-ce31-4dca-8111-30c91e209652", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.graph import StateGraph, END\n", + "\n", + "graph = StateGraph(ReWOO)\n", + "graph.add_node(\"plan\", get_plan)\n", + "graph.add_node(\"tool\", tool_execution)\n", + "graph.add_node(\"solve\", solve)\n", + "graph.add_edge(\"plan\", \"tool\")\n", + "graph.add_edge(\"solve\", END)\n", + "graph.add_conditional_edges(\"tool\", _route)\n", + "graph.set_entry_point(\"plan\")\n", + "\n", + "app = graph.compile()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "badaca52-5d55-433f-8770-1bd50c10bf7f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'plan': {'steps': [('Use Google to search for the 2024 Australian Open winner.', '#E1', 'Google', '2024 Australian Open winner'), ('Retrieve the name of the 2024 Australian Open winner from the search results.', '#E2', 'LLM', 'What is the name of the 2024 Australian Open winner, given #E1'), ('Use Google to search for the hometown of the 2024 Australian Open winner.', '#E3', 'Google', 'hometown of 2024 Australian Open winner, given #E2'), ('Retrieve the hometown of the 2024 Australian Open winner from the search results.', '#E4', 'LLM', 'What is the hometown of the 2024 Australian Open winner, given #E3')], 'plan_string': 'Plan: Use Google to search for the 2024 Australian Open winner.\\n#E1 = Google[2024 Australian Open winner]\\n\\nPlan: Retrieve the name of the 2024 Australian Open winner from the search results.\\n#E2 = LLM[What is the name of the 2024 Australian Open winner, given #E1]\\n\\nPlan: Use Google to search for the hometown of the 2024 Australian Open winner.\\n#E3 = Google[hometown of 2024 Australian Open winner, given #E2]\\n\\nPlan: Retrieve the hometown of the 2024 Australian Open winner from the search results.\\n#E4 = LLM[What is the hometown of the 2024 Australian Open winner, given #E3]'}}\n", + "---\n", + "{'tool': {'results': {'#E1': '[{\\'url\\': \\'https://www.cbssports.com/tennis/news/australian-open-2024-jannik-sinner-aryna-sabalenka-crowned-as-grand-slam-singles-champions-at-melbourne-park/\\', \\'content\\': \\'2024 Australian Open odds, Sinner vs. Medvedev picks Sabalenka defeats Zheng to win 2024 Australian Open Australian Open 2024: Jannik Sinner, Aryna Sabalenka crowned as Grand Slam singles champions at Melbourne Park 2024 Australian Open odds, Sabalenka vs. Zheng picks 2024 Australian Open odds, Medvedev vs. Zverev picks Sinner, Sabalenka win Australian Open singles titles Sinner makes epic comeback to win Australian OpenJan 28, 2024 — Jan 28, 2024Australian Open 2024: Jannik Sinner, Aryna Sabalenka crowned as Grand Slam singles champions at Melbourne Park ... Watch Now: Jannik Sinner came\\\\xa0...\\'}, {\\'url\\': \\'https://en.wikipedia.org/wiki/2024_Australian_Open\\', \\'content\\': \"Contents 2024 Australian Open The 2024 Australian Open was a Grand Slam level tennis tournament held at Melbourne Park, from 14–28 January 2024.[1] The Australian Open total prize money for 2024 increased by 13.07% year on year to a tournament record A$86,500,000. In the tournament\\'s 119-year history, this was the first Australian Open Tennis Championships to be held on an openingNovak Djokovic was the defending men\\'s singles champion. ... He was defeated in the semifinals by Jannik Sinner, who went on to beat Daniil Medvedev in a five-set\\\\xa0...\"}, {\\'url\\': \\'https://en.wikipedia.org/wiki/2024_Australian_Open_%E2%80%93_Men%27s_singles\\', \\'content\\': \"Contents 2024 Australian Open – Men\\'s singles The entry list was released by Tennis Australia based on the ATP rankings for the week of 4 December 2023.[15] matches, tying the Open Era record set at the 1983 US Open.[14] feature any of the Big Three members.[4] It was the second time Medvedev lost the Australian Open final after winningJannik Sinner defeated Daniil Medvedev in the final, 3–6, 3–6, 6–4, 6–4, 6–3, to win the men\\'s singles tennis title at the 2024 Australian Open.\"}]'}}}\n", + "---\n", + "{'tool': {'results': {'#E1': '[{\\'url\\': \\'https://www.cbssports.com/tennis/news/australian-open-2024-jannik-sinner-aryna-sabalenka-crowned-as-grand-slam-singles-champions-at-melbourne-park/\\', \\'content\\': \\'2024 Australian Open odds, Sinner vs. Medvedev picks Sabalenka defeats Zheng to win 2024 Australian Open Australian Open 2024: Jannik Sinner, Aryna Sabalenka crowned as Grand Slam singles champions at Melbourne Park 2024 Australian Open odds, Sabalenka vs. Zheng picks 2024 Australian Open odds, Medvedev vs. Zverev picks Sinner, Sabalenka win Australian Open singles titles Sinner makes epic comeback to win Australian OpenJan 28, 2024 — Jan 28, 2024Australian Open 2024: Jannik Sinner, Aryna Sabalenka crowned as Grand Slam singles champions at Melbourne Park ... Watch Now: Jannik Sinner came\\\\xa0...\\'}, {\\'url\\': \\'https://en.wikipedia.org/wiki/2024_Australian_Open\\', \\'content\\': \"Contents 2024 Australian Open The 2024 Australian Open was a Grand Slam level tennis tournament held at Melbourne Park, from 14–28 January 2024.[1] The Australian Open total prize money for 2024 increased by 13.07% year on year to a tournament record A$86,500,000. In the tournament\\'s 119-year history, this was the first Australian Open Tennis Championships to be held on an openingNovak Djokovic was the defending men\\'s singles champion. ... He was defeated in the semifinals by Jannik Sinner, who went on to beat Daniil Medvedev in a five-set\\\\xa0...\"}, {\\'url\\': \\'https://en.wikipedia.org/wiki/2024_Australian_Open_%E2%80%93_Men%27s_singles\\', \\'content\\': \"Contents 2024 Australian Open – Men\\'s singles The entry list was released by Tennis Australia based on the ATP rankings for the week of 4 December 2023.[15] matches, tying the Open Era record set at the 1983 US Open.[14] feature any of the Big Three members.[4] It was the second time Medvedev lost the Australian Open final after winningJannik Sinner defeated Daniil Medvedev in the final, 3–6, 3–6, 6–4, 6–4, 6–3, to win the men\\'s singles tennis title at the 2024 Australian Open.\"}]', '#E2': \"content='The name of the 2024 Australian Open winner is Jannik Sinner.'\"}}}\n", + "---\n", + "{'tool': {'results': {'#E1': '[{\\'url\\': \\'https://www.cbssports.com/tennis/news/australian-open-2024-jannik-sinner-aryna-sabalenka-crowned-as-grand-slam-singles-champions-at-melbourne-park/\\', \\'content\\': \\'2024 Australian Open odds, Sinner vs. Medvedev picks Sabalenka defeats Zheng to win 2024 Australian Open Australian Open 2024: Jannik Sinner, Aryna Sabalenka crowned as Grand Slam singles champions at Melbourne Park 2024 Australian Open odds, Sabalenka vs. Zheng picks 2024 Australian Open odds, Medvedev vs. Zverev picks Sinner, Sabalenka win Australian Open singles titles Sinner makes epic comeback to win Australian OpenJan 28, 2024 — Jan 28, 2024Australian Open 2024: Jannik Sinner, Aryna Sabalenka crowned as Grand Slam singles champions at Melbourne Park ... Watch Now: Jannik Sinner came\\\\xa0...\\'}, {\\'url\\': \\'https://en.wikipedia.org/wiki/2024_Australian_Open\\', \\'content\\': \"Contents 2024 Australian Open The 2024 Australian Open was a Grand Slam level tennis tournament held at Melbourne Park, from 14–28 January 2024.[1] The Australian Open total prize money for 2024 increased by 13.07% year on year to a tournament record A$86,500,000. In the tournament\\'s 119-year history, this was the first Australian Open Tennis Championships to be held on an openingNovak Djokovic was the defending men\\'s singles champion. ... He was defeated in the semifinals by Jannik Sinner, who went on to beat Daniil Medvedev in a five-set\\\\xa0...\"}, {\\'url\\': \\'https://en.wikipedia.org/wiki/2024_Australian_Open_%E2%80%93_Men%27s_singles\\', \\'content\\': \"Contents 2024 Australian Open – Men\\'s singles The entry list was released by Tennis Australia based on the ATP rankings for the week of 4 December 2023.[15] matches, tying the Open Era record set at the 1983 US Open.[14] feature any of the Big Three members.[4] It was the second time Medvedev lost the Australian Open final after winningJannik Sinner defeated Daniil Medvedev in the final, 3–6, 3–6, 6–4, 6–4, 6–3, to win the men\\'s singles tennis title at the 2024 Australian Open.\"}]', '#E2': \"content='The name of the 2024 Australian Open winner is Jannik Sinner.'\", '#E3': '[{\\'url\\': \\'https://www.tennis.com/news/articles/soccer-mad-italy-is-now-obsessed-with-tennis-player-jannik-sinner-after-his-australian-open-title\\', \\'content\\': \"Soccer-mad Italy is now obsessed with tennis player Jannik Sinner after his Australian Open title Play & Win Advertising Soccer-mad Italy is now obsessed with tennis player Jannik Sinner after his Australian Open title \\'Grandissimo\\': Italian Premier Giorgia Meloni welcomes home Australian Open champion Jannik Sinner First of many? Jannik Sinner\\'s five-set comeback sinks Daniil Medvedev in Australian Open finalJan 28, 2024 — Jan 28, 2024In Sinner\\'s tiny hometown of Sesto (population 1,860) near the Austrian border, about 70 people gathered inside the two-court indoor tennis\\\\xa0...\"}, {\\'url\\': \\'https://apnews.com/article/jannik-sinner-italy-australian-open-03573689c4c58c2851d1006e26546ac9\\', \\'content\\': \"Soccer-mad Italy is now obsessed with tennis player Jannik Sinner after his Australian Open title Jannik Sinner, left, of Italy gestures as he holds the Norman Brookes Challenge Cup after defeating Daniil Medvedev, Jannik Sinner, left, of Italy gestures as he holds the Norman Brookes Challenge Cup after defeating Daniil Medvedev, Jannik Sinner, left, of Italy gestures as he holds the Norman Brookes Challenge Cup after defeating Daniil Medvedev,Jan 28, 2024 — Jan 28, 2024Soccer-mad Italy has a new obsession. Jannik Sinner\\'s Australian Open performance on the tennis court has captured the country\\'s attention.\"}, {\\'url\\': \\'https://en.wikipedia.org/wiki/Jannik_Sinner\\', \\'content\\': \\'Sinner is a major champion, having won the 2024 Australian Open.[3] He has won a further ten ATP Tour singles titles, At the 2024 Australian Open, Sinner defeated world No. 1 Novak Djokovic in the semifinals to reach his first major Early in the year Sinner made the second round of the 2020 Australian Open, recording his first Grand Slam main draw a match since Janko Tipsarević in London in 2011.[59][60] Sinner played Daniil Medvedev next in the round robin stage,Since making his professional debut in 2018, Sinner has won 11 ATP Tour singles titles, including a Grand Slam at the 2024 Australian Open and a Masters 1000 at\\\\xa0...\\'}, {\\'url\\': \\'https://ausopen.com/players/italy/jannik-sinner\\', \\'content\\': \"Jannik Sinner weathered an early onslaught to reel in Daniil Medvedev, growing in potency to win the Australian Open the Australian Open 2024 final – his first Grand Slam singles title. Jannik Sinner will contest his first Grand Slam final after scuttling Novak Djokovic’s bid for a record-extending 11th Jannick Sinner has form and fitness on his side ahead of his meeting with Andrey Rublev.Jannik Sinner Press Conference | Australian Open 2024 Final. 15:02 · Player & Career Overview. Career Wins 73% · Men\\'s Singles. Final • Rod Laver Arena · Comeback\\\\xa0...\"}]'}}}\n", + "---\n", + "{'tool': {'results': {'#E1': '[{\\'url\\': \\'https://www.cbssports.com/tennis/news/australian-open-2024-jannik-sinner-aryna-sabalenka-crowned-as-grand-slam-singles-champions-at-melbourne-park/\\', \\'content\\': \\'2024 Australian Open odds, Sinner vs. Medvedev picks Sabalenka defeats Zheng to win 2024 Australian Open Australian Open 2024: Jannik Sinner, Aryna Sabalenka crowned as Grand Slam singles champions at Melbourne Park 2024 Australian Open odds, Sabalenka vs. Zheng picks 2024 Australian Open odds, Medvedev vs. Zverev picks Sinner, Sabalenka win Australian Open singles titles Sinner makes epic comeback to win Australian OpenJan 28, 2024 — Jan 28, 2024Australian Open 2024: Jannik Sinner, Aryna Sabalenka crowned as Grand Slam singles champions at Melbourne Park ... Watch Now: Jannik Sinner came\\\\xa0...\\'}, {\\'url\\': \\'https://en.wikipedia.org/wiki/2024_Australian_Open\\', \\'content\\': \"Contents 2024 Australian Open The 2024 Australian Open was a Grand Slam level tennis tournament held at Melbourne Park, from 14–28 January 2024.[1] The Australian Open total prize money for 2024 increased by 13.07% year on year to a tournament record A$86,500,000. In the tournament\\'s 119-year history, this was the first Australian Open Tennis Championships to be held on an openingNovak Djokovic was the defending men\\'s singles champion. ... He was defeated in the semifinals by Jannik Sinner, who went on to beat Daniil Medvedev in a five-set\\\\xa0...\"}, {\\'url\\': \\'https://en.wikipedia.org/wiki/2024_Australian_Open_%E2%80%93_Men%27s_singles\\', \\'content\\': \"Contents 2024 Australian Open – Men\\'s singles The entry list was released by Tennis Australia based on the ATP rankings for the week of 4 December 2023.[15] matches, tying the Open Era record set at the 1983 US Open.[14] feature any of the Big Three members.[4] It was the second time Medvedev lost the Australian Open final after winningJannik Sinner defeated Daniil Medvedev in the final, 3–6, 3–6, 6–4, 6–4, 6–3, to win the men\\'s singles tennis title at the 2024 Australian Open.\"}]', '#E2': \"content='The name of the 2024 Australian Open winner is Jannik Sinner.'\", '#E3': '[{\\'url\\': \\'https://www.tennis.com/news/articles/soccer-mad-italy-is-now-obsessed-with-tennis-player-jannik-sinner-after-his-australian-open-title\\', \\'content\\': \"Soccer-mad Italy is now obsessed with tennis player Jannik Sinner after his Australian Open title Play & Win Advertising Soccer-mad Italy is now obsessed with tennis player Jannik Sinner after his Australian Open title \\'Grandissimo\\': Italian Premier Giorgia Meloni welcomes home Australian Open champion Jannik Sinner First of many? Jannik Sinner\\'s five-set comeback sinks Daniil Medvedev in Australian Open finalJan 28, 2024 — Jan 28, 2024In Sinner\\'s tiny hometown of Sesto (population 1,860) near the Austrian border, about 70 people gathered inside the two-court indoor tennis\\\\xa0...\"}, {\\'url\\': \\'https://apnews.com/article/jannik-sinner-italy-australian-open-03573689c4c58c2851d1006e26546ac9\\', \\'content\\': \"Soccer-mad Italy is now obsessed with tennis player Jannik Sinner after his Australian Open title Jannik Sinner, left, of Italy gestures as he holds the Norman Brookes Challenge Cup after defeating Daniil Medvedev, Jannik Sinner, left, of Italy gestures as he holds the Norman Brookes Challenge Cup after defeating Daniil Medvedev, Jannik Sinner, left, of Italy gestures as he holds the Norman Brookes Challenge Cup after defeating Daniil Medvedev,Jan 28, 2024 — Jan 28, 2024Soccer-mad Italy has a new obsession. Jannik Sinner\\'s Australian Open performance on the tennis court has captured the country\\'s attention.\"}, {\\'url\\': \\'https://en.wikipedia.org/wiki/Jannik_Sinner\\', \\'content\\': \\'Sinner is a major champion, having won the 2024 Australian Open.[3] He has won a further ten ATP Tour singles titles, At the 2024 Australian Open, Sinner defeated world No. 1 Novak Djokovic in the semifinals to reach his first major Early in the year Sinner made the second round of the 2020 Australian Open, recording his first Grand Slam main draw a match since Janko Tipsarević in London in 2011.[59][60] Sinner played Daniil Medvedev next in the round robin stage,Since making his professional debut in 2018, Sinner has won 11 ATP Tour singles titles, including a Grand Slam at the 2024 Australian Open and a Masters 1000 at\\\\xa0...\\'}, {\\'url\\': \\'https://ausopen.com/players/italy/jannik-sinner\\', \\'content\\': \"Jannik Sinner weathered an early onslaught to reel in Daniil Medvedev, growing in potency to win the Australian Open the Australian Open 2024 final – his first Grand Slam singles title. Jannik Sinner will contest his first Grand Slam final after scuttling Novak Djokovic’s bid for a record-extending 11th Jannick Sinner has form and fitness on his side ahead of his meeting with Andrey Rublev.Jannik Sinner Press Conference | Australian Open 2024 Final. 15:02 · Player & Career Overview. Career Wins 73% · Men\\'s Singles. Final • Rod Laver Arena · Comeback\\\\xa0...\"}]', '#E4': \"content='The hometown of the 2024 Australian Open winner, Jannik Sinner, is Sesto, a small town near the Austrian border in Italy.'\"}}}\n", + "---\n", + "{'solve': {'result': 'The hometown of the 2024 Australian Open winner, Jannik Sinner, is Sesto, Italy.'}}\n", + "---\n", + "{'__end__': {'task': 'what is the hometown of the 2024 australian open winner', 'plan_string': 'Plan: Use Google to search for the 2024 Australian Open winner.\\n#E1 = Google[2024 Australian Open winner]\\n\\nPlan: Retrieve the name of the 2024 Australian Open winner from the search results.\\n#E2 = LLM[What is the name of the 2024 Australian Open winner, given #E1]\\n\\nPlan: Use Google to search for the hometown of the 2024 Australian Open winner.\\n#E3 = Google[hometown of 2024 Australian Open winner, given #E2]\\n\\nPlan: Retrieve the hometown of the 2024 Australian Open winner from the search results.\\n#E4 = LLM[What is the hometown of the 2024 Australian Open winner, given #E3]', 'steps': [('Use Google to search for the 2024 Australian Open winner.', '#E1', 'Google', '2024 Australian Open winner'), ('Retrieve the name of the 2024 Australian Open winner from the search results.', '#E2', 'LLM', 'What is the name of the 2024 Australian Open winner, given #E1'), ('Use Google to search for the hometown of the 2024 Australian Open winner.', '#E3', 'Google', 'hometown of 2024 Australian Open winner, given #E2'), ('Retrieve the hometown of the 2024 Australian Open winner from the search results.', '#E4', 'LLM', 'What is the hometown of the 2024 Australian Open winner, given #E3')], 'results': {'#E1': '[{\\'url\\': \\'https://www.cbssports.com/tennis/news/australian-open-2024-jannik-sinner-aryna-sabalenka-crowned-as-grand-slam-singles-champions-at-melbourne-park/\\', \\'content\\': \\'2024 Australian Open odds, Sinner vs. Medvedev picks Sabalenka defeats Zheng to win 2024 Australian Open Australian Open 2024: Jannik Sinner, Aryna Sabalenka crowned as Grand Slam singles champions at Melbourne Park 2024 Australian Open odds, Sabalenka vs. Zheng picks 2024 Australian Open odds, Medvedev vs. Zverev picks Sinner, Sabalenka win Australian Open singles titles Sinner makes epic comeback to win Australian OpenJan 28, 2024 — Jan 28, 2024Australian Open 2024: Jannik Sinner, Aryna Sabalenka crowned as Grand Slam singles champions at Melbourne Park ... Watch Now: Jannik Sinner came\\\\xa0...\\'}, {\\'url\\': \\'https://en.wikipedia.org/wiki/2024_Australian_Open\\', \\'content\\': \"Contents 2024 Australian Open The 2024 Australian Open was a Grand Slam level tennis tournament held at Melbourne Park, from 14–28 January 2024.[1] The Australian Open total prize money for 2024 increased by 13.07% year on year to a tournament record A$86,500,000. In the tournament\\'s 119-year history, this was the first Australian Open Tennis Championships to be held on an openingNovak Djokovic was the defending men\\'s singles champion. ... He was defeated in the semifinals by Jannik Sinner, who went on to beat Daniil Medvedev in a five-set\\\\xa0...\"}, {\\'url\\': \\'https://en.wikipedia.org/wiki/2024_Australian_Open_%E2%80%93_Men%27s_singles\\', \\'content\\': \"Contents 2024 Australian Open – Men\\'s singles The entry list was released by Tennis Australia based on the ATP rankings for the week of 4 December 2023.[15] matches, tying the Open Era record set at the 1983 US Open.[14] feature any of the Big Three members.[4] It was the second time Medvedev lost the Australian Open final after winningJannik Sinner defeated Daniil Medvedev in the final, 3–6, 3–6, 6–4, 6–4, 6–3, to win the men\\'s singles tennis title at the 2024 Australian Open.\"}]', '#E2': \"content='The name of the 2024 Australian Open winner is Jannik Sinner.'\", '#E3': '[{\\'url\\': \\'https://www.tennis.com/news/articles/soccer-mad-italy-is-now-obsessed-with-tennis-player-jannik-sinner-after-his-australian-open-title\\', \\'content\\': \"Soccer-mad Italy is now obsessed with tennis player Jannik Sinner after his Australian Open title Play & Win Advertising Soccer-mad Italy is now obsessed with tennis player Jannik Sinner after his Australian Open title \\'Grandissimo\\': Italian Premier Giorgia Meloni welcomes home Australian Open champion Jannik Sinner First of many? Jannik Sinner\\'s five-set comeback sinks Daniil Medvedev in Australian Open finalJan 28, 2024 — Jan 28, 2024In Sinner\\'s tiny hometown of Sesto (population 1,860) near the Austrian border, about 70 people gathered inside the two-court indoor tennis\\\\xa0...\"}, {\\'url\\': \\'https://apnews.com/article/jannik-sinner-italy-australian-open-03573689c4c58c2851d1006e26546ac9\\', \\'content\\': \"Soccer-mad Italy is now obsessed with tennis player Jannik Sinner after his Australian Open title Jannik Sinner, left, of Italy gestures as he holds the Norman Brookes Challenge Cup after defeating Daniil Medvedev, Jannik Sinner, left, of Italy gestures as he holds the Norman Brookes Challenge Cup after defeating Daniil Medvedev, Jannik Sinner, left, of Italy gestures as he holds the Norman Brookes Challenge Cup after defeating Daniil Medvedev,Jan 28, 2024 — Jan 28, 2024Soccer-mad Italy has a new obsession. Jannik Sinner\\'s Australian Open performance on the tennis court has captured the country\\'s attention.\"}, {\\'url\\': \\'https://en.wikipedia.org/wiki/Jannik_Sinner\\', \\'content\\': \\'Sinner is a major champion, having won the 2024 Australian Open.[3] He has won a further ten ATP Tour singles titles, At the 2024 Australian Open, Sinner defeated world No. 1 Novak Djokovic in the semifinals to reach his first major Early in the year Sinner made the second round of the 2020 Australian Open, recording his first Grand Slam main draw a match since Janko Tipsarević in London in 2011.[59][60] Sinner played Daniil Medvedev next in the round robin stage,Since making his professional debut in 2018, Sinner has won 11 ATP Tour singles titles, including a Grand Slam at the 2024 Australian Open and a Masters 1000 at\\\\xa0...\\'}, {\\'url\\': \\'https://ausopen.com/players/italy/jannik-sinner\\', \\'content\\': \"Jannik Sinner weathered an early onslaught to reel in Daniil Medvedev, growing in potency to win the Australian Open the Australian Open 2024 final – his first Grand Slam singles title. Jannik Sinner will contest his first Grand Slam final after scuttling Novak Djokovic’s bid for a record-extending 11th Jannick Sinner has form and fitness on his side ahead of his meeting with Andrey Rublev.Jannik Sinner Press Conference | Australian Open 2024 Final. 15:02 · Player & Career Overview. Career Wins 73% · Men\\'s Singles. Final • Rod Laver Arena · Comeback\\\\xa0...\"}]', '#E4': \"content='The hometown of the 2024 Australian Open winner, Jannik Sinner, is Sesto, a small town near the Austrian border in Italy.'\"}, 'result': 'The hometown of the 2024 Australian Open winner, Jannik Sinner, is Sesto, Italy.'}}\n", + "---\n" + ] + } + ], + "source": [ + "for s in app.stream({\"task\": task}):\n", + " print(s)\n", + " print(\"---\")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "70e5aa0f-4d8b-4f65-817a-1c4ebf07d07a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The hometown of the 2024 Australian Open winner, Jannik Sinner, is Sesto, Italy.\n" + ] + } + ], + "source": [ + "# Print out the final result\n", + "print(s[END][\"result\"])" + ] + }, + { + "cell_type": "markdown", + "id": "842954d7-0de0-4876-be63-46b4e14157b0", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "Congratulations on implementing ReWOO! Before you leave, I'll leave you with a couple limitations of the current implementation from the paper:\n", + "\n", + "1. If little context of the environment is available, the planner will be ineffective in its tool use. This can typically be ameliorated through few-shot prompting and/or fine-tuning.\n", + "2. The tasks are still executed in sequence, meaning the total execution time is impacted by _every_ tool call, not just he longest-running in a given step." + ] + } + ], + "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.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/self-discover/self-discover.ipynb b/examples/self-discover/self-discover.ipynb new file mode 100644 index 000000000..fa337d58a --- /dev/null +++ b/examples/self-discover/self-discover.ipynb @@ -0,0 +1,479 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a38e5d2d-7587-4192-90f2-b58e6c62f08c", + "metadata": {}, + "source": [ + "# Self Discover\n", + "\n", + "An implementation of the [Self-Discover paper](https://arxiv.org/pdf/2402.03620.pdf).\n", + "\n", + "Based on [this implementation from @catid](https://github.com/catid/self-discover/tree/main?tab=readme-ov-file)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a18d8f24-5d9a-45c5-9739-6f3c4ed6c9c9", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_openai import ChatOpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9f554045-6e79-42d3-be4b-835bbbd0b78c", + "metadata": {}, + "outputs": [], + "source": [ + "model = ChatOpenAI(temperature=0, model=\"gpt-4-turbo-preview\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9e9925aa-638a-4862-823e-9803402b8f82", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain import hub\n", + "from langchain_core.prompts import PromptTemplate" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "c4cc5c8c-f6a5-42c7-9ed5-780d79b3b29a", + "metadata": {}, + "outputs": [], + "source": [ + "select_prompt = hub.pull(\"hwchase17/self-discovery-select\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "a5b53d29-f5b6-4f39-af97-bb6b133e1d18", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Select several reasoning modules that are crucial to utilize in order to solve the given task:\n", + "\n", + "All reasoning module descriptions:\n", + "\u001b[33;1m\u001b[1;3m{reasoning_modules}\u001b[0m\n", + "\n", + "Task: \u001b[33;1m\u001b[1;3m{task_description}\u001b[0m\n", + "\n", + "Select several modules are crucial for solving the task above:\n", + "\n" + ] + } + ], + "source": [ + "select_prompt.pretty_print()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "26eaa6bc-5202-4b22-9522-33f227c8eb55", + "metadata": {}, + "outputs": [], + "source": [ + "adapt_prompt = hub.pull(\"hwchase17/self-discovery-adapt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "dc30afb9-180d-417b-9935-f7ef166710b8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Rephrase and specify each reasoning module so that it better helps solving the task:\n", + "\n", + "SELECTED module descriptions:\n", + "\u001b[33;1m\u001b[1;3m{selected_modules}\u001b[0m\n", + "\n", + "Task: \u001b[33;1m\u001b[1;3m{task_description}\u001b[0m\n", + "\n", + "Adapt each reasoning module description to better solve the task:\n", + "\n" + ] + } + ], + "source": [ + "adapt_prompt.pretty_print()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "a93253a9-8f50-49dd-8815-c3927bae1905", + "metadata": {}, + "outputs": [], + "source": [ + "structured_prompt = hub.pull(\"hwchase17/self-discovery-structure\")" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "8ea8dd78-4285-400b-83d2-c4a241903a79", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Operationalize the reasoning modules into a step-by-step reasoning plan in JSON format:\n", + "\n", + "Here's an example:\n", + "\n", + "Example task:\n", + "\n", + "If you follow these instructions, do you return to the starting point? Always face forward. Take 1 step backward. Take 9 steps left. Take 2 steps backward. Take 6 steps forward. Take 4 steps forward. Take 4 steps backward. Take 3 steps right.\n", + "\n", + "Example reasoning structure:\n", + "\n", + "{\n", + " \"Position after instruction 1\":\n", + " \"Position after instruction 2\":\n", + " \"Position after instruction n\":\n", + " \"Is final position the same as starting position\":\n", + "}\n", + "\n", + "Adapted module description:\n", + "\u001b[33;1m\u001b[1;3m{adapted_modules}\u001b[0m\n", + "\n", + "Task: \u001b[33;1m\u001b[1;3m{task_description}\u001b[0m\n", + "\n", + "Implement a reasoning structure for solvers to follow step-by-step and arrive at correct answer.\n", + "\n", + "Note: do NOT actually arrive at a conclusion in this pass. Your job is to generate a PLAN so that in the future you can fill it out and arrive at the correct conclusion for tasks like this\n" + ] + } + ], + "source": [ + "structured_prompt.pretty_print()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "f3d4d79d-f414-4588-b476-4a35b3ba6fbf", + "metadata": {}, + "outputs": [], + "source": [ + "reasoning_prompt = hub.pull(\"hwchase17/self-discovery-reasoning\")" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "23d1e32e-d12e-454a-8484-c08e250e3262", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Follow the step-by-step reasoning plan in JSON to correctly solve the task. Fill in the values following the keys by reasoning specifically about the task given. Do not simply rephrase the keys.\n", + " \n", + "Reasoning Structure:\n", + "\u001b[33;1m\u001b[1;3m{reasoning_structure}\u001b[0m\n", + "\n", + "Task: \u001b[33;1m\u001b[1;3m{task_description}\u001b[0m\n" + ] + } + ], + "source": [ + "reasoning_prompt.pretty_print()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "7b9af01d-da28-4785-b069-efea61905cfa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PromptTemplate(input_variables=['reasoning_structure', 'task_instance'], template='Follow the step-by-step reasoning plan in JSON to correctly solve the task. Fill in the values following the keys by reasoning specifically about the task given. Do not simply rephrase the keys.\\n \\nReasoning Structure:\\n{reasoning_structure}\\n\\nTask: {task_instance}')" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "reasoning_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "399bf160-e257-429f-b27e-66d4063f195f", + "metadata": {}, + "outputs": [], + "source": [ + "_prompt = \"\"\"Follow the step-by-step reasoning plan in JSON to correctly solve the task. Fill in the values following the keys by reasoning specifically about the task given. Do not simply rephrase the keys.\\n \\nReasoning Structure:\\n{reasoning_structure}\\n\\nTask: {task_description}\"\"\"\n", + "_prompt = PromptTemplate.from_template(_prompt)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "6e047e3a-b1c2-4a3b-abc7-eb84de6874e4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'https://smith.langchain.com/hub/hwchase17/self-discovery-reasoning/48340707'" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hub.push(\"hwchase17/self-discovery-reasoning\", _prompt)" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "7f66d61e-6dcd-4462-b67b-29c5de56e238", + "metadata": {}, + "outputs": [], + "source": [ + "class SelfDiscoverState(TypedDict):\n", + " reasoning_modules: str\n", + " task_description: str\n", + " selected_modules: Optional[str]\n", + " adapted_modules: Optional[str]\n", + " reasoning_structure: Optional[str]\n", + " answer: Optional[str]" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "5c3bd203-7dc1-457e-813f-283aaf059ec0", + "metadata": {}, + "outputs": [], + "source": [ + "def select(inputs):\n", + " select_chain = select_prompt | model | StrOutputParser()\n", + " return {\"selected_modules\": select_chain.invoke(inputs)}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "86420da0-7cc2-4659-853e-9c3ef808e47c", + "metadata": {}, + "outputs": [], + "source": [ + "def adapt(inputs):\n", + " adapt_chain = adapt_prompt | model | StrOutputParser()\n", + " return {\"adapted_modules\": adapt_chain.invoke(inputs)}" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "270a3905-58a3-4650-96ca-e8254040285f", + "metadata": {}, + "outputs": [], + "source": [ + "def structure(inputs):\n", + " structure_chain = structured_prompt | model | StrOutputParser()\n", + " return {\"reasoning_structure\": structure_chain.invoke(inputs)}" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "55b486cc-36be-497e-9eba-9c8dc228f2d1", + "metadata": {}, + "outputs": [], + "source": [ + "def reason(inputs):\n", + " reasoning_chain = reasoning_prompt | model | StrOutputParser()\n", + " return {\"answer\": reasoning_chain.invoke(inputs)}" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "d9e2e4ce-dc9d-45a5-a218-34ab4fb62bc4", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.graph import StateGraph, END\n", + "from typing import TypedDict, Optional" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "26276404-0134-40a0-a796-cc9927c153ee", + "metadata": {}, + "outputs": [], + "source": [ + "graph = StateGraph(SelfDiscoverState)\n", + "graph.add_node(\"select\", select)\n", + "graph.add_node(\"adapt\", adapt)\n", + "graph.add_node(\"structure\", structure)\n", + "graph.add_node(\"reason\", reason)\n", + "graph.add_edge(\"select\", \"adapt\")\n", + "graph.add_edge(\"adapt\", \"structure\")\n", + "graph.add_edge(\"structure\", \"reason\")\n", + "graph.add_edge(\"reason\", END)\n", + "graph.set_entry_point(\"select\")\n", + "app = graph.compile()" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "29fe385b-cf5d-4581-80e7-55462f5628bb", + "metadata": {}, + "outputs": [], + "source": [ + "reasoning_modules = [\n", + " \"1. How could I devise an experiment to help solve that problem?\",\n", + " \"2. Make a list of ideas for solving this problem, and apply them one by one to the problem to see if any progress can be made.\",\n", + " #\"3. How could I measure progress on this problem?\",\n", + " \"4. How can I simplify the problem so that it is easier to solve?\",\n", + " \"5. What are the key assumptions underlying this problem?\",\n", + " \"6. What are the potential risks and drawbacks of each solution?\",\n", + " \"7. What are the alternative perspectives or viewpoints on this problem?\",\n", + " \"8. What are the long-term implications of this problem and its solutions?\",\n", + " \"9. How can I break down this problem into smaller, more manageable parts?\",\n", + " \"10. Critical Thinking: This style involves analyzing the problem from different perspectives, questioning assumptions, and evaluating the evidence or information available. It focuses on logical reasoning, evidence-based decision-making, and identifying potential biases or flaws in thinking.\",\n", + " \"11. Try creative thinking, generate innovative and out-of-the-box ideas to solve the problem. Explore unconventional solutions, thinking beyond traditional boundaries, and encouraging imagination and originality.\",\n", + " #\"12. Seek input and collaboration from others to solve the problem. Emphasize teamwork, open communication, and leveraging the diverse perspectives and expertise of a group to come up with effective solutions.\",\n", + " \"13. Use systems thinking: Consider the problem as part of a larger system and understanding the interconnectedness of various elements. Focuses on identifying the underlying causes, feedback loops, and interdependencies that influence the problem, and developing holistic solutions that address the system as a whole.\",\n", + " \"14. Use Risk Analysis: Evaluate potential risks, uncertainties, and tradeoffs associated with different solutions or approaches to a problem. Emphasize assessing the potential consequences and likelihood of success or failure, and making informed decisions based on a balanced analysis of risks and benefits.\",\n", + " #\"15. Use Reflective Thinking: Step back from the problem, take the time for introspection and self-reflection. Examine personal biases, assumptions, and mental models that may influence problem-solving, and being open to learning from past experiences to improve future approaches.\",\n", + " \"16. What is the core issue or problem that needs to be addressed?\",\n", + " \"17. What are the underlying causes or factors contributing to the problem?\",\n", + " \"18. Are there any potential solutions or strategies that have been tried before? If yes, what were the outcomes and lessons learned?\",\n", + " \"19. What are the potential obstacles or challenges that might arise in solving this problem?\",\n", + " \"20. Are there any relevant data or information that can provide insights into the problem? If yes, what data sources are available, and how can they be analyzed?\",\n", + " \"21. Are there any stakeholders or individuals who are directly affected by the problem? What are their perspectives and needs?\",\n", + " \"22. What resources (financial, human, technological, etc.) are needed to tackle the problem effectively?\",\n", + " \"23. How can progress or success in solving the problem be measured or evaluated?\",\n", + " \"24. What indicators or metrics can be used?\",\n", + " \"25. Is the problem a technical or practical one that requires a specific expertise or skill set? Or is it more of a conceptual or theoretical problem?\",\n", + " \"26. Does the problem involve a physical constraint, such as limited resources, infrastructure, or space?\",\n", + " \"27. Is the problem related to human behavior, such as a social, cultural, or psychological issue?\",\n", + " \"28. Does the problem involve decision-making or planning, where choices need to be made under uncertainty or with competing objectives?\",\n", + " \"29. Is the problem an analytical one that requires data analysis, modeling, or optimization techniques?\",\n", + " \"30. Is the problem a design challenge that requires creative solutions and innovation?\",\n", + " \"31. Does the problem require addressing systemic or structural issues rather than just individual instances?\",\n", + " \"32. Is the problem time-sensitive or urgent, requiring immediate attention and action?\",\n", + " \"33. What kinds of solution typically are produced for this kind of problem specification?\",\n", + " \"34. Given the problem specification and the current best solution, have a guess about other possible solutions.\"\n", + " \"35. Let’s imagine the current best solution is totally wrong, what other ways are there to think about the problem specification?\"\n", + " \"36. What is the best way to modify this current best solution, given what you know about these kinds of problem specification?\"\n", + " \"37. Ignoring the current best solution, create an entirely new solution to the problem.\"\n", + " #\"38. Let’s think step by step.\"\n", + " \"39. Let’s make a step by step plan and implement it with good notation and explanation.\"\n", + "]\n", + "\n", + "\n", + "task_example = \"Lisa has 10 apples. She gives 3 apples to her friend and then buys 5 more apples from the store. How many apples does Lisa have now?\"\n", + "\n", + "task_example = \"\"\"This SVG path element draws a:\n", + "(A) circle (B) heptagon (C) hexagon (D) kite (E) line (F) octagon (G) pentagon(H) rectangle (I) sector (J) triangle\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "6cbfbe81-f751-42da-843a-f9003ace663d", + "metadata": {}, + "outputs": [], + "source": [ + "reasoning_modules_str = \"\\n\".join(reasoning_modules)" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "d411c7aa-7017-4d67-88b5-43b5d161c34c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'select': {'selected_modules': \"To solve the task of identifying the shape drawn by the given SVG path element, the following reasoning modules are crucial:\\n\\n1. **Critical Thinking (10)**: This involves analyzing the SVG path commands and coordinates logically to understand the shape they form. It requires questioning assumptions (e.g., not assuming the shape based on a quick glance at the coordinates but rather analyzing the path commands) and evaluating the information given in the SVG path data.\\n\\n2. **Simplification (4)**: Simplifying the problem by breaking down the SVG path commands can make it easier to visualize and understand the shape being drawn. This might involve sketching the path based on the commands and coordinates or using a tool to render the SVG path.\\n\\n3. **Systems Thinking (13)**: Understanding the SVG path as part of a larger system (in this case, the SVG coordinate system and how path commands work) helps in comprehending how the individual commands come together to form a complete shape.\\n\\n4. **Analytical Problem Solving (29)**: This task requires data analysis skills to interpret the SVG path commands and coordinates. Understanding how 'M' (moveto), 'L' (lineto), and other commands work is essential for determining the shape.\\n\\n5. **Creative Thinking (11)**: While not as directly applicable as the other modules, creative thinking can aid in visualizing the shape that the path commands are intended to draw, especially if the shape is complex or if the path commands are not immediately clear.\\n\\n6. **Visualization (30)**: Although not explicitly listed, a module focused on visualization would be highly relevant here. Visualizing the path that the 'M' and 'L' commands create from the given coordinates can directly lead to identifying the shape.\\n\\nGiven the task's nature, modules focused on experimentation, risk analysis, stakeholder perspectives, and long-term implications (e.g., 1, 14, 21, 8) are less relevant. The task is primarily analytical and technical, requiring an understanding of SVG path syntax and geometry rather than broader problem-solving or decision-making strategies.\"}}\n", + "{'adapt': {'adapted_modules': \"1. **Detailed Path Analysis (10)**: This module focuses on a thorough examination of the SVG path commands and their corresponding coordinates to accurately deduce the shape they outline. It involves a critical approach where assumptions are set aside in favor of a detailed analysis of each command (e.g., 'M' for moveto, 'L' for lineto) and how these commands connect points in the SVG coordinate system to form a specific shape.\\n\\n2. **Path Decomposition (4)**: This involves breaking down the SVG path into more manageable segments or components to facilitate a clearer understanding of the overall shape. Techniques might include manually sketching the path as described by the commands and coordinates or utilizing digital tools to render the SVG path, thereby making the shape more apparent and easier to identify.\\n\\n3. **SVG System Analysis (13)**: Emphasizes the importance of understanding the SVG coordinate system and the functionality of path commands within this framework. This module is about seeing the SVG path not just as a series of commands but as part of the broader system of SVG graphics, where each command plays a specific role in shaping the final image.\\n\\n4. **Command Interpretation and Geometry (29)**: This module requires a deep dive into the syntax and semantics of SVG path commands, coupled with geometric reasoning to interpret the shape formed by these commands. Knowledge of how different commands like 'M' (moveto) and 'L' (lineto) contribute to the construction of geometric shapes is crucial for accurately identifying the shape in question.\\n\\n5. **Imaginative Visualization (11)**: While analytical skills are paramount, this module recognizes the role of creative thinking in visualizing the potential shapes that complex or ambiguous path commands might represent. It encourages thinking beyond the obvious and considering multiple geometric possibilities that fit the given path data.\\n\\n6. **Explicit Visualization (30)**: Directly focuses on the ability to visualize the trajectory formed by executing the SVG path commands, particularly 'M' and 'L'. This module is about using visualization techniques, whether mental or through software tools, to trace the path and see the resulting shape, thereby facilitating its identification.\\n\\nBy refining these modules to more directly address the task of interpreting SVG path elements, the process of identifying the drawn shape becomes more structured and focused on the specific skills and knowledge areas that are most relevant to the task.\"}}\n", + "{'structure': {'reasoning_structure': '```json\\n{\\n \"Step 1: Detailed Path Analysis\": {\\n \"Description\": \"Examine each SVG path command and its coordinates to understand the shape outline.\",\\n \"Actions\": [\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Move to starting point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"53.25,36.07\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"66.29,48.90\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"78.69,61.09\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Draw line to this point to close the shape.\"\\n }\\n ]\\n },\\n \"Step 2: Path Decomposition\": {\\n \"Description\": \"Break down the path into segments to simplify analysis.\",\\n \"Segments\": [\\n \"Segment 1: Move from (55.57,80.69) to (57.38,65.80)\",\\n \"Segment 2: Move from (57.38,65.80) to (48.90,57.46)\",\\n \"Segment 3: Move from (48.90,57.46) to (45.58,47.78)\",\\n \"Segment 4: Move from (45.58,47.78) to (53.25,36.07)\",\\n \"Segment 5: Move from (53.25,36.07) to (66.29,48.90)\",\\n \"Segment 6: Move from (66.29,48.90) to (78.69,61.09)\",\\n \"Segment 7: Move from (78.69,61.09) to (55.57,80.69)\"\\n ]\\n },\\n \"Step 3: SVG System Analysis\": {\\n \"Description\": \"Understand the role of each command within the SVG coordinate system.\",\\n \"Analysis\": [\\n {\\n \"Command\": \"M\",\\n \"Role\": \"Defines starting points for new sub-paths.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Role\": \"Creates straight lines between points.\"\\n }\\n ]\\n },\\n \"Step 4: Command Interpretation and Geometry\": {\\n \"Description\": \"Interpret the geometric shape formed by the path commands.\",\\n \"Geometric Principles\": [\\n \"Identify angles and lines created by \\'L\\' commands.\",\\n \"Determine the number of sides from the number of \\'L\\' commands.\"\\n ]\\n },\\n \"Step 5: Imaginative Visualization\": {\\n \"Description\": \"Visualize potential shapes that the path commands might represent.\",\\n \"Visualization Techniques\": [\\n \"Sketching the path based on command coordinates.\",\\n \"Mentally visualizing the path progression.\"\\n ]\\n },\\n \"Step 6: Explicit Visualization\": {\\n \"Description\": \"Use visualization tools to trace the path and see the resulting shape.\",\\n \"Tools\": [\\n \"Digital drawing software\",\\n \"SVG rendering tools\"\\n ]\\n },\\n \"Conclusion\": {\\n \"Description\": \"Based on the analysis and visualization, identify the shape.\",\\n \"Options\": [\\n \"Circle\",\\n \"Heptagon\",\\n \"Hexagon\",\\n \"Kite\",\\n \"Line\",\\n \"Octagon\",\\n \"Pentagon\",\\n \"Rectangle\",\\n \"Sector\",\\n \"Triangle\"\\n ],\\n \"Selected Option\": \"\"\\n }\\n}\\n```'}}\n", + "{'reason': {'answer': '```json\\n{\\n \"Step 1: Detailed Path Analysis\": {\\n \"Description\": \"Examine each SVG path command and its coordinates to understand the shape outline.\",\\n \"Actions\": [\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Move to starting point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"53.25,36.07\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"66.29,48.90\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"78.69,61.09\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Draw line to this point to close the shape.\"\\n }\\n ]\\n },\\n \"Step 2: Path Decomposition\": {\\n \"Description\": \"Break down the path into segments to simplify analysis.\",\\n \"Segments\": [\\n \"Segment 1: Move from (55.57,80.69) to (57.38,65.80)\",\\n \"Segment 2: Move from (57.38,65.80) to (48.90,57.46)\",\\n \"Segment 3: Move from (48.90,57.46) to (45.58,47.78)\",\\n \"Segment 4: Move from (45.58,47.78) to (53.25,36.07)\",\\n \"Segment 5: Move from (53.25,36.07) to (66.29,48.90)\",\\n \"Segment 6: Move from (66.29,48.90) to (78.69,61.09)\",\\n \"Segment 7: Move from (78.69,61.09) to (55.57,80.69)\"\\n ]\\n },\\n \"Step 3: SVG System Analysis\": {\\n \"Description\": \"Understand the role of each command within the SVG coordinate system.\",\\n \"Analysis\": [\\n {\\n \"Command\": \"M\",\\n \"Role\": \"Defines starting points for new sub-paths.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Role\": \"Creates straight lines between points.\"\\n }\\n ]\\n },\\n \"Step 4: Command Interpretation and Geometry\": {\\n \"Description\": \"Interpret the geometric shape formed by the path commands.\",\\n \"Geometric Principles\": [\\n \"Identify angles and lines created by \\'L\\' commands.\",\\n \"Determine the number of sides from the number of \\'L\\' commands.\"\\n ]\\n },\\n \"Step 5: Imaginative Visualization\": {\\n \"Description\": \"Visualize potential shapes that the path commands might represent.\",\\n \"Visualization Techniques\": [\\n \"Sketching the path based on command coordinates.\",\\n \"Mentally visualizing the path progression.\"\\n ]\\n },\\n \"Step 6: Explicit Visualization\": {\\n \"Description\": \"Use visualization tools to trace the path and see the resulting shape.\",\\n \"Tools\": [\\n \"Digital drawing software\",\\n \"SVG rendering tools\"\\n ]\\n },\\n \"Conclusion\": {\\n \"Description\": \"Based on the analysis and visualization, identify the shape.\",\\n \"Options\": [\\n \"Circle\",\\n \"Heptagon\",\\n \"Hexagon\",\\n \"Kite\",\\n \"Line\",\\n \"Octagon\",\\n \"Pentagon\",\\n \"Rectangle\",\\n \"Sector\",\\n \"Triangle\"\\n ],\\n \"Selected Option\": \"Pentagon\"\\n }\\n}\\n```'}}\n", + "{'__end__': {'reasoning_modules': '1. How could I devise an experiment to help solve that problem?\\n2. Make a list of ideas for solving this problem, and apply them one by one to the problem to see if any progress can be made.\\n4. How can I simplify the problem so that it is easier to solve?\\n5. What are the key assumptions underlying this problem?\\n6. What are the potential risks and drawbacks of each solution?\\n7. What are the alternative perspectives or viewpoints on this problem?\\n8. What are the long-term implications of this problem and its solutions?\\n9. How can I break down this problem into smaller, more manageable parts?\\n10. Critical Thinking: This style involves analyzing the problem from different perspectives, questioning assumptions, and evaluating the evidence or information available. It focuses on logical reasoning, evidence-based decision-making, and identifying potential biases or flaws in thinking.\\n11. Try creative thinking, generate innovative and out-of-the-box ideas to solve the problem. Explore unconventional solutions, thinking beyond traditional boundaries, and encouraging imagination and originality.\\n13. Use systems thinking: Consider the problem as part of a larger system and understanding the interconnectedness of various elements. Focuses on identifying the underlying causes, feedback loops, and interdependencies that influence the problem, and developing holistic solutions that address the system as a whole.\\n14. Use Risk Analysis: Evaluate potential risks, uncertainties, and tradeoffs associated with different solutions or approaches to a problem. Emphasize assessing the potential consequences and likelihood of success or failure, and making informed decisions based on a balanced analysis of risks and benefits.\\n16. What is the core issue or problem that needs to be addressed?\\n17. What are the underlying causes or factors contributing to the problem?\\n18. Are there any potential solutions or strategies that have been tried before? If yes, what were the outcomes and lessons learned?\\n19. What are the potential obstacles or challenges that might arise in solving this problem?\\n20. Are there any relevant data or information that can provide insights into the problem? If yes, what data sources are available, and how can they be analyzed?\\n21. Are there any stakeholders or individuals who are directly affected by the problem? What are their perspectives and needs?\\n22. What resources (financial, human, technological, etc.) are needed to tackle the problem effectively?\\n23. How can progress or success in solving the problem be measured or evaluated?\\n24. What indicators or metrics can be used?\\n25. Is the problem a technical or practical one that requires a specific expertise or skill set? Or is it more of a conceptual or theoretical problem?\\n26. Does the problem involve a physical constraint, such as limited resources, infrastructure, or space?\\n27. Is the problem related to human behavior, such as a social, cultural, or psychological issue?\\n28. Does the problem involve decision-making or planning, where choices need to be made under uncertainty or with competing objectives?\\n29. Is the problem an analytical one that requires data analysis, modeling, or optimization techniques?\\n30. Is the problem a design challenge that requires creative solutions and innovation?\\n31. Does the problem require addressing systemic or structural issues rather than just individual instances?\\n32. Is the problem time-sensitive or urgent, requiring immediate attention and action?\\n33. What kinds of solution typically are produced for this kind of problem specification?\\n34. Given the problem specification and the current best solution, have a guess about other possible solutions.35. Let’s imagine the current best solution is totally wrong, what other ways are there to think about the problem specification?36. What is the best way to modify this current best solution, given what you know about these kinds of problem specification?37. Ignoring the current best solution, create an entirely new solution to the problem.39. Let’s make a step by step plan and implement it with good notation and explanation.', 'task_description': 'This SVG path element draws a:\\n(A) circle (B) heptagon (C) hexagon (D) kite (E) line (F) octagon (G) pentagon(H) rectangle (I) sector (J) triangle', 'selected_modules': \"To solve the task of identifying the shape drawn by the given SVG path element, the following reasoning modules are crucial:\\n\\n1. **Critical Thinking (10)**: This involves analyzing the SVG path commands and coordinates logically to understand the shape they form. It requires questioning assumptions (e.g., not assuming the shape based on a quick glance at the coordinates but rather analyzing the path commands) and evaluating the information given in the SVG path data.\\n\\n2. **Simplification (4)**: Simplifying the problem by breaking down the SVG path commands can make it easier to visualize and understand the shape being drawn. This might involve sketching the path based on the commands and coordinates or using a tool to render the SVG path.\\n\\n3. **Systems Thinking (13)**: Understanding the SVG path as part of a larger system (in this case, the SVG coordinate system and how path commands work) helps in comprehending how the individual commands come together to form a complete shape.\\n\\n4. **Analytical Problem Solving (29)**: This task requires data analysis skills to interpret the SVG path commands and coordinates. Understanding how 'M' (moveto), 'L' (lineto), and other commands work is essential for determining the shape.\\n\\n5. **Creative Thinking (11)**: While not as directly applicable as the other modules, creative thinking can aid in visualizing the shape that the path commands are intended to draw, especially if the shape is complex or if the path commands are not immediately clear.\\n\\n6. **Visualization (30)**: Although not explicitly listed, a module focused on visualization would be highly relevant here. Visualizing the path that the 'M' and 'L' commands create from the given coordinates can directly lead to identifying the shape.\\n\\nGiven the task's nature, modules focused on experimentation, risk analysis, stakeholder perspectives, and long-term implications (e.g., 1, 14, 21, 8) are less relevant. The task is primarily analytical and technical, requiring an understanding of SVG path syntax and geometry rather than broader problem-solving or decision-making strategies.\", 'adapted_modules': \"1. **Detailed Path Analysis (10)**: This module focuses on a thorough examination of the SVG path commands and their corresponding coordinates to accurately deduce the shape they outline. It involves a critical approach where assumptions are set aside in favor of a detailed analysis of each command (e.g., 'M' for moveto, 'L' for lineto) and how these commands connect points in the SVG coordinate system to form a specific shape.\\n\\n2. **Path Decomposition (4)**: This involves breaking down the SVG path into more manageable segments or components to facilitate a clearer understanding of the overall shape. Techniques might include manually sketching the path as described by the commands and coordinates or utilizing digital tools to render the SVG path, thereby making the shape more apparent and easier to identify.\\n\\n3. **SVG System Analysis (13)**: Emphasizes the importance of understanding the SVG coordinate system and the functionality of path commands within this framework. This module is about seeing the SVG path not just as a series of commands but as part of the broader system of SVG graphics, where each command plays a specific role in shaping the final image.\\n\\n4. **Command Interpretation and Geometry (29)**: This module requires a deep dive into the syntax and semantics of SVG path commands, coupled with geometric reasoning to interpret the shape formed by these commands. Knowledge of how different commands like 'M' (moveto) and 'L' (lineto) contribute to the construction of geometric shapes is crucial for accurately identifying the shape in question.\\n\\n5. **Imaginative Visualization (11)**: While analytical skills are paramount, this module recognizes the role of creative thinking in visualizing the potential shapes that complex or ambiguous path commands might represent. It encourages thinking beyond the obvious and considering multiple geometric possibilities that fit the given path data.\\n\\n6. **Explicit Visualization (30)**: Directly focuses on the ability to visualize the trajectory formed by executing the SVG path commands, particularly 'M' and 'L'. This module is about using visualization techniques, whether mental or through software tools, to trace the path and see the resulting shape, thereby facilitating its identification.\\n\\nBy refining these modules to more directly address the task of interpreting SVG path elements, the process of identifying the drawn shape becomes more structured and focused on the specific skills and knowledge areas that are most relevant to the task.\", 'reasoning_structure': '```json\\n{\\n \"Step 1: Detailed Path Analysis\": {\\n \"Description\": \"Examine each SVG path command and its coordinates to understand the shape outline.\",\\n \"Actions\": [\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Move to starting point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"53.25,36.07\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"66.29,48.90\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"78.69,61.09\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Draw line to this point to close the shape.\"\\n }\\n ]\\n },\\n \"Step 2: Path Decomposition\": {\\n \"Description\": \"Break down the path into segments to simplify analysis.\",\\n \"Segments\": [\\n \"Segment 1: Move from (55.57,80.69) to (57.38,65.80)\",\\n \"Segment 2: Move from (57.38,65.80) to (48.90,57.46)\",\\n \"Segment 3: Move from (48.90,57.46) to (45.58,47.78)\",\\n \"Segment 4: Move from (45.58,47.78) to (53.25,36.07)\",\\n \"Segment 5: Move from (53.25,36.07) to (66.29,48.90)\",\\n \"Segment 6: Move from (66.29,48.90) to (78.69,61.09)\",\\n \"Segment 7: Move from (78.69,61.09) to (55.57,80.69)\"\\n ]\\n },\\n \"Step 3: SVG System Analysis\": {\\n \"Description\": \"Understand the role of each command within the SVG coordinate system.\",\\n \"Analysis\": [\\n {\\n \"Command\": \"M\",\\n \"Role\": \"Defines starting points for new sub-paths.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Role\": \"Creates straight lines between points.\"\\n }\\n ]\\n },\\n \"Step 4: Command Interpretation and Geometry\": {\\n \"Description\": \"Interpret the geometric shape formed by the path commands.\",\\n \"Geometric Principles\": [\\n \"Identify angles and lines created by \\'L\\' commands.\",\\n \"Determine the number of sides from the number of \\'L\\' commands.\"\\n ]\\n },\\n \"Step 5: Imaginative Visualization\": {\\n \"Description\": \"Visualize potential shapes that the path commands might represent.\",\\n \"Visualization Techniques\": [\\n \"Sketching the path based on command coordinates.\",\\n \"Mentally visualizing the path progression.\"\\n ]\\n },\\n \"Step 6: Explicit Visualization\": {\\n \"Description\": \"Use visualization tools to trace the path and see the resulting shape.\",\\n \"Tools\": [\\n \"Digital drawing software\",\\n \"SVG rendering tools\"\\n ]\\n },\\n \"Conclusion\": {\\n \"Description\": \"Based on the analysis and visualization, identify the shape.\",\\n \"Options\": [\\n \"Circle\",\\n \"Heptagon\",\\n \"Hexagon\",\\n \"Kite\",\\n \"Line\",\\n \"Octagon\",\\n \"Pentagon\",\\n \"Rectangle\",\\n \"Sector\",\\n \"Triangle\"\\n ],\\n \"Selected Option\": \"\"\\n }\\n}\\n```', 'answer': '```json\\n{\\n \"Step 1: Detailed Path Analysis\": {\\n \"Description\": \"Examine each SVG path command and its coordinates to understand the shape outline.\",\\n \"Actions\": [\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Move to starting point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"57.38,65.80\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"48.90,57.46\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"M\",\\n \"Coordinate\": \"45.58,47.78\",\\n \"Purpose\": \"Move to this point without drawing.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"53.25,36.07\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"66.29,48.90\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"78.69,61.09\",\\n \"Purpose\": \"Draw line to this point.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Coordinate\": \"55.57,80.69\",\\n \"Purpose\": \"Draw line to this point to close the shape.\"\\n }\\n ]\\n },\\n \"Step 2: Path Decomposition\": {\\n \"Description\": \"Break down the path into segments to simplify analysis.\",\\n \"Segments\": [\\n \"Segment 1: Move from (55.57,80.69) to (57.38,65.80)\",\\n \"Segment 2: Move from (57.38,65.80) to (48.90,57.46)\",\\n \"Segment 3: Move from (48.90,57.46) to (45.58,47.78)\",\\n \"Segment 4: Move from (45.58,47.78) to (53.25,36.07)\",\\n \"Segment 5: Move from (53.25,36.07) to (66.29,48.90)\",\\n \"Segment 6: Move from (66.29,48.90) to (78.69,61.09)\",\\n \"Segment 7: Move from (78.69,61.09) to (55.57,80.69)\"\\n ]\\n },\\n \"Step 3: SVG System Analysis\": {\\n \"Description\": \"Understand the role of each command within the SVG coordinate system.\",\\n \"Analysis\": [\\n {\\n \"Command\": \"M\",\\n \"Role\": \"Defines starting points for new sub-paths.\"\\n },\\n {\\n \"Command\": \"L\",\\n \"Role\": \"Creates straight lines between points.\"\\n }\\n ]\\n },\\n \"Step 4: Command Interpretation and Geometry\": {\\n \"Description\": \"Interpret the geometric shape formed by the path commands.\",\\n \"Geometric Principles\": [\\n \"Identify angles and lines created by \\'L\\' commands.\",\\n \"Determine the number of sides from the number of \\'L\\' commands.\"\\n ]\\n },\\n \"Step 5: Imaginative Visualization\": {\\n \"Description\": \"Visualize potential shapes that the path commands might represent.\",\\n \"Visualization Techniques\": [\\n \"Sketching the path based on command coordinates.\",\\n \"Mentally visualizing the path progression.\"\\n ]\\n },\\n \"Step 6: Explicit Visualization\": {\\n \"Description\": \"Use visualization tools to trace the path and see the resulting shape.\",\\n \"Tools\": [\\n \"Digital drawing software\",\\n \"SVG rendering tools\"\\n ]\\n },\\n \"Conclusion\": {\\n \"Description\": \"Based on the analysis and visualization, identify the shape.\",\\n \"Options\": [\\n \"Circle\",\\n \"Heptagon\",\\n \"Hexagon\",\\n \"Kite\",\\n \"Line\",\\n \"Octagon\",\\n \"Pentagon\",\\n \"Rectangle\",\\n \"Sector\",\\n \"Triangle\"\\n ],\\n \"Selected Option\": \"Pentagon\"\\n }\\n}\\n```'}}\n" + ] + } + ], + "source": [ + "for s in app.stream({\"task_description\": task_example, \"reasoning_modules\": reasoning_modules_str}):\n", + " print(s)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea8568d5-bdb6-45cd-8d04-1ab305786caa", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c14a291c-7c1b-43bc-807e-11180290985e", + "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.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}