{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'22222, lizhen'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 测试,自定义tool,一个输入\n", "from langchain.agents import load_tools, AgentExecutor\n", "from langchain.agents import AgentType\n", "from pydantic import BaseModel, Field\n", "from langchain.tools import Tool\n", "\n", "class SingleInput(BaseModel):\n", " msg: str = Field()\n", "\n", "def singleInputAddLizhen(msg):\n", " return msg+\", lizhen\"\n", "\n", "singleTool = Tool.from_function(\n", " name = \"SingleInput\",\n", " func=singleInputAddLizhen,\n", " description=\"数字相加\",\n", " args_schema=SingleInput,\n", " return_direct=False\n", ")\n", "\n", "singleTool.run(tool_input=\"22222\")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'result=3'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 测试,自定义tool,多个输入\n", "from langchain.tools import StructuredTool\n", "\n", "class MultiInput(BaseModel):\n", " a: int = Field()\n", " b: int = Field()\n", " \n", "def multiInput(a, b) -> str:\n", " return f\"result={a+b}\"\n", "\n", "multiTool = StructuredTool.from_function(\n", " name = \"MultiInput\",\n", " func=multiInput,\n", " description=\"多个输入,数字相加\",\n", " args_schema=MultiInput,\n", " return_direct=True\n", ")\n", "\n", "multiTool.run(tool_input={\"a\":1, \"b\":2})" ] }, { "cell_type": "code", "execution_count": 4, "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\u001b[0m\u001b[36;1m\u001b[1;3mresult=3\u001b[0m\n", "\n", "\u001b[1m> Finished chain.\u001b[0m\n" ] }, { "data": { "text/plain": [ "'result=3'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#自定义代理\n", "from langchain.agents import Tool, AgentExecutor, BaseSingleActionAgent\n", "from typing import List, Tuple, Any, Union\n", "from langchain.schema import AgentAction, AgentFinish\n", "\n", "class LizhenAgent(BaseSingleActionAgent):\n", " \"\"\"自定义代理\"\"\"\n", " \n", " @property\n", " def input_keys(self):\n", " return [\"input\"]\n", " \n", " def plan(\n", " self,\n", " intermediate_steps: List[Tuple[AgentAction, str]],\n", " **kwargs: Any,\n", " ) -> Union[AgentAction, AgentFinish]:\n", " return AgentAction(tool=\"MultiInput\", tool_input=kwargs[\"input\"], log=\"\")\n", " \n", " def aplan(\n", " self,\n", " intermediate_steps: List[Tuple[AgentAction, str]],\n", " **kwargs: Any,\n", " ) -> Union[AgentAction, AgentFinish]:\n", " return AgentAction(tool=\"MultiInput\", tool_input=kwargs[\"input\"], log=\"\")\n", " \n", "agent = LizhenAgent()\n", "tools = [multiTool, singleTool]\n", "agent_executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools, verbose=True)\n", "agent_executor.run(input={\"a\":1, \"b\":2})" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'BaseMultiActionAgent , run tool1'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from langchain.tools import tool\n", "\n", "@tool\n", "def tool1(event) -> str:\n", " \"\"\"这里必须添加描述,不然AssertionError: Function must have a docstring if description not provided.\"\"\"\n", " return f\"BaseMultiActionAgent , {event}\"\n", "\n", "tool1.run(\"run tool1\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'BaseMultiActionAgent , run tool2'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from langchain.tools import tool\n", "\n", "@tool\n", "def tool2(event) -> str:\n", " \"\"\"这里必须添加描述,不然AssertionError: Function must have a docstring if description not provided.\"\"\"\n", " return f\"BaseMultiActionAgent , {event}\"\n", "\n", "tool2.run(\"run tool2\")" ] }, { "cell_type": "code", "execution_count": 7, "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\u001b[0mMultiInput is not a valid tool, try another one.\u001b[32;1m\u001b[1;3m\u001b[0mSingleInput is not a valid tool, try another one.\u001b[32;1m\u001b[1;3m\u001b[0m\n", "\n", "\u001b[1m> Finished chain.\u001b[0m\n" ] }, { "data": { "text/plain": [ "'bar'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#自定义代理\n", "from langchain.agents import Tool, AgentExecutor, BaseMultiActionAgent\n", "from typing import List, Tuple, Any, Union\n", "from langchain.schema import AgentAction, AgentFinish\n", "\n", "class LizhenMultiAgent(BaseMultiActionAgent):\n", " \"\"\"自定义代理\"\"\"\n", " \n", " @property\n", " def input_keys(self):\n", " return [\"input\"]\n", " \n", " def plan(\n", " self,\n", " intermediate_steps: List[Tuple[AgentAction, str]],\n", " **kwargs: Any,\n", " ) -> Union[AgentAction, AgentFinish]:\n", " if len(intermediate_steps) == 0:\n", " return [AgentAction(tool=\"MultiInput\", tool_input=kwargs[\"input\"], log=\"\"), AgentAction(tool=\"SingleInput\", tool_input=kwargs[\"input\"], log=\"\")]\n", " else:\n", " return AgentFinish(return_values={\"output\": \"bar\"}, log=\"\")\n", " def aplan(\n", " self,\n", " intermediate_steps: List[Tuple[AgentAction, str]],\n", " **kwargs: Any,\n", " ) -> Union[AgentAction, AgentFinish]:\n", " if len(intermediate_steps) == 0:\n", " return [AgentAction(tool=\"MultiInput\", tool_input=kwargs[\"input\"], log=\"\"), AgentAction(tool=\"SingleInput\", tool_input=kwargs[\"input\"], log=\"\")]\n", " else:\n", " return AgentFinish(return_values={\"output\": \"bar\"}, log=\"\")\n", " \n", "multiAgent = LizhenMultiAgent()\n", "multiTools = [tool1, tool2]\n", "multi_agent_executor = AgentExecutor.from_agent_and_tools(agent=multiAgent, tools=multiTools, verbose=True)\n", "multi_agent_executor.run(input={\"a\":1, \"b\":2})" ] } ], "metadata": { "kernelspec": { "display_name": "base", "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.10" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }