自定义多动作代理
本笔记本介绍如何创建自己的自定义代理。
代理由两部分组成:
- 工具:代理可用的工具。
- 代理类本身:决定采取哪种动作。
在本笔记本中,我们将介绍如何创建一个可以预测/一次执行多个步骤的自定义代理。
from langchain.agents import Tool, AgentExecutor, BaseMultiActionAgent
from langchain import OpenAI, SerpAPIWrapper
API 参考:
- Tool 来自
langchain.agents
- AgentExecutor 来自
langchain.agents
- BaseMultiActionAgent 来自
langchain.agents
def random_word(query: str) -> str:
print("\n现在我正在执行这个操作!")
return "foo"
search = SerpAPIWrapper()
tools = [
Tool(
name="Search",
func=search.run,
description="当你需要回答关于当前事件的问题时很有用",
),
Tool(
name="RandomWord",
func=random_word,
description="调用此函数以获取一个随机单词。",
),
]
from typing import List, Tuple, Any, Union
from langchain.schema import AgentAction, AgentFinish
class FakeAgent(BaseMultiActionAgent):
"""虚拟自定义代理。"""
@property
def input_keys(self):
return ["input"]
def plan(
self, intermediate_steps: List[Tuple[AgentAction, str]], **kwargs: Any
) -> Union[List[AgentAction], AgentFinish]:
"""给定输入,决定要做什么。
参数:
intermediate_steps: LLM 到目前为止所采取的步骤,以及观察结果
**kwargs: 用户输入。
返回:
指定要使用的工具的动作。
"""
if len(intermediate_steps) == 0:
return [
AgentAction(tool="Search", tool_input=kwargs["input"], log=""),
AgentAction(tool="RandomWord", tool_input=kwargs["input"], log=""),
]
else:
return AgentFinish(return_values={"output": "bar"}, log="")
async def aplan(
self, intermediate_steps: List[Tuple[AgentAction, str]], **kwargs: Any
) -> Union[List[AgentAction], AgentFinish]:
"""给定输入,决定要做什么。
参数:
intermediate_steps: LLM 到目前为止所采取的步骤,以及观察结果
**kwargs: 用户输入。
返回:
指定要使用的工具的动作。
"""
if len(intermediate_steps) == 0:
return [
AgentAction(tool="Search", tool_input=kwargs["input"], log=""),
AgentAction(tool="RandomWord", tool_input=kwargs["input"], log=""),
]
else:
return AgentFinish(return_values={"output": "bar"}, log="")
API 参考:
- AgentAction 来自
langchain.schema
- AgentFinish 来自
langchain.schema
agent = FakeAgent()
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent, tools=tools, verbose=True
)
agent_executor.run("截至2023年加拿大有多少人口?")
> 进入新的 AgentExecutor 链...
加拿大的当前人口为38,669,152,截至2023年4月24日星期一,根据世界计量器对最新联合国数据的阐述。
现在我正在执行这个操作!
foo
> 完成链。
'bar'