From 8d4b95afa8d10c5ffbbad3e20811956492ec9cf4 Mon Sep 17 00:00:00 2001 From: Chester Curme Date: Fri, 26 Jul 2024 11:22:01 -0400 Subject: [PATCH] add section --- examples/agent_executor/many_tools.ipynb | 177 ++++++++++++++++++++++- 1 file changed, 170 insertions(+), 7 deletions(-) diff --git a/examples/agent_executor/many_tools.ipynb b/examples/agent_executor/many_tools.ipynb index 00aebc53c..6bd9272d2 100644 --- a/examples/agent_executor/many_tools.ipynb +++ b/examples/agent_executor/many_tools.ipynb @@ -110,7 +110,11 @@ "from langchain_openai import OpenAIEmbeddings\n", "\n", "tool_documents = [\n", - " Document(page_content=tool.description, id=id)\n", + " Document(\n", + " page_content=tool.description,\n", + " id=id,\n", + " metadata={\"tool_name\": tool.name},\n", + " )\n", " for id, tool in tool_registry.items()\n", "]\n", "\n", @@ -239,7 +243,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "['3a42d402-4f6f-44ce-9ff4-d53d50f5f24a', '42aafb13-52e4-402b-80aa-db5be2e0e40f', '275bcddc-a918-4688-938f-9d2d6f232757', 'abc00b37-e0fa-470f-98d7-f055cc29a11f']\n" + "['ed32d6f0-76c8-42ad-9ddb-eb28ab73cba3', 'ab4b0a2d-e535-419d-8d8b-d1e1cc6a410b', 'da70a795-fd64-474d-be7f-d39314255f6c', '3f605f81-bcd0-4bae-848b-fcae0b2115be']\n" ] } ], @@ -262,8 +266,8 @@ "Can you give me some information about AMD in 2022?\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " Advanced_Micro_Devices (call_oXCnqxGmzQaP4OTEWvPghiKR)\n", - " Call ID: call_oXCnqxGmzQaP4OTEWvPghiKR\n", + " Advanced_Micro_Devices (call_RhGe3Zhp9ENphSC8Pusd7ZWe)\n", + " Call ID: call_RhGe3Zhp9ENphSC8Pusd7ZWe\n", " Args:\n", " year: 2022\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", @@ -281,6 +285,167 @@ " message.pretty_print()" ] }, + { + "cell_type": "markdown", + "id": "3bd847ef-4627-4fc2-99f9-c2b17cf83f95", + "metadata": {}, + "source": [ + "## Repeating tool selection\n", + "\n", + "To manage errors from incorrect tool selection, we could revisit the `select_tools` node. One option for implementing this is to modify `select_tools` to generate the vector store query using all messages in the state (e.g., with a chat model) and add an edge routing from `tools` to `select_tools`.\n", + "\n", + "We implement this change below. For demonstration purposes, we simulate an error in the initial tool selection by adding a `hack_remove_tool_condition` to the `select_tools` node, which removes the correct tool on the first iteration of the node. Note that on the second iteration, the agent finishes the run as it has access to the correct tool." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1954a5f1-91e4-4b32-9be9-c8bc1cc43cb5", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.messages import HumanMessage, SystemMessage, ToolMessage\n", + "from langchain_core.pydantic_v1 import BaseModel, Field\n", + "\n", + "\n", + "class QueryForTools(BaseModel):\n", + " \"\"\"Generate a query for additional tools.\"\"\"\n", + "\n", + " query: str = Field(..., description=\"Query for additional tools.\")\n", + "\n", + "\n", + "def select_tools(state: State):\n", + " last_message = state[\"messages\"][-1]\n", + " hack_remove_tool_condition = False\n", + " if isinstance(last_message, HumanMessage):\n", + " query = last_message.content\n", + " hack_remove_tool_condition = True\n", + " else:\n", + " assert isinstance(last_message, ToolMessage)\n", + " system = SystemMessage(\n", + " \"Given this conversation, generate a query for additional tools. \"\n", + " \"The query should be a short string containing what type of information \"\n", + " \"is needed. If no further information is needed, \"\n", + " \"set more_information_needed False and populate a blank string for the query.\"\n", + " )\n", + " input_messages = [system] + state[\"messages\"]\n", + " response = llm.bind_tools(\n", + " [QueryForTools], tool_choice=True\n", + " ).invoke(input_messages)\n", + " query = response.tool_calls[0][\"args\"][\"query\"]\n", + " tool_documents = vector_store.similarity_search(query)\n", + " if hack_remove_tool_condition:\n", + " # Remove needed tool\n", + " selected_tools = [\n", + " document.id\n", + " for document in tool_documents\n", + " if document.metadata[\"tool_name\"] != \"Advanced_Micro_Devices\"\n", + " ]\n", + " else:\n", + " selected_tools = [document.id for document in tool_documents]\n", + " return {\"selected_tools\": selected_tools}\n", + "\n", + "\n", + "graph_builder = StateGraph(State)\n", + "graph_builder.add_node(\"agent\", agent)\n", + "graph_builder.add_node(\"select_tools\", select_tools)\n", + "\n", + "tool_node = ToolNode(tools=tools)\n", + "graph_builder.add_node(\"tools\", tool_node)\n", + "\n", + "graph_builder.add_conditional_edges(\n", + " \"agent\",\n", + " tools_condition,\n", + ")\n", + "graph_builder.add_edge(\"tools\", \"select_tools\")\n", + "graph_builder.add_edge(\"select_tools\", \"agent\")\n", + "graph_builder.add_edge(START, \"select_tools\")\n", + "graph = graph_builder.compile()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9110789a-843a-4c21-aeff-8841b24f7674", + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.display import Image, display\n", + "\n", + "try:\n", + " display(Image(graph.get_graph().draw_mermaid_png()))\n", + "except Exception:\n", + " # This requires some extra dependencies and is optional\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "bee04c3d-0e36-4443-b0c8-10986a5f6e39", + "metadata": {}, + "outputs": [], + "source": [ + "user_input = \"Can you give me some information about AMD in 2022?\"\n", + "\n", + "result = graph.invoke({\"messages\": [(\"user\", user_input)]})" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "92ba9195-52d4-46c3-b811-8e00a9d61480", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================\u001b[1m Human Message \u001b[0m=================================\n", + "\n", + "Can you give me some information about AMD in 2022?\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "Tool Calls:\n", + " Accenture (call_ytesTjST6vxetxsQQmVKDjyJ)\n", + " Call ID: call_ytesTjST6vxetxsQQmVKDjyJ\n", + " Args:\n", + " year: 2022\n", + "=================================\u001b[1m Tool Message \u001b[0m=================================\n", + "Name: Accenture\n", + "\n", + "Accenture had revenues of $100 in 2022.\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "Tool Calls:\n", + " Advanced_Micro_Devices (call_16WW5BuJtX0uLylLcawxrDcI)\n", + " Call ID: call_16WW5BuJtX0uLylLcawxrDcI\n", + " Args:\n", + " year: 2022\n", + "=================================\u001b[1m Tool Message \u001b[0m=================================\n", + "Name: Advanced_Micro_Devices\n", + "\n", + "Advanced Micro Devices had revenues of $100 in 2022.\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "In 2022, AMD had revenues of $100 and Accenture had revenues of $100.\n" + ] + } + ], + "source": [ + "for message in result[\"messages\"]:\n", + " message.pretty_print()" + ] + }, { "cell_type": "markdown", "id": "177aedfa-cec5-45d0-82ad-efc0233aa6b4", @@ -290,9 +455,7 @@ "\n", "This guide provides a minimal implementation for dynamically selecting tools. There is a host of possible improvements and optimizations:\n", "\n", - "- **Repeating tool selection**: To manage errors from incorrect tool selection, we could revisit the `select_tools` node. Options include:\n", - " - Modify `select_tools` to generate the vector store query using all messages in the state (e.g., with a chat model) and add an edge routing from `tools` to `select_tools`;\n", - " - Equip the agent with a `reselect_tools` tool, allowing it to re-select tools at its discretion.\n", + "- **Repeating tool selection**: Here, we repeated tool selection by modifying the `select_tools` node. Another option is to equip the agent with a `reselect_tools` tool, allowing it to re-select tools at its discretion.\n", "- **Optimizing tool selection**: In general, the full scope of [retrieval solutions](https://python.langchain.com/v0.2/docs/concepts/#retrieval) are available for tool selection. Additional options include:\n", " - Group tools and retrieve over groups;\n", " - Use a chat model to select tools or groups of tool."