forked from Archives/langchain
Compare commits
5 Commits
main
...
harrison/a
Author | SHA1 | Date | |
---|---|---|---|
|
c7c38dd3df | ||
|
81383474c4 | ||
|
aacd417076 | ||
|
16201f1d77 | ||
|
440083fb35 |
@ -46,7 +46,7 @@
|
|||||||
" Tool(\n",
|
" Tool(\n",
|
||||||
" name = \"Search\",\n",
|
" name = \"Search\",\n",
|
||||||
" func=search.run,\n",
|
" func=search.run,\n",
|
||||||
" description=\"useful for when you need to answer questions about current events\"\n",
|
" description=\"useful for when you need to answer questions about current events. You should ask targeted questions\"\n",
|
||||||
" ),\n",
|
" ),\n",
|
||||||
" Tool(\n",
|
" Tool(\n",
|
||||||
" name=\"Calculator\",\n",
|
" name=\"Calculator\",\n",
|
||||||
@ -56,7 +56,7 @@
|
|||||||
" Tool(\n",
|
" Tool(\n",
|
||||||
" name=\"FooBar DB\",\n",
|
" name=\"FooBar DB\",\n",
|
||||||
" func=db_chain.run,\n",
|
" func=db_chain.run,\n",
|
||||||
" description=\"useful for when you need to answer questions about FooBar. Input should be in the form of a question\"\n",
|
" description=\"useful for when you need to answer questions about FooBar. Input should be in the form of a question containing full context\"\n",
|
||||||
" )\n",
|
" )\n",
|
||||||
"]"
|
"]"
|
||||||
]
|
]
|
||||||
@ -81,40 +81,44 @@
|
|||||||
"name": "stdout",
|
"name": "stdout",
|
||||||
"output_type": "stream",
|
"output_type": "stream",
|
||||||
"text": [
|
"text": [
|
||||||
"What is the age of Olivia Wilde's boyfriend raised to the 0.23 power?\n",
|
"\n",
|
||||||
"Thought:\u001b[32;1m\u001b[1;3m I need to find the age of Olivia Wilde's boyfriend\n",
|
"\n",
|
||||||
|
"\u001b[1m> Entering new ZeroShotAgent chain...\u001b[0m\n",
|
||||||
|
"Thought:\u001b[32;1m\u001b[1;3m I need to find out who Olivia Wilde's boyfriend is and then calculate his age raised to the 0.23 power.\n",
|
||||||
"Action: Search\n",
|
"Action: Search\n",
|
||||||
"Action Input: \"Olivia Wilde's boyfriend\"\u001b[0m\n",
|
"Action Input: \"Who is Olivia Wilde's boyfriend?\"\u001b[0m\n",
|
||||||
"Observation: \u001b[36;1m\u001b[1;3mOlivia Wilde started dating Harry Styles after ending her years-long engagement to Jason Sudeikis — see their relationship timeline.\u001b[0m\n",
|
"Observation: \u001b[36;1m\u001b[1;3mOlivia Wilde started dating Harry Styles after ending her years-long engagement to Jason Sudeikis — see their relationship timeline.\u001b[0m\n",
|
||||||
"Thought:\u001b[32;1m\u001b[1;3m I need to find the age of Harry Styles\n",
|
"Thought:\u001b[32;1m\u001b[1;3m I need to find out Harry Styles' age.\n",
|
||||||
"Action: Search\n",
|
"Action: Search\n",
|
||||||
"Action Input: \"Harry Styles age\"\u001b[0m\n",
|
"Action Input: \"How old is Harry Styles?\"\u001b[0m\n",
|
||||||
"Observation: \u001b[36;1m\u001b[1;3m28 years\u001b[0m\n",
|
"Observation: \u001b[36;1m\u001b[1;3m28 years\u001b[0m\n",
|
||||||
"Thought:\u001b[32;1m\u001b[1;3m I need to calculate 28 to the 0.23 power\n",
|
"Thought:\u001b[32;1m\u001b[1;3m I need to calculate 28 raised to the 0.23 power.\n",
|
||||||
"Action: Calculator\n",
|
"Action: Calculator\n",
|
||||||
"Action Input: 28^0.23\u001b[0m\n",
|
"Action Input: 28^0.23\u001b[0m\n",
|
||||||
"\n",
|
"\n",
|
||||||
"\u001b[1m> Entering new chain...\u001b[0m\n",
|
"\u001b[1m> Entering new LLMMathChain chain...\u001b[0m\n",
|
||||||
"28^0.23\u001b[32;1m\u001b[1;3m\n",
|
"28^0.23\u001b[32;1m\u001b[1;3m\n",
|
||||||
"\n",
|
"\n",
|
||||||
"```python\n",
|
"```python\n",
|
||||||
"print(28**0.23)\n",
|
"import math\n",
|
||||||
|
"print(math.pow(28, 0.23))\n",
|
||||||
"```\n",
|
"```\n",
|
||||||
"\u001b[0m\n",
|
"\u001b[0m\n",
|
||||||
"Answer: \u001b[33;1m\u001b[1;3m2.1520202182226886\n",
|
"Answer: \u001b[33;1m\u001b[1;3m2.1520202182226886\n",
|
||||||
"\u001b[0m\n",
|
"\u001b[0m\n",
|
||||||
"\u001b[1m> Finished chain.\u001b[0m\n",
|
"\u001b[1m> Finished LLMMathChain chain.\u001b[0m\n",
|
||||||
"\n",
|
"\n",
|
||||||
"Observation: \u001b[33;1m\u001b[1;3mAnswer: 2.1520202182226886\n",
|
"Observation: \u001b[33;1m\u001b[1;3mAnswer: 2.1520202182226886\n",
|
||||||
"\u001b[0m\n",
|
"\u001b[0m\n",
|
||||||
"Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n",
|
"Thought:\u001b[32;1m\u001b[1;3m I now know the final answer.\n",
|
||||||
"Final Answer: 2.1520202182226886\u001b[0m"
|
"Final Answer: Harry Styles, Olivia Wilde's boyfriend, is 28 years old and his age raised to the 0.23 power is 2.1520202182226886.\u001b[0m\n",
|
||||||
|
"\u001b[1m> Finished ZeroShotAgent chain.\u001b[0m\n"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"'2.1520202182226886'"
|
"\"Harry Styles, Olivia Wilde's boyfriend, is 28 years old and his age raised to the 0.23 power is 2.1520202182226886.\""
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"execution_count": 4,
|
"execution_count": 4,
|
||||||
@ -123,7 +127,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"mrkl.run(\"What is the age of Olivia Wilde's boyfriend raised to the 0.23 power?\")"
|
"mrkl.run(\"Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?\")"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -136,43 +140,34 @@
|
|||||||
"name": "stdout",
|
"name": "stdout",
|
||||||
"output_type": "stream",
|
"output_type": "stream",
|
||||||
"text": [
|
"text": [
|
||||||
"Who recently released an album called 'The Storm Before the Calm' and are they in the FooBar database? If so, what albums of theirs are in the FooBar database?\n",
|
"\n",
|
||||||
"Thought:\u001b[32;1m\u001b[1;3m I need to find an album called 'The Storm Before the Calm'\n",
|
"\n",
|
||||||
|
"\u001b[1m> Entering new ZeroShotAgent chain...\u001b[0m\n",
|
||||||
|
"Thought:\u001b[32;1m\u001b[1;3m I need to find out the artist's full name and then search the FooBar database for their albums.\n",
|
||||||
"Action: Search\n",
|
"Action: Search\n",
|
||||||
"Action Input: \"The Storm Before the Calm album\"\u001b[0m\n",
|
"Action Input: \"The Storm Before the Calm\" artist\u001b[0m\n",
|
||||||
"Observation: \u001b[36;1m\u001b[1;3mThe Storm Before the Calm (stylized in all lowercase) is the tenth (and eighth international) studio album by Canadian-American singer-songwriter Alanis ...\u001b[0m\n",
|
"Observation: \u001b[36;1m\u001b[1;3mThe Storm Before the Calm (stylized in all lowercase) is the tenth (and eighth international) studio album by Canadian-American singer-songwriter Alanis ...\u001b[0m\n",
|
||||||
"Thought:\u001b[32;1m\u001b[1;3m I need to check if Alanis is in the FooBar database\n",
|
"Thought:\u001b[32;1m\u001b[1;3m I now need to search the FooBar database for Alanis Morissette's albums\n",
|
||||||
"Action: FooBar DB\n",
|
"Action: FooBar DB\n",
|
||||||
"Action Input: \"Does Alanis Morissette exist in the FooBar database?\"\u001b[0m\n",
|
"Action Input: What albums by Alanis Morissette are in the FooBar database?\u001b[0m\n",
|
||||||
"\n",
|
"\n",
|
||||||
"\u001b[1m> Entering new chain...\u001b[0m\n",
|
"\u001b[1m> Entering new SQLDatabaseChain chain...\u001b[0m\n",
|
||||||
"Does Alanis Morissette exist in the FooBar database?\n",
|
"What albums by Alanis Morissette are in the FooBar database? \n",
|
||||||
"SQLQuery:\u001b[32;1m\u001b[1;3m SELECT * FROM Artist WHERE Name = 'Alanis Morissette'\u001b[0m\n",
|
"SQLQuery:\u001b[32;1m\u001b[1;3m SELECT Title FROM Album INNER JOIN Artist ON Album.ArtistId = Artist.ArtistId WHERE Artist.Name = 'Alanis Morissette';\u001b[0m\n",
|
||||||
"SQLResult: \u001b[33;1m\u001b[1;3m[(4, 'Alanis Morissette')]\u001b[0m\n",
|
|
||||||
"Answer:\u001b[32;1m\u001b[1;3m Yes\u001b[0m\n",
|
|
||||||
"\u001b[1m> Finished chain.\u001b[0m\n",
|
|
||||||
"\n",
|
|
||||||
"Observation: \u001b[38;5;200m\u001b[1;3m Yes\u001b[0m\n",
|
|
||||||
"Thought:\u001b[32;1m\u001b[1;3m I need to find out what albums of Alanis's are in the FooBar database\n",
|
|
||||||
"Action: FooBar DB\n",
|
|
||||||
"Action Input: \"What albums by Alanis Morissette are in the FooBar database?\"\u001b[0m\n",
|
|
||||||
"\n",
|
|
||||||
"\u001b[1m> Entering new chain...\u001b[0m\n",
|
|
||||||
"What albums by Alanis Morissette are in the FooBar database?\n",
|
|
||||||
"SQLQuery:\u001b[32;1m\u001b[1;3m SELECT Album.Title FROM Album JOIN Artist ON Album.ArtistId = Artist.ArtistId WHERE Artist.Name = 'Alanis Morissette'\u001b[0m\n",
|
|
||||||
"SQLResult: \u001b[33;1m\u001b[1;3m[('Jagged Little Pill',)]\u001b[0m\n",
|
"SQLResult: \u001b[33;1m\u001b[1;3m[('Jagged Little Pill',)]\u001b[0m\n",
|
||||||
"Answer:\u001b[32;1m\u001b[1;3m Jagged Little Pill\u001b[0m\n",
|
"Answer:\u001b[32;1m\u001b[1;3m The album 'Jagged Little Pill' by Alanis Morissette is in the FooBar database.\u001b[0m\n",
|
||||||
"\u001b[1m> Finished chain.\u001b[0m\n",
|
"\u001b[1m> Finished SQLDatabaseChain chain.\u001b[0m\n",
|
||||||
"\n",
|
"\n",
|
||||||
"Observation: \u001b[38;5;200m\u001b[1;3m Jagged Little Pill\u001b[0m\n",
|
"Observation: \u001b[38;5;200m\u001b[1;3m The album 'Jagged Little Pill' by Alanis Morissette is in the FooBar database.\u001b[0m\n",
|
||||||
"Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n",
|
"Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n",
|
||||||
"Final Answer: The album is by Alanis Morissette and the albums in the FooBar database by her are Jagged Little Pill\u001b[0m"
|
"Final Answer: Alanis Morissette's album 'Jagged Little Pill' is in the FooBar database.\u001b[0m\n",
|
||||||
|
"\u001b[1m> Finished ZeroShotAgent chain.\u001b[0m\n"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"'The album is by Alanis Morissette and the albums in the FooBar database by her are Jagged Little Pill'"
|
"\"Alanis Morissette's album 'Jagged Little Pill' is in the FooBar database.\""
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"execution_count": 5,
|
"execution_count": 5,
|
||||||
@ -181,13 +176,13 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"mrkl.run(\"Who recently released an album called 'The Storm Before the Calm' and are they in the FooBar database? If so, what albums of theirs are in the FooBar database?\")"
|
"mrkl.run(\"What is the full name of the artist who recently released an album called 'The Storm Before the Calm' and are they in the FooBar database? If so, what albums of theirs are in the FooBar database?\")"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"id": "d7c2e6ac",
|
"id": "af016a70",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": []
|
"source": []
|
||||||
@ -209,7 +204,7 @@
|
|||||||
"name": "python",
|
"name": "python",
|
||||||
"nbconvert_exporter": "python",
|
"nbconvert_exporter": "python",
|
||||||
"pygments_lexer": "ipython3",
|
"pygments_lexer": "ipython3",
|
||||||
"version": "3.7.6"
|
"version": "3.10.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nbformat": 4,
|
"nbformat": 4,
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 6,
|
"execution_count": 1,
|
||||||
"id": "4e272b47",
|
"id": "4e272b47",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
@ -38,7 +38,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 7,
|
"execution_count": 2,
|
||||||
"id": "8078c8f1",
|
"id": "8078c8f1",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [
|
"outputs": [
|
||||||
@ -49,7 +49,6 @@
|
|||||||
"\n",
|
"\n",
|
||||||
"\n",
|
"\n",
|
||||||
"\u001b[1m> Entering new ReActDocstoreAgent chain...\u001b[0m\n",
|
"\u001b[1m> Entering new ReActDocstoreAgent chain...\u001b[0m\n",
|
||||||
"Author David Chanoff has collaborated with a U.S. Navy admiral who served as the ambassador to the United Kingdom under which President?\n",
|
|
||||||
"Thought 1:\u001b[32;1m\u001b[1;3m I need to search David Chanoff and find the U.S. Navy admiral he collaborated\n",
|
"Thought 1:\u001b[32;1m\u001b[1;3m I need to search David Chanoff and find the U.S. Navy admiral he collaborated\n",
|
||||||
"with.\n",
|
"with.\n",
|
||||||
"Action 1: Search[David Chanoff]\u001b[0m\n",
|
"Action 1: Search[David Chanoff]\u001b[0m\n",
|
||||||
@ -68,7 +67,7 @@
|
|||||||
"'Bill Clinton'"
|
"'Bill Clinton'"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"execution_count": 7,
|
"execution_count": 2,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"output_type": "execute_result"
|
"output_type": "execute_result"
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 1,
|
"execution_count": 2,
|
||||||
"id": "7e3b513e",
|
"id": "7e3b513e",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [
|
"outputs": [
|
||||||
@ -23,8 +23,7 @@
|
|||||||
"\n",
|
"\n",
|
||||||
"\n",
|
"\n",
|
||||||
"\u001b[1m> Entering new SelfAskWithSearchAgent chain...\u001b[0m\n",
|
"\u001b[1m> Entering new SelfAskWithSearchAgent chain...\u001b[0m\n",
|
||||||
"What is the hometown of the reigning men's U.S. Open champion?\n",
|
"\u001b[32;1m\u001b[1;3mAre follow up questions needed here: Yes.\n",
|
||||||
"Are follow up questions needed here:\u001b[32;1m\u001b[1;3m Yes.\n",
|
|
||||||
"Follow up: Who is the reigning men's U.S. Open champion?\u001b[0m\n",
|
"Follow up: Who is the reigning men's U.S. Open champion?\u001b[0m\n",
|
||||||
"Intermediate answer: \u001b[36;1m\u001b[1;3mCarlos Alcaraz\u001b[0m\n",
|
"Intermediate answer: \u001b[36;1m\u001b[1;3mCarlos Alcaraz\u001b[0m\n",
|
||||||
"\u001b[32;1m\u001b[1;3mFollow up: Where is Carlos Alcaraz from?\u001b[0m\n",
|
"\u001b[32;1m\u001b[1;3mFollow up: Where is Carlos Alcaraz from?\u001b[0m\n",
|
||||||
@ -39,7 +38,7 @@
|
|||||||
"'El Palmar, Spain'"
|
"'El Palmar, Spain'"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"execution_count": 1,
|
"execution_count": 2,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"output_type": "execute_result"
|
"output_type": "execute_result"
|
||||||
}
|
}
|
||||||
@ -58,7 +57,6 @@
|
|||||||
"]\n",
|
"]\n",
|
||||||
"\n",
|
"\n",
|
||||||
"self_ask_with_search = initialize_agent(tools, llm, agent=\"self-ask-with-search\", verbose=True)\n",
|
"self_ask_with_search = initialize_agent(tools, llm, agent=\"self-ask-with-search\", verbose=True)\n",
|
||||||
"\n",
|
|
||||||
"self_ask_with_search.run(\"What is the hometown of the reigning men's U.S. Open champion?\")"
|
"self_ask_with_search.run(\"What is the hometown of the reigning men's U.S. Open champion?\")"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -87,7 +85,7 @@
|
|||||||
"name": "python",
|
"name": "python",
|
||||||
"nbconvert_exporter": "python",
|
"nbconvert_exporter": "python",
|
||||||
"pygments_lexer": "ipython3",
|
"pygments_lexer": "ipython3",
|
||||||
"version": "3.7.6"
|
"version": "3.10.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nbformat": 4,
|
"nbformat": 4,
|
||||||
|
@ -4,7 +4,7 @@ from __future__ import annotations
|
|||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from typing import Any, ClassVar, Dict, List, Optional, Tuple
|
from typing import Any, ClassVar, Dict, List, Optional, Tuple
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel, root_validator
|
||||||
|
|
||||||
from langchain.agents.input import ChainedInput
|
from langchain.agents.input import ChainedInput
|
||||||
from langchain.agents.tools import Tool
|
from langchain.agents.tools import Tool
|
||||||
@ -27,11 +27,11 @@ class Agent(Chain, BaseModel, ABC):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def input_keys(self) -> List[str]:
|
def input_keys(self) -> List[str]:
|
||||||
"""Return the singular input key.
|
"""Return the input keys.
|
||||||
|
|
||||||
:meta private:
|
:meta private:
|
||||||
"""
|
"""
|
||||||
return [self.input_key]
|
return list(set(self.llm_chain.input_keys) - {"agent_scratchpad"})
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def output_keys(self) -> List[str]:
|
def output_keys(self) -> List[str]:
|
||||||
@ -41,6 +41,16 @@ class Agent(Chain, BaseModel, ABC):
|
|||||||
"""
|
"""
|
||||||
return [self.output_key]
|
return [self.output_key]
|
||||||
|
|
||||||
|
@root_validator()
|
||||||
|
def validate_prompt(cls, values: Dict) -> Dict:
|
||||||
|
"""Validate that prompt matches format."""
|
||||||
|
prompt = values["llm_chain"].prompt
|
||||||
|
if "agent_scratchpad" not in prompt.input_variables:
|
||||||
|
raise ValueError(
|
||||||
|
"`agent_scratchpad` should be a variable in prompt.input_variables"
|
||||||
|
)
|
||||||
|
return values
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def observation_prefix(self) -> str:
|
def observation_prefix(self) -> str:
|
||||||
@ -93,23 +103,24 @@ class Agent(Chain, BaseModel, ABC):
|
|||||||
llm_chain = LLMChain(llm=llm, prompt=cls.create_prompt(tools))
|
llm_chain = LLMChain(llm=llm, prompt=cls.create_prompt(tools))
|
||||||
return cls(llm_chain=llm_chain, tools=tools, **kwargs)
|
return cls(llm_chain=llm_chain, tools=tools, **kwargs)
|
||||||
|
|
||||||
def get_action(self, text: str) -> AgentAction:
|
def get_action(self, thoughts: str, inputs: dict) -> AgentAction:
|
||||||
"""Given input, decided what to do.
|
"""Given input, decided what to do.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
text: input string
|
thoughts: LLM thoughts
|
||||||
|
inputs: user inputs
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Action specifying what tool to use.
|
Action specifying what tool to use.
|
||||||
"""
|
"""
|
||||||
input_key = self.llm_chain.input_keys[0]
|
new_inputs = {"agent_scratchpad": thoughts, "stop": self._stop}
|
||||||
inputs = {input_key: text, "stop": self._stop}
|
full_inputs = {**inputs, **new_inputs}
|
||||||
full_output = self.llm_chain.predict(**inputs)
|
full_output = self.llm_chain.predict(**full_inputs)
|
||||||
parsed_output = self._extract_tool_and_input(full_output)
|
parsed_output = self._extract_tool_and_input(full_output)
|
||||||
while parsed_output is None:
|
while parsed_output is None:
|
||||||
full_output = self._fix_text(full_output)
|
full_output = self._fix_text(full_output)
|
||||||
inputs = {input_key: text + full_output, "stop": self._stop}
|
full_inputs["agent_scratchpad"] += full_output
|
||||||
output = self.llm_chain.predict(**inputs)
|
output = self.llm_chain.predict(**full_inputs)
|
||||||
full_output += output
|
full_output += output
|
||||||
parsed_output = self._extract_tool_and_input(full_output)
|
parsed_output = self._extract_tool_and_input(full_output)
|
||||||
tool, tool_input = parsed_output
|
tool, tool_input = parsed_output
|
||||||
@ -117,19 +128,12 @@ class Agent(Chain, BaseModel, ABC):
|
|||||||
|
|
||||||
def _call(self, inputs: Dict[str, str]) -> Dict[str, str]:
|
def _call(self, inputs: Dict[str, str]) -> Dict[str, str]:
|
||||||
"""Run text through and get agent response."""
|
"""Run text through and get agent response."""
|
||||||
text = inputs[self.input_key]
|
|
||||||
# Do any preparation necessary when receiving a new input.
|
# Do any preparation necessary when receiving a new input.
|
||||||
self._prepare_for_new_call()
|
self._prepare_for_new_call()
|
||||||
# Construct a mapping of tool name to tool for easy lookup
|
# Construct a mapping of tool name to tool for easy lookup
|
||||||
name_to_tool_map = {tool.name: tool.func for tool in self.tools}
|
name_to_tool_map = {tool.name: tool.func for tool in self.tools}
|
||||||
# Construct the initial string to pass into the LLM. This is made up
|
|
||||||
# of the user input, the special starter string, and then the LLM prefix.
|
|
||||||
# The starter string is a special string that may be used by a LLM to
|
|
||||||
# immediately follow the user input. The LLM prefix is a string that
|
|
||||||
# prompts the LLM to take an action.
|
|
||||||
starter_string = text + self.starter_string + self.llm_prefix
|
|
||||||
# We use the ChainedInput class to iteratively add to the input over time.
|
# We use the ChainedInput class to iteratively add to the input over time.
|
||||||
chained_input = ChainedInput(starter_string, verbose=self.verbose)
|
chained_input = ChainedInput(self.llm_prefix, verbose=self.verbose)
|
||||||
# We construct a mapping from each tool to a color, used for logging.
|
# We construct a mapping from each tool to a color, used for logging.
|
||||||
color_mapping = get_color_mapping(
|
color_mapping = get_color_mapping(
|
||||||
[tool.name for tool in self.tools], excluded_colors=["green"]
|
[tool.name for tool in self.tools], excluded_colors=["green"]
|
||||||
@ -137,7 +141,7 @@ class Agent(Chain, BaseModel, ABC):
|
|||||||
# We now enter the agent loop (until it returns something).
|
# We now enter the agent loop (until it returns something).
|
||||||
while True:
|
while True:
|
||||||
# Call the LLM to see what to do.
|
# Call the LLM to see what to do.
|
||||||
output = self.get_action(chained_input.input)
|
output = self.get_action(chained_input.input, inputs)
|
||||||
# Add the log to the Chained Input.
|
# Add the log to the Chained Input.
|
||||||
chained_input.add_action(output, color="green")
|
chained_input.add_action(output, color="green")
|
||||||
# If the tool chosen is the finishing tool, then we end and return.
|
# If the tool chosen is the finishing tool, then we end and return.
|
||||||
|
@ -85,7 +85,7 @@ class ZeroShotAgent(Agent):
|
|||||||
format_instructions = FORMAT_INSTRUCTIONS.format(tool_names=tool_names)
|
format_instructions = FORMAT_INSTRUCTIONS.format(tool_names=tool_names)
|
||||||
template = "\n\n".join([prefix, tool_strings, format_instructions, suffix])
|
template = "\n\n".join([prefix, tool_strings, format_instructions, suffix])
|
||||||
if input_variables is None:
|
if input_variables is None:
|
||||||
input_variables = ["input"]
|
input_variables = ["input", "agent_scratchpad"]
|
||||||
return PromptTemplate(template=template, input_variables=input_variables)
|
return PromptTemplate(template=template, input_variables=input_variables)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -12,4 +12,5 @@ Thought: I now know the final answer
|
|||||||
Final Answer: the final answer to the original input question"""
|
Final Answer: the final answer to the original input question"""
|
||||||
SUFFIX = """Begin!
|
SUFFIX = """Begin!
|
||||||
|
|
||||||
Question: {input}"""
|
Question: {input}
|
||||||
|
{agent_scratchpad}"""
|
||||||
|
@ -44,6 +44,9 @@ Action 4: Finish[yes]
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
]
|
]
|
||||||
SUFFIX = """\n\nSetup: {input}"""
|
SUFFIX = """\n\nSetup: {input}
|
||||||
|
{agent_scratchpad}"""
|
||||||
|
|
||||||
TEXTWORLD_PROMPT = PromptTemplate.from_examples(EXAMPLES, SUFFIX, ["input"])
|
TEXTWORLD_PROMPT = PromptTemplate.from_examples(
|
||||||
|
EXAMPLES, SUFFIX, ["input", "agent_scratchpad"]
|
||||||
|
)
|
||||||
|
@ -107,6 +107,9 @@ Thought 3: Leonid Levin is a mathematician and computer scientist. So Pavel Urys
|
|||||||
and Leonid Levin have the same type of work.
|
and Leonid Levin have the same type of work.
|
||||||
Action 3: Finish[yes]""",
|
Action 3: Finish[yes]""",
|
||||||
]
|
]
|
||||||
SUFFIX = """\n\nQuestion: {input}"""
|
SUFFIX = """\n\nQuestion: {input}
|
||||||
|
{agent_scratchpad}"""
|
||||||
|
|
||||||
WIKI_PROMPT = PromptTemplate.from_examples(EXAMPLES, SUFFIX, ["input"])
|
WIKI_PROMPT = PromptTemplate.from_examples(
|
||||||
|
EXAMPLES, SUFFIX, ["input", "agent_scratchpad"]
|
||||||
|
)
|
||||||
|
@ -58,7 +58,7 @@ class SelfAskWithSearchAgent(Agent):
|
|||||||
@property
|
@property
|
||||||
def starter_string(self) -> str:
|
def starter_string(self) -> str:
|
||||||
"""Put this string after user input but before first LLM call."""
|
"""Put this string after user input but before first LLM call."""
|
||||||
return "\nAre follow up questions needed here:"
|
return "Are follow up questions needed here:"
|
||||||
|
|
||||||
|
|
||||||
class SelfAskWithSearchChain(SelfAskWithSearchAgent):
|
class SelfAskWithSearchChain(SelfAskWithSearchAgent):
|
||||||
|
@ -37,5 +37,8 @@ Follow up: Where is Martin Campbell from?
|
|||||||
Intermediate answer: New Zealand.
|
Intermediate answer: New Zealand.
|
||||||
So the final answer is: No
|
So the final answer is: No
|
||||||
|
|
||||||
Question: {input}"""
|
Question: {input}
|
||||||
PROMPT = PromptTemplate(input_variables=["input"], template=_DEFAULT_TEMPLATE)
|
{agent_scratchpad}"""
|
||||||
|
PROMPT = PromptTemplate(
|
||||||
|
input_variables=["input", "agent_scratchpad"], template=_DEFAULT_TEMPLATE
|
||||||
|
)
|
||||||
|
@ -61,7 +61,7 @@ def test_predict_until_observation_normal() -> None:
|
|||||||
Tool("Lookup", lambda x: x),
|
Tool("Lookup", lambda x: x),
|
||||||
]
|
]
|
||||||
agent = ReActDocstoreAgent.from_llm_and_tools(fake_llm, tools)
|
agent = ReActDocstoreAgent.from_llm_and_tools(fake_llm, tools)
|
||||||
output = agent.get_action("")
|
output = agent.get_action("", {"input": ""})
|
||||||
assert output.log == outputs[0]
|
assert output.log == outputs[0]
|
||||||
assert output.tool == "Search"
|
assert output.tool == "Search"
|
||||||
assert output.tool_input == "foo"
|
assert output.tool_input == "foo"
|
||||||
@ -76,7 +76,7 @@ def test_predict_until_observation_repeat() -> None:
|
|||||||
Tool("Lookup", lambda x: x),
|
Tool("Lookup", lambda x: x),
|
||||||
]
|
]
|
||||||
agent = ReActDocstoreAgent.from_llm_and_tools(fake_llm, tools)
|
agent = ReActDocstoreAgent.from_llm_and_tools(fake_llm, tools)
|
||||||
output = agent.get_action("")
|
output = agent.get_action("", {"input": ""})
|
||||||
assert output.log == "foo\nAction 1: Search[foo]"
|
assert output.log == "foo\nAction 1: Search[foo]"
|
||||||
assert output.tool == "Search"
|
assert output.tool == "Search"
|
||||||
assert output.tool_input == "foo"
|
assert output.tool_input == "foo"
|
||||||
|
Loading…
Reference in New Issue
Block a user