{"cells":[{"cell_type":"markdown","id":"ba5f8741","metadata":{},"source":["# 自定义多动作代理\n","\n","本笔记本介绍如何创建自定义代理。\n","\n","代理包括两个部分:\n","\n","- 工具:代理可用的工具。\n","- 代理类本身:决定采取哪种行动。\n","\n","在本笔记本中,我们将介绍如何创建一个可以预测/一次执行多个步骤的自定义代理。"]},{"cell_type":"code","execution_count":1,"id":"9af9734e","metadata":{},"outputs":[],"source":["# 导入所需的模块\n","from langchain.agents import AgentExecutor, BaseMultiActionAgent, Tool\n","from langchain_community.utilities import SerpAPIWrapper"]},{"cell_type":"code","execution_count":2,"id":"d7c4ebdc","metadata":{},"outputs":[],"source":["# 定义一个函数,函数名为random_word,接受一个字符串类型的参数query,返回一个字符串类型的结果\n","def random_word(query: str) -> str:\n"," # 打印一条消息,表示当前正在执行这个函数\n"," print(\"\\nNow I'm doing this!\")\n"," # 返回字符串\"foo\"\n"," return \"foo\""]},{"cell_type":"code","execution_count":3,"id":"becda2a1","metadata":{},"outputs":[],"source":["# 创建一个SerpAPIWrapper对象\n","search = SerpAPIWrapper()\n","\n","# 创建一个包含两个Tool对象的列表\n","tools = [\n"," Tool(\n"," name=\"Search\", # 工具名称为\"Search\"\n"," func=search.run, # 调用search对象的run方法\n"," description=\"useful for when you need to answer questions about current events\", # 描述为\"在需要回答有关当前事件的问题时很有用\"\n"," ),\n"," Tool(\n"," name=\"RandomWord\", # 工具名称为\"RandomWord\"\n"," func=random_word, # 调用random_word函数\n"," description=\"call this to get a random word.\", # 描述为\"调用此函数以获取一个随机单词\"\n"," ),\n","]"]},{"cell_type":"code","execution_count":4,"id":"a33e2f7e","metadata":{},"outputs":[],"source":["from typing import Any, List, Tuple, Union\n","\n","from langchain_core.agents import AgentAction, AgentFinish\n","\n","\n","class FakeAgent(BaseMultiActionAgent):\n"," \"\"\"Fake Custom Agent.\"\"\"\n","\n"," @property\n"," def input_keys(self):\n"," return [\"input\"]\n","\n"," def plan(\n"," self, intermediate_steps: List[Tuple[AgentAction, str]], **kwargs: Any\n"," ) -> Union[List[AgentAction], AgentFinish]:\n"," \"\"\"Given input, decided what to do.\n","\n"," Args:\n"," intermediate_steps: Steps the LLM has taken to date,\n"," along with observations\n"," **kwargs: User inputs.\n","\n"," Returns:\n"," Action specifying what tool to use.\n"," \"\"\"\n"," if len(intermediate_steps) == 0:\n"," return [\n"," AgentAction(tool=\"Search\", tool_input=kwargs[\"input\"], log=\"\"),\n"," AgentAction(tool=\"RandomWord\", tool_input=kwargs[\"input\"], log=\"\"),\n"," ]\n"," else:\n"," return AgentFinish(return_values={\"output\": \"bar\"}, log=\"\")\n","\n"," async def aplan(\n"," self, intermediate_steps: List[Tuple[AgentAction, str]], **kwargs: Any\n"," ) -> Union[List[AgentAction], AgentFinish]:\n"," \"\"\"Given input, decided what to do.\n","\n"," Args:\n"," intermediate_steps: Steps the LLM has taken to date,\n"," along with observations\n"," **kwargs: User inputs.\n","\n"," Returns:\n"," Action specifying what tool to use.\n"," \"\"\"\n"," if len(intermediate_steps) == 0:\n"," return [\n"," AgentAction(tool=\"Search\", tool_input=kwargs[\"input\"], log=\"\"),\n"," AgentAction(tool=\"RandomWord\", tool_input=kwargs[\"input\"], log=\"\"),\n"," ]\n"," else:\n"," return AgentFinish(return_values={\"output\": \"bar\"}, log=\"\")"]},{"cell_type":"code","execution_count":5,"id":"655d72f6","metadata":{},"outputs":[],"source":["# 创建一个名为agent的FakeAgent对象\n","agent = FakeAgent()"]},{"cell_type":"code","execution_count":6,"id":"490604e9","metadata":{},"outputs":[],"source":["# 创建一个AgentExecutor对象,使用from_agent_and_tools方法,传入agent和tools参数,并设置verbose为True\n","agent_executor = AgentExecutor.from_agent_and_tools(\n"," agent=agent, tools=tools, verbose=True\n",")"]},{"cell_type":"code","execution_count":7,"id":"653b1617","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;3mThe current population of Canada is 38,669,152 as of Monday, April 24, 2023, based on Worldometer elaboration of the latest United Nations data.\u001b[0m\u001b[32;1m\u001b[1;3m\u001b[0m\n","Now I'm doing this!\n","\u001b[33;1m\u001b[1;3mfoo\u001b[0m\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":["# 调用agent_executor的run方法,并传入参数\"How many people live in canada as of 2023?\"\n","agent_executor.run(\"How many people live in canada as of 2023?\")"]},{"cell_type":"code","execution_count":null,"id":"adefb4c2","metadata":{},"outputs":[],"source":[]}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.3"},"vscode":{"interpreter":{"hash":"18784188d7ecd866c0586ac068b02361a6896dc3a29b64f5cc957f09c590acef"}}},"nbformat":4,"nbformat_minor":5}