From 48ae981d69681d3f5848ce47591093ed483fe7ab Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Sun, 25 Dec 2022 09:52:48 -0500 Subject: [PATCH] Harrison/multi input tools (#421) add documentation on how to use tools that require multiple inputs --- docs/examples/agents.rst | 2 + docs/examples/agents/multi_input_tool.ipynb | 136 ++++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 docs/examples/agents/multi_input_tool.ipynb diff --git a/docs/examples/agents.rst b/docs/examples/agents.rst index b8e8077fe54..80bcc4500d6 100644 --- a/docs/examples/agents.rst +++ b/docs/examples/agents.rst @@ -9,6 +9,8 @@ The first category of how-to guides here cover specific parts of working with ag `Custom Agent `_: How to create a custom agent (specifically, a custom LLM + prompt to drive that agent). +`Multi Input Tools `_: How to use a tool that requires multiple inputs with an agent. + The next set of examples are all end-to-end agents for specific applications. In all examples there is an Agent with a particular set of tools. diff --git a/docs/examples/agents/multi_input_tool.ipynb b/docs/examples/agents/multi_input_tool.ipynb new file mode 100644 index 00000000000..d92915619c1 --- /dev/null +++ b/docs/examples/agents/multi_input_tool.ipynb @@ -0,0 +1,136 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "87455ddb", + "metadata": {}, + "source": [ + "# Multi Input Tools\n", + "\n", + "This notebook shows how to use a tool that requires multiple inputs with an agent.\n", + "\n", + "The difficulty in doing so comes from the fact that an agent decides it's next step from a language model, which outputs a string. So if that step requires multiple inputs, they need to be parsed from that. Therefor, the currently supported way to do this is write a smaller wrapper function that parses that a string into multiple inputs.\n", + "\n", + "For a concrete example, let's work on giving an agent access to a multiplication function, which takes as input two integers. In order to use this, we will tell the agent to generate the \"Action Input\" as a comma separated list of length two. We will then write a thin wrapper that takes a string, splits it into two around a comma, and passes both parsed sides as integers to the multiplication function." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "291149b6", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.llms import OpenAI\n", + "from langchain.agents import initialize_agent, Tool" + ] + }, + { + "cell_type": "markdown", + "id": "71b6bead", + "metadata": {}, + "source": [ + "Here is the multiplication function, as well as a wrapper to parse a string as input." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f0b82020", + "metadata": {}, + "outputs": [], + "source": [ + "def multiplier(a, b):\n", + " return a * b\n", + "\n", + "def parsing_multiplier(string):\n", + " a, b = string.split(\",\")\n", + " return multiplier(int(a), int(b))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6db1d43f", + "metadata": {}, + "outputs": [], + "source": [ + "llm = OpenAI(temperature=0)\n", + "tools = [\n", + " Tool(\n", + " name = \"Multiplier\",\n", + " func=parsing_multiplier,\n", + " description=\"useful for when you need to multiply two numbers together. The input to this tool should be a comma separated list of numbers of length two, representing the two numbers you want to multiply together. For example, `1,2` would be the input if you wanted to multiply 1 by 2.\"\n", + " )\n", + "]\n", + "mrkl = initialize_agent(tools, llm, agent=\"zero-shot-react-description\", verbose=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "aa25d0ca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n", + "\u001b[32;1m\u001b[1;3m I need to multiply two numbers\n", + "Action: Multiplier\n", + "Action Input: 3,4\u001b[0m\n", + "Observation: \u001b[36;1m\u001b[1;3m12\u001b[0m\n", + "Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n", + "Final Answer: 3 times 4 is 12\u001b[0m\n", + "\u001b[1m> Finished AgentExecutor chain.\u001b[0m\n" + ] + }, + { + "data": { + "text/plain": [ + "'3 times 4 is 12'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mrkl.run(\"What is 3 times 4\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ea340c0", + "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.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}