Add human as a tool (#1879)

Human can help AI.  #1871
This commit is contained in:
Eric Zhu 2023-03-22 20:14:52 -07:00 committed by GitHub
parent 50626a10ee
commit b3be83c750
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 378 additions and 0 deletions

View File

@ -0,0 +1,344 @@
{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Human as a tool\n",
"\n",
"Human are AGI so they can certainly be used as a tool to help out AI agent \n",
"when it is confused."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"from langchain.chat_models import ChatOpenAI\n",
"from langchain.llms import OpenAI\n",
"from langchain.agents import load_tools, initialize_agent\n",
"\n",
"llm = ChatOpenAI(temperature=0.0)\n",
"math_llm = OpenAI(temperature=0.0)\n",
"tools = load_tools(\n",
" [\"human\", \"llm-math\"], \n",
" llm=math_llm, \n",
" prompt_func=lambda s: sys.stdout.write(s + \"\\n\"), \n",
" input_func=input,\n",
")\n",
"\n",
"agent_chain = initialize_agent(\n",
" tools,\n",
" llm,\n",
" agent=\"zero-shot-react-description\",\n",
" verbose=True,\n",
")"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"In the above code you can see the tool takes input directly from command line.\n",
"You can customize `prompt_func` and `input_func` according to your need."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"\n",
"\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
"\n",
"\n",
"\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
"Prompt after formatting:\n",
"\u001b[32;1m\u001b[1;3mAnswer the following questions as best you can. You have access to the following tools:\n",
"\n",
"Human: A human. Useful for clarification, confirmation, or anything other tools cannot help.Input should be a question you need help with.\n",
"Calculator: Useful for when you need to answer questions about math.\n",
"\n",
"Use the following format:\n",
"\n",
"Question: the input question you must answer\n",
"Thought: you should always think about what to do\n",
"Action: the action to take, should be one of [Human, Calculator]\n",
"Action Input: the input to the action\n",
"Observation: the result of the action\n",
"... (this Thought/Action/Action Input/Observation can repeat N times)\n",
"Thought: I now know the final answer\n",
"Final Answer: the final answer to the original input question\n",
"\n",
"Begin!\n",
"\n",
"Question: What is Eric Zhu's birthday?\n",
"Thought:\u001b[0m\n",
"\n",
"\u001b[1m> Finished chain.\u001b[0m\n",
"\u001b[32;1m\u001b[1;3mI don't have any information on Eric Zhu's birthday, so I'll need to ask a human.\n",
"Action: Human\n",
"Action Input: \"Do you know Eric Zhu's birthday?\"\u001b[0mDo you know Eric Zhu's birthday?\n",
"\n",
"Observation: \u001b[36;1m\u001b[1;3mYes\u001b[0m\n",
"Thought:\n",
"\n",
"\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
"Prompt after formatting:\n",
"\u001b[32;1m\u001b[1;3mAnswer the following questions as best you can. You have access to the following tools:\n",
"\n",
"Human: A human. Useful for clarification, confirmation, or anything other tools cannot help.Input should be a question you need help with.\n",
"Calculator: Useful for when you need to answer questions about math.\n",
"\n",
"Use the following format:\n",
"\n",
"Question: the input question you must answer\n",
"Thought: you should always think about what to do\n",
"Action: the action to take, should be one of [Human, Calculator]\n",
"Action Input: the input to the action\n",
"Observation: the result of the action\n",
"... (this Thought/Action/Action Input/Observation can repeat N times)\n",
"Thought: I now know the final answer\n",
"Final Answer: the final answer to the original input question\n",
"\n",
"Begin!\n",
"\n",
"Question: What is Eric Zhu's birthday?\n",
"Thought:I don't have any information on Eric Zhu's birthday, so I'll need to ask a human.\n",
"Action: Human\n",
"Action Input: \"Do you know Eric Zhu's birthday?\"\n",
"Observation: Yes\n",
"Thought:\u001b[0m\n",
"\n",
"\u001b[1m> Finished chain.\u001b[0m\n",
"\u001b[32;1m\u001b[1;3mGreat, now I just need to wait for the human to provide the answer.\n",
"Action: Human\n",
"Action Input: \"What is Eric Zhu's birthday?\"\u001b[0mWhat is Eric Zhu's birthday?\n",
"\n",
"Observation: \u001b[36;1m\u001b[1;3mIt's today\u001b[0m\n",
"Thought:\n",
"\n",
"\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
"Prompt after formatting:\n",
"\u001b[32;1m\u001b[1;3mAnswer the following questions as best you can. You have access to the following tools:\n",
"\n",
"Human: A human. Useful for clarification, confirmation, or anything other tools cannot help.Input should be a question you need help with.\n",
"Calculator: Useful for when you need to answer questions about math.\n",
"\n",
"Use the following format:\n",
"\n",
"Question: the input question you must answer\n",
"Thought: you should always think about what to do\n",
"Action: the action to take, should be one of [Human, Calculator]\n",
"Action Input: the input to the action\n",
"Observation: the result of the action\n",
"... (this Thought/Action/Action Input/Observation can repeat N times)\n",
"Thought: I now know the final answer\n",
"Final Answer: the final answer to the original input question\n",
"\n",
"Begin!\n",
"\n",
"Question: What is Eric Zhu's birthday?\n",
"Thought:I don't have any information on Eric Zhu's birthday, so I'll need to ask a human.\n",
"Action: Human\n",
"Action Input: \"Do you know Eric Zhu's birthday?\"\n",
"Observation: Yes\n",
"Thought:Great, now I just need to wait for the human to provide the answer.\n",
"Action: Human\n",
"Action Input: \"What is Eric Zhu's birthday?\"\n",
"Observation: It's today\n",
"Thought:\u001b[0m\n",
"\n",
"\u001b[1m> Finished chain.\u001b[0m\n",
"\u001b[32;1m\u001b[1;3mI need to confirm if the human is sure about the answer.\n",
"Action: Human\n",
"Action Input: \"Are you sure it's today?\"\u001b[0mAre you sure it's today?\n",
"\n",
"Observation: \u001b[36;1m\u001b[1;3m\u001b[0m\n",
"Thought:\n",
"\n",
"\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
"Prompt after formatting:\n",
"\u001b[32;1m\u001b[1;3mAnswer the following questions as best you can. You have access to the following tools:\n",
"\n",
"Human: A human. Useful for clarification, confirmation, or anything other tools cannot help.Input should be a question you need help with.\n",
"Calculator: Useful for when you need to answer questions about math.\n",
"\n",
"Use the following format:\n",
"\n",
"Question: the input question you must answer\n",
"Thought: you should always think about what to do\n",
"Action: the action to take, should be one of [Human, Calculator]\n",
"Action Input: the input to the action\n",
"Observation: the result of the action\n",
"... (this Thought/Action/Action Input/Observation can repeat N times)\n",
"Thought: I now know the final answer\n",
"Final Answer: the final answer to the original input question\n",
"\n",
"Begin!\n",
"\n",
"Question: What is Eric Zhu's birthday?\n",
"Thought:I don't have any information on Eric Zhu's birthday, so I'll need to ask a human.\n",
"Action: Human\n",
"Action Input: \"Do you know Eric Zhu's birthday?\"\n",
"Observation: Yes\n",
"Thought:Great, now I just need to wait for the human to provide the answer.\n",
"Action: Human\n",
"Action Input: \"What is Eric Zhu's birthday?\"\n",
"Observation: It's today\n",
"Thought:I need to confirm if the human is sure about the answer.\n",
"Action: Human\n",
"Action Input: \"Are you sure it's today?\"\n",
"Observation: \n",
"Thought:\u001b[0m\n",
"\n",
"\u001b[1m> Finished chain.\u001b[0m\n",
"\u001b[32;1m\u001b[1;3mThe human confirmed that it's today, but I still need to verify it with a calculator.\n",
"Action: Calculator\n",
"Action Input: Today's date\u001b[0m\n",
"\n",
"\u001b[1m> Entering new LLMMathChain chain...\u001b[0m\n",
"Today's date\n",
"\n",
"\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
"Prompt after formatting:\n",
"\u001b[32;1m\u001b[1;3mTranslate a math problem into Python code that can be executed in Python 3 REPL. Use the output of running this code to answer the question.\n",
"\n",
"Question: ${Question with math problem.}\n",
"```python\n",
"${Code that solves the problem and prints the solution}\n",
"```\n",
"```output\n",
"${Output of running the code}\n",
"```\n",
"Answer: ${Answer}\n",
"\n",
"Begin.\n",
"\n",
"Question: What is 37593 * 67?\n",
"\n",
"```python\n",
"print(37593 * 67)\n",
"```\n",
"```output\n",
"2518731\n",
"```\n",
"Answer: 2518731\n",
"\n",
"Question: Today's date\n",
"\u001b[0m\n",
"\n",
"\u001b[1m> Finished chain.\u001b[0m\n",
"\u001b[32;1m\u001b[1;3m\n",
"```python\n",
"import datetime\n",
"\n",
"print(datetime.date.today())\n",
"```\n",
"\u001b[0m\n",
"Answer: \u001b[33;1m\u001b[1;3m2023-03-22\n",
"\u001b[0m\n",
"\u001b[1m> Finished chain.\u001b[0m\n",
"\n",
"Observation: \u001b[33;1m\u001b[1;3mAnswer: 2023-03-22\n",
"\u001b[0m\n",
"Thought:\n",
"\n",
"\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
"Prompt after formatting:\n",
"\u001b[32;1m\u001b[1;3mAnswer the following questions as best you can. You have access to the following tools:\n",
"\n",
"Human: A human. Useful for clarification, confirmation, or anything other tools cannot help.Input should be a question you need help with.\n",
"Calculator: Useful for when you need to answer questions about math.\n",
"\n",
"Use the following format:\n",
"\n",
"Question: the input question you must answer\n",
"Thought: you should always think about what to do\n",
"Action: the action to take, should be one of [Human, Calculator]\n",
"Action Input: the input to the action\n",
"Observation: the result of the action\n",
"... (this Thought/Action/Action Input/Observation can repeat N times)\n",
"Thought: I now know the final answer\n",
"Final Answer: the final answer to the original input question\n",
"\n",
"Begin!\n",
"\n",
"Question: What is Eric Zhu's birthday?\n",
"Thought:I don't have any information on Eric Zhu's birthday, so I'll need to ask a human.\n",
"Action: Human\n",
"Action Input: \"Do you know Eric Zhu's birthday?\"\n",
"Observation: Yes\n",
"Thought:Great, now I just need to wait for the human to provide the answer.\n",
"Action: Human\n",
"Action Input: \"What is Eric Zhu's birthday?\"\n",
"Observation: It's today\n",
"Thought:I need to confirm if the human is sure about the answer.\n",
"Action: Human\n",
"Action Input: \"Are you sure it's today?\"\n",
"Observation: \n",
"Thought:The human confirmed that it's today, but I still need to verify it with a calculator.\n",
"Action: Calculator\n",
"Action Input: Today's date\n",
"Observation: Answer: 2023-03-22\n",
"\n",
"Thought:\u001b[0m\n",
"\n",
"\u001b[1m> Finished chain.\u001b[0m\n",
"\u001b[32;1m\u001b[1;3mI now know the final answer\n",
"Final Answer: Eric Zhu's birthday is March 22, 2023.\u001b[0m\n",
"\n",
"\u001b[1m> Finished chain.\u001b[0m\n"
]
},
{
"data": {
"text/plain": [
"\"Eric Zhu's birthday is March 22, 2023.\""
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"agent_chain.run(\"What is Eric Zhu's birthday?\")\n",
"# Answer with \"it is today.\""
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"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.2"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@ -13,6 +13,7 @@ from langchain.requests import RequestsWrapper
from langchain.tools.base import BaseTool from langchain.tools.base import BaseTool
from langchain.tools.bing_search.tool import BingSearchRun from langchain.tools.bing_search.tool import BingSearchRun
from langchain.tools.google_search.tool import GoogleSearchResults, GoogleSearchRun from langchain.tools.google_search.tool import GoogleSearchResults, GoogleSearchRun
from langchain.tools.human.tool import HumanInputRun
from langchain.tools.python.tool import PythonREPLTool from langchain.tools.python.tool import PythonREPLTool
from langchain.tools.requests.tool import RequestsGetTool from langchain.tools.requests.tool import RequestsGetTool
from langchain.tools.wikipedia.tool import WikipediaQueryRun from langchain.tools.wikipedia.tool import WikipediaQueryRun
@ -177,6 +178,10 @@ def _get_bing_search(**kwargs: Any) -> BaseTool:
return BingSearchRun(api_wrapper=BingSearchAPIWrapper(**kwargs)) return BingSearchRun(api_wrapper=BingSearchAPIWrapper(**kwargs))
def _get_human_tool(**kwargs: Any) -> BaseTool:
return HumanInputRun(**kwargs)
_EXTRA_LLM_TOOLS = { _EXTRA_LLM_TOOLS = {
"news-api": (_get_news_api, ["news_api_key"]), "news-api": (_get_news_api, ["news_api_key"]),
"tmdb-api": (_get_tmdb_api, ["tmdb_bearer_token"]), "tmdb-api": (_get_tmdb_api, ["tmdb_bearer_token"]),
@ -195,6 +200,7 @@ _EXTRA_OPTIONAL_TOOLS = {
"serpapi": (_get_serpapi, ["serpapi_api_key", "aiosession"]), "serpapi": (_get_serpapi, ["serpapi_api_key", "aiosession"]),
"searx-search": (_get_searx_search, ["searx_host"]), "searx-search": (_get_searx_search, ["searx_host"]),
"wikipedia": (_get_wikipedia, ["top_k_results"]), "wikipedia": (_get_wikipedia, ["top_k_results"]),
"human": (_get_human_tool, ["prompt_func", "input_func"]),
} }

View File

@ -0,0 +1 @@
"""Tool for asking for human input."""

View File

@ -0,0 +1,27 @@
"""Tool for asking human input."""
from typing import Callable
from langchain.tools.base import BaseTool
class HumanInputRun(BaseTool):
"""Tool that adds the capability to ask user for input."""
name = "Human"
description = (
"A human. "
"Useful for clarification, confirmation, or anything other tools cannot help. "
"Input should be a question you need help with."
)
prompt_func: Callable[[str], None]
input_func: Callable
def _run(self, query: str) -> str:
"""Use the Human input tool."""
self.prompt_func(query)
return self.input_func()
async def _arun(self, query: str) -> str:
"""Use the Human tool asynchronously."""
raise NotImplementedError("Human tool does not support async")