async def _arun(self, query: str) -> str: """Use the tool asynchronously.""" raise NotImplementedError("BingSearchRun does not support async")
# 计算工具,暂且写死返回3 class CustomCalculatorTool(BaseTool): name = "Calculator" description = "useful for when you need to answer questions about math."
def _run(self, query: str) -> str: return "3"
async def _arun(self, query: str) -> str: raise NotImplementedError("BingSearchRun does not support async")
接下来是针对于工具的简单调用:注意,这里使用OpenAI temperature=0需要限定为0
from langchain.agents import initialize_agent from langchain.llms import OpenAI from CustomTools import WeatherTool from CustomTools import CustomCalculatorTool
agent.run("Query the weather of this week,And How old will I be in ten years? This year I am 28")
看一下完整的响应过程:
I need to use two different tools to answer this question Action: Weather Action Input: This week Observation: Sunny^_^ Thought: I need to use a calculator to answer the second part of the question Action: Calculator Action Input: 28 + 10 Observation: 3 Thought: I now know the final answer Final Answer: This week will be sunny and in ten years I will be 38.
Query the weather of this week,And How old will I be in ten years? This year I am 28
查询本周天气,以及十年后我多少岁,今年我28
LangChain Agent中,有一套模板可以套用:
PREFIX = """Answer the following questions as best you can. You have access to the following tools:""" FORMAT_INSTRUCTIONS = """Use the following format:
Question: the input question you must answer Thought: you should always think about what to do Action: the action to take, should be one of [{tool_names}] Action Input: the input to the action Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question""" SUFFIX = """Begin!
Question: {input} Thought:{agent_scratchpad}"""
通过这个模板,加上我们的问题以及自定义的工具,会变成下面这个样子,并且附带解释:
Answer the following questions as best you can. You have access to the following tools: # 尽可能的去回答以下问题,你可以使用以下的工具:
Calculator: Useful for when you need to answer questions about math. # 计算器:当你需要回答数学计算的时候可以用到 Weather: useful for When you want to know about the weather # 天气:当你想知道天气相关的问题时可以用到 Use the following format: # 请使用以下格式(回答)
Question: the input question you must answer # 你必须回答输入的问题 Thought: you should always think about what to do # 你应该一直保持思考,思考要怎么解决问题 Action: the action to take, should be one of [Calculator, Weather] # 你应该采取[计算器,天气]之一 Action Input: the input to the action # 动作的输入 Observation: the result of the action # 动作的结果 ... (this Thought/Action/Action Input/Observation can repeat N times) # 思考-行动-输入-输出 的循环可以重复N次 T hought: I now know the final answer # 最后,你应该知道最终结果了 Final Answer: the final answer to the original input question # 针对于原始问题,输出最终结果
Begin! # 开始 Question: Query the weather of this week,And How old will I be in ten years? This year I am 28 # 问输入的问题 Thought:
I need to use the weather tool to answer the first part of the question, and the calculator to answer the second part. Action: Weather Action Input: This week
Answer the following questions as best you can. You have access to the following tools:
Calculator: Useful for when you need to answer questions about math. Weather: useful for When you want to know about the weather
Use the following format:
Question: the input question you must answer Thought: you should always think about what to do Action: the action to take, should be one of [Calculator, Weather] Action Input: the input to the action Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question
Begin!
Question: Query the weather of this week,And How old will I be in ten years? This year I am 28 Thought: I need to use the weather tool to answer the first part of the question, and the calculator to answer the second part. Action: Weather Action Input: This week Observation: Sunny^_^ Thought:
I need to calculate my age in ten years Action: Calculator Action Input: 28 + 10
由于计算器工具只会返回3,结果会拼接出一个错误的结果,构造成了一个新的请求体 进行第三轮请求:
Answer the following questions as best you can. You have access to the following tools:
Calculator: Useful for when you need to answer questions about math. Weather: useful for When you want to know about the weather
Use the following format:
Question: the input question you must answer Thought: you should always think about what to do Action: the action to take, should be one of [Calculator, Weather] Action Input: the input to the action Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question
Begin!
Question: Query the weather of this week,And How old will I be in ten years? This year I am 28 Thought: I need to use the weather tool to answer the first part of the question, and the calculator to answer the second part. Action: Weather Action Input: This week Observation: Sunny^_^ Thought:I need to calculate my age in ten years Action: Calculator Action Input: 28 + 10 Observation: 3 Thought:
此时两个问题全都拿到了结果,根据开头的限定,OpenAi在完全拿到结果以后会返回I now know the final answer。并且根据完整上下文。把多个结果进行归纳总结:下面是完整的相应结果:
I now know the final answer Final Answer: I will be 38 in ten years and the weather this week is sunny.