initial commit
This commit is contained in:
@@ -0,0 +1 @@
|
||||
"""Implements the ReAct paper from https://arxiv.org/pdf/2210.03629.pdf."""
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
150
venv/Lib/site-packages/langchain_classic/agents/react/agent.py
Normal file
150
venv/Lib/site-packages/langchain_classic/agents/react/agent.py
Normal file
@@ -0,0 +1,150 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
from langchain_core.language_models import BaseLanguageModel
|
||||
from langchain_core.prompts import BasePromptTemplate
|
||||
from langchain_core.runnables import Runnable, RunnablePassthrough
|
||||
from langchain_core.tools import BaseTool
|
||||
from langchain_core.tools.render import ToolsRenderer, render_text_description
|
||||
|
||||
from langchain_classic.agents import AgentOutputParser
|
||||
from langchain_classic.agents.format_scratchpad import format_log_to_str
|
||||
from langchain_classic.agents.output_parsers import ReActSingleInputOutputParser
|
||||
|
||||
|
||||
def create_react_agent(
|
||||
llm: BaseLanguageModel,
|
||||
tools: Sequence[BaseTool],
|
||||
prompt: BasePromptTemplate,
|
||||
output_parser: AgentOutputParser | None = None,
|
||||
tools_renderer: ToolsRenderer = render_text_description,
|
||||
*,
|
||||
stop_sequence: bool | list[str] = True,
|
||||
) -> Runnable:
|
||||
r"""Create an agent that uses ReAct prompting.
|
||||
|
||||
Based on paper "ReAct: Synergizing Reasoning and Acting in Language Models"
|
||||
(https://arxiv.org/abs/2210.03629)
|
||||
|
||||
!!! warning
|
||||
|
||||
This implementation is based on the foundational ReAct paper but is older and
|
||||
not well-suited for production applications.
|
||||
|
||||
For a more robust and feature-rich implementation, we recommend using the
|
||||
`create_agent` function from the `langchain` library.
|
||||
|
||||
See the
|
||||
[reference doc](https://reference.langchain.com/python/langchain/agents/)
|
||||
for more information.
|
||||
|
||||
Args:
|
||||
llm: LLM to use as the agent.
|
||||
tools: Tools this agent has access to.
|
||||
prompt: The prompt to use. See Prompt section below for more.
|
||||
output_parser: AgentOutputParser for parse the LLM output.
|
||||
tools_renderer: This controls how the tools are converted into a string and
|
||||
then passed into the LLM.
|
||||
stop_sequence: bool or list of str.
|
||||
If `True`, adds a stop token of "Observation:" to avoid hallucinates.
|
||||
If `False`, does not add a stop token.
|
||||
If a list of str, uses the provided list as the stop tokens.
|
||||
|
||||
You may to set this to False if the LLM you are using
|
||||
does not support stop sequences.
|
||||
|
||||
Returns:
|
||||
A Runnable sequence representing an agent. It takes as input all the same input
|
||||
variables as the prompt passed in does. It returns as output either an
|
||||
AgentAction or AgentFinish.
|
||||
|
||||
Examples:
|
||||
```python
|
||||
from langchain_classic import hub
|
||||
from langchain_openai import OpenAI
|
||||
from langchain_classic.agents import AgentExecutor, create_react_agent
|
||||
|
||||
prompt = hub.pull("hwchase17/react")
|
||||
model = OpenAI()
|
||||
tools = ...
|
||||
|
||||
agent = create_react_agent(model, tools, prompt)
|
||||
agent_executor = AgentExecutor(agent=agent, tools=tools)
|
||||
|
||||
agent_executor.invoke({"input": "hi"})
|
||||
|
||||
# Use with chat history
|
||||
from langchain_core.messages import AIMessage, HumanMessage
|
||||
|
||||
agent_executor.invoke(
|
||||
{
|
||||
"input": "what's my name?",
|
||||
# Notice that chat_history is a string
|
||||
# since this prompt is aimed at LLMs, not chat models
|
||||
"chat_history": "Human: My name is Bob\nAI: Hello Bob!",
|
||||
}
|
||||
)
|
||||
```
|
||||
|
||||
Prompt:
|
||||
|
||||
The prompt must have input keys:
|
||||
* `tools`: contains descriptions and arguments for each tool.
|
||||
* `tool_names`: contains all tool names.
|
||||
* `agent_scratchpad`: contains previous agent actions and tool outputs as a
|
||||
string.
|
||||
|
||||
Here's an example:
|
||||
|
||||
```python
|
||||
from langchain_core.prompts import PromptTemplate
|
||||
|
||||
template = '''Answer the following questions as best you can. You have access to the following tools:
|
||||
|
||||
{tools}
|
||||
|
||||
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
|
||||
|
||||
Begin!
|
||||
|
||||
Question: {input}
|
||||
Thought:{agent_scratchpad}'''
|
||||
|
||||
prompt = PromptTemplate.from_template(template)
|
||||
```
|
||||
""" # noqa: E501
|
||||
missing_vars = {"tools", "tool_names", "agent_scratchpad"}.difference(
|
||||
prompt.input_variables + list(prompt.partial_variables),
|
||||
)
|
||||
if missing_vars:
|
||||
msg = f"Prompt missing required variables: {missing_vars}"
|
||||
raise ValueError(msg)
|
||||
|
||||
prompt = prompt.partial(
|
||||
tools=tools_renderer(list(tools)),
|
||||
tool_names=", ".join([t.name for t in tools]),
|
||||
)
|
||||
if stop_sequence:
|
||||
stop = ["\nObservation"] if stop_sequence is True else stop_sequence
|
||||
llm_with_stop = llm.bind(stop=stop)
|
||||
else:
|
||||
llm_with_stop = llm
|
||||
output_parser = output_parser or ReActSingleInputOutputParser()
|
||||
return (
|
||||
RunnablePassthrough.assign(
|
||||
agent_scratchpad=lambda x: format_log_to_str(x["intermediate_steps"]),
|
||||
)
|
||||
| prompt
|
||||
| llm_with_stop
|
||||
| output_parser
|
||||
)
|
||||
189
venv/Lib/site-packages/langchain_classic/agents/react/base.py
Normal file
189
venv/Lib/site-packages/langchain_classic/agents/react/base.py
Normal file
@@ -0,0 +1,189 @@
|
||||
"""Chain that implements the ReAct paper from https://arxiv.org/pdf/2210.03629.pdf."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from collections.abc import Sequence
|
||||
from typing import TYPE_CHECKING, Any
|
||||
|
||||
from langchain_core._api import deprecated
|
||||
from langchain_core.documents import Document
|
||||
from langchain_core.language_models import BaseLanguageModel
|
||||
from langchain_core.prompts import BasePromptTemplate
|
||||
from langchain_core.tools import BaseTool, Tool
|
||||
from pydantic import Field
|
||||
from typing_extensions import override
|
||||
|
||||
from langchain_classic._api.deprecation import AGENT_DEPRECATION_WARNING
|
||||
from langchain_classic.agents.agent import Agent, AgentExecutor, AgentOutputParser
|
||||
from langchain_classic.agents.agent_types import AgentType
|
||||
from langchain_classic.agents.react.output_parser import ReActOutputParser
|
||||
from langchain_classic.agents.react.textworld_prompt import TEXTWORLD_PROMPT
|
||||
from langchain_classic.agents.react.wiki_prompt import WIKI_PROMPT
|
||||
from langchain_classic.agents.utils import validate_tools_single_input
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from langchain_community.docstore.base import Docstore
|
||||
|
||||
|
||||
_LOOKUP_AND_SEARCH_TOOLS = {"Lookup", "Search"}
|
||||
|
||||
|
||||
@deprecated(
|
||||
"0.1.0",
|
||||
message=AGENT_DEPRECATION_WARNING,
|
||||
removal="1.0",
|
||||
)
|
||||
class ReActDocstoreAgent(Agent):
|
||||
"""Agent for the ReAct chain."""
|
||||
|
||||
output_parser: AgentOutputParser = Field(default_factory=ReActOutputParser)
|
||||
|
||||
@classmethod
|
||||
@override
|
||||
def _get_default_output_parser(cls, **kwargs: Any) -> AgentOutputParser:
|
||||
return ReActOutputParser()
|
||||
|
||||
@property
|
||||
def _agent_type(self) -> str:
|
||||
"""Return Identifier of an agent type."""
|
||||
return AgentType.REACT_DOCSTORE
|
||||
|
||||
@classmethod
|
||||
@override
|
||||
def create_prompt(cls, tools: Sequence[BaseTool]) -> BasePromptTemplate:
|
||||
"""Return default prompt."""
|
||||
return WIKI_PROMPT
|
||||
|
||||
@classmethod
|
||||
def _validate_tools(cls, tools: Sequence[BaseTool]) -> None:
|
||||
validate_tools_single_input(cls.__name__, tools)
|
||||
super()._validate_tools(tools)
|
||||
if len(tools) != len(_LOOKUP_AND_SEARCH_TOOLS):
|
||||
msg = f"Exactly two tools must be specified, but got {tools}"
|
||||
raise ValueError(msg)
|
||||
tool_names = {tool.name for tool in tools}
|
||||
if tool_names != _LOOKUP_AND_SEARCH_TOOLS:
|
||||
msg = f"Tool names should be Lookup and Search, got {tool_names}"
|
||||
raise ValueError(msg)
|
||||
|
||||
@property
|
||||
def observation_prefix(self) -> str:
|
||||
"""Prefix to append the observation with."""
|
||||
return "Observation: "
|
||||
|
||||
@property
|
||||
def _stop(self) -> list[str]:
|
||||
return ["\nObservation:"]
|
||||
|
||||
@property
|
||||
def llm_prefix(self) -> str:
|
||||
"""Prefix to append the LLM call with."""
|
||||
return "Thought:"
|
||||
|
||||
|
||||
@deprecated(
|
||||
"0.1.0",
|
||||
message=AGENT_DEPRECATION_WARNING,
|
||||
removal="1.0",
|
||||
)
|
||||
class DocstoreExplorer:
|
||||
"""Class to assist with exploration of a document store."""
|
||||
|
||||
def __init__(self, docstore: Docstore):
|
||||
"""Initialize with a docstore, and set initial document to None."""
|
||||
self.docstore = docstore
|
||||
self.document: Document | None = None
|
||||
self.lookup_str = ""
|
||||
self.lookup_index = 0
|
||||
|
||||
def search(self, term: str) -> str:
|
||||
"""Search for a term in the docstore, and if found save."""
|
||||
result = self.docstore.search(term)
|
||||
if isinstance(result, Document):
|
||||
self.document = result
|
||||
return self._summary
|
||||
self.document = None
|
||||
return result
|
||||
|
||||
def lookup(self, term: str) -> str:
|
||||
"""Lookup a term in document (if saved)."""
|
||||
if self.document is None:
|
||||
msg = "Cannot lookup without a successful search first"
|
||||
raise ValueError(msg)
|
||||
if term.lower() != self.lookup_str:
|
||||
self.lookup_str = term.lower()
|
||||
self.lookup_index = 0
|
||||
else:
|
||||
self.lookup_index += 1
|
||||
lookups = [p for p in self._paragraphs if self.lookup_str in p.lower()]
|
||||
if len(lookups) == 0:
|
||||
return "No Results"
|
||||
if self.lookup_index >= len(lookups):
|
||||
return "No More Results"
|
||||
result_prefix = f"(Result {self.lookup_index + 1}/{len(lookups)})"
|
||||
return f"{result_prefix} {lookups[self.lookup_index]}"
|
||||
|
||||
@property
|
||||
def _summary(self) -> str:
|
||||
return self._paragraphs[0]
|
||||
|
||||
@property
|
||||
def _paragraphs(self) -> list[str]:
|
||||
if self.document is None:
|
||||
msg = "Cannot get paragraphs without a document"
|
||||
raise ValueError(msg)
|
||||
return self.document.page_content.split("\n\n")
|
||||
|
||||
|
||||
@deprecated(
|
||||
"0.1.0",
|
||||
message=AGENT_DEPRECATION_WARNING,
|
||||
removal="1.0",
|
||||
)
|
||||
class ReActTextWorldAgent(ReActDocstoreAgent):
|
||||
"""Agent for the ReAct TextWorld chain."""
|
||||
|
||||
@classmethod
|
||||
@override
|
||||
def create_prompt(cls, tools: Sequence[BaseTool]) -> BasePromptTemplate:
|
||||
"""Return default prompt."""
|
||||
return TEXTWORLD_PROMPT
|
||||
|
||||
@classmethod
|
||||
def _validate_tools(cls, tools: Sequence[BaseTool]) -> None:
|
||||
validate_tools_single_input(cls.__name__, tools)
|
||||
super()._validate_tools(tools)
|
||||
if len(tools) != 1:
|
||||
msg = f"Exactly one tool must be specified, but got {tools}"
|
||||
raise ValueError(msg)
|
||||
tool_names = {tool.name for tool in tools}
|
||||
if tool_names != {"Play"}:
|
||||
msg = f"Tool name should be Play, got {tool_names}"
|
||||
raise ValueError(msg)
|
||||
|
||||
|
||||
@deprecated(
|
||||
"0.1.0",
|
||||
message=AGENT_DEPRECATION_WARNING,
|
||||
removal="1.0",
|
||||
)
|
||||
class ReActChain(AgentExecutor):
|
||||
"""[Deprecated] Chain that implements the ReAct paper."""
|
||||
|
||||
def __init__(self, llm: BaseLanguageModel, docstore: Docstore, **kwargs: Any):
|
||||
"""Initialize with the LLM and a docstore."""
|
||||
docstore_explorer = DocstoreExplorer(docstore)
|
||||
tools = [
|
||||
Tool(
|
||||
name="Search",
|
||||
func=docstore_explorer.search,
|
||||
description="Search for a term in the docstore.",
|
||||
),
|
||||
Tool(
|
||||
name="Lookup",
|
||||
func=docstore_explorer.lookup,
|
||||
description="Lookup a term in the docstore.",
|
||||
),
|
||||
]
|
||||
agent = ReActDocstoreAgent.from_llm_and_tools(llm, tools)
|
||||
super().__init__(agent=agent, tools=tools, **kwargs)
|
||||
@@ -0,0 +1,34 @@
|
||||
import re
|
||||
|
||||
from langchain_core.agents import AgentAction, AgentFinish
|
||||
from langchain_core.exceptions import OutputParserException
|
||||
from typing_extensions import override
|
||||
|
||||
from langchain_classic.agents.agent import AgentOutputParser
|
||||
|
||||
|
||||
class ReActOutputParser(AgentOutputParser):
|
||||
"""Output parser for the ReAct agent."""
|
||||
|
||||
@override
|
||||
def parse(self, text: str) -> AgentAction | AgentFinish:
|
||||
action_prefix = "Action: "
|
||||
if not text.strip().split("\n")[-1].startswith(action_prefix):
|
||||
msg = f"Could not parse LLM Output: {text}"
|
||||
raise OutputParserException(msg)
|
||||
action_block = text.strip().split("\n")[-1]
|
||||
|
||||
action_str = action_block[len(action_prefix) :]
|
||||
# Parse out the action and the directive.
|
||||
re_matches = re.search(r"(.*?)\[(.*?)\]", action_str)
|
||||
if re_matches is None:
|
||||
msg = f"Could not parse action directive: {action_str}"
|
||||
raise OutputParserException(msg)
|
||||
action, action_input = re_matches.group(1), re_matches.group(2)
|
||||
if action == "Finish":
|
||||
return AgentFinish({"output": action_input}, text)
|
||||
return AgentAction(action, action_input, text)
|
||||
|
||||
@property
|
||||
def _type(self) -> str:
|
||||
return "react"
|
||||
@@ -0,0 +1,51 @@
|
||||
from langchain_core.prompts.prompt import PromptTemplate
|
||||
|
||||
EXAMPLES = [
|
||||
"""Setup: You are now playing a fast paced round of TextWorld! Here is your task for
|
||||
today. First of all, you could, like, try to travel east. After that, take the
|
||||
binder from the locker. With the binder, place the binder on the mantelpiece.
|
||||
Alright, thanks!
|
||||
|
||||
-= Vault =-
|
||||
You've just walked into a vault. You begin to take stock of what's here.
|
||||
|
||||
An open safe is here. What a letdown! The safe is empty! You make out a shelf.
|
||||
But the thing hasn't got anything on it. What, you think everything in TextWorld
|
||||
should have stuff on it?
|
||||
|
||||
You don't like doors? Why not try going east, that entranceway is unguarded.
|
||||
|
||||
Thought: I need to travel east
|
||||
Action: Play[go east]
|
||||
Observation: -= Office =-
|
||||
You arrive in an office. An ordinary one.
|
||||
|
||||
You can make out a locker. The locker contains a binder. You see a case. The
|
||||
case is empty, what a horrible day! You lean against the wall, inadvertently
|
||||
pressing a secret button. The wall opens up to reveal a mantelpiece. You wonder
|
||||
idly who left that here. The mantelpiece is standard. The mantelpiece appears to
|
||||
be empty. If you haven't noticed it already, there seems to be something there
|
||||
by the wall, it's a table. Unfortunately, there isn't a thing on it. Hm. Oh well
|
||||
There is an exit to the west. Don't worry, it is unguarded.
|
||||
|
||||
Thought: I need to take the binder from the locker
|
||||
Action: Play[take binder]
|
||||
Observation: You take the binder from the locker.
|
||||
|
||||
Thought: I need to place the binder on the mantelpiece
|
||||
Action: Play[put binder on mantelpiece]
|
||||
|
||||
Observation: You put the binder on the mantelpiece.
|
||||
Your score has just gone up by one point.
|
||||
*** The End ***
|
||||
Thought: The End has occurred
|
||||
Action: Finish[yes]
|
||||
|
||||
"""
|
||||
]
|
||||
SUFFIX = """\n\nSetup: {input}
|
||||
{agent_scratchpad}"""
|
||||
|
||||
TEXTWORLD_PROMPT = PromptTemplate.from_examples(
|
||||
EXAMPLES, SUFFIX, ["input", "agent_scratchpad"]
|
||||
)
|
||||
@@ -0,0 +1,70 @@
|
||||
from langchain_core.prompts.prompt import PromptTemplate
|
||||
|
||||
EXAMPLES = [
|
||||
"""Question: What is the elevation range for the area that the eastern sector of the Colorado orogeny extends into?
|
||||
Thought: I need to search Colorado orogeny, find the area that the eastern sector of the Colorado orogeny extends into, then find the elevation range of the area.
|
||||
Action: Search[Colorado orogeny]
|
||||
Observation: The Colorado orogeny was an episode of mountain building (an orogeny) in Colorado and surrounding areas.
|
||||
Thought: It does not mention the eastern sector. So I need to look up eastern sector.
|
||||
Action: Lookup[eastern sector]
|
||||
Observation: (Result 1 / 1) The eastern sector extends into the High Plains and is called the Central Plains orogeny.
|
||||
Thought: The eastern sector of Colorado orogeny extends into the High Plains. So I need to search High Plains and find its elevation range.
|
||||
Action: Search[High Plains]
|
||||
Observation: High Plains refers to one of two distinct land regions
|
||||
Thought: I need to instead search High Plains (United States).
|
||||
Action: Search[High Plains (United States)]
|
||||
Observation: The High Plains are a subregion of the Great Plains. From east to west, the High Plains rise in elevation from around 1,800 to 7,000 ft (550 to 2,130 m).[3]
|
||||
Thought: High Plains rise in elevation from around 1,800 to 7,000 ft, so the answer is 1,800 to 7,000 ft.
|
||||
Action: Finish[1,800 to 7,000 ft]""", # noqa: E501
|
||||
"""Question: Musician and satirist Allie Goertz wrote a song about the "The Simpsons" character Milhouse, who Matt Groening named after who?
|
||||
Thought: The question simplifies to "The Simpsons" character Milhouse is named after who. I only need to search Milhouse and find who it is named after.
|
||||
Action: Search[Milhouse]
|
||||
Observation: Milhouse Mussolini Van Houten is a recurring character in the Fox animated television series The Simpsons voiced by Pamela Hayden and created by Matt Groening.
|
||||
Thought: The paragraph does not tell who Milhouse is named after, maybe I can look up "named after".
|
||||
Action: Lookup[named after]
|
||||
Observation: (Result 1 / 1) Milhouse was named after U.S. president Richard Nixon, whose middle name was Milhous.
|
||||
Thought: Milhouse was named after U.S. president Richard Nixon, so the answer is Richard Nixon.
|
||||
Action: Finish[Richard Nixon]""", # noqa: E501
|
||||
"""Question: Which documentary is about Finnish rock groups, Adam Clayton Powell or The Saimaa Gesture?
|
||||
Thought: I need to search Adam Clayton Powell and The Saimaa Gesture, and find which documentary is about Finnish rock groups.
|
||||
Action: Search[Adam Clayton Powell]
|
||||
Observation: Could not find [Adam Clayton Powell]. Similar: ['Adam Clayton Powell III', 'Seventh Avenue (Manhattan)', 'Adam Clayton Powell Jr. State Office Building', 'Isabel Washington Powell', 'Adam Powell', 'Adam Clayton Powell (film)', 'Giancarlo Esposito'].
|
||||
Thought: To find the documentary, I can search Adam Clayton Powell (film).
|
||||
Action: Search[Adam Clayton Powell (film)]
|
||||
Observation: Adam Clayton Powell is a 1989 American documentary film directed by Richard Kilberg. The film is about the rise and fall of influential African-American politician Adam Clayton Powell Jr.[3][4] It was later aired as part of the PBS series The American Experience.
|
||||
Thought: Adam Clayton Powell (film) is a documentary about an African-American politician, not Finnish rock groups. So the documentary about Finnish rock groups must instead be The Saimaa Gesture.
|
||||
Action: Finish[The Saimaa Gesture]""", # noqa: E501
|
||||
"""Question: What profession does Nicholas Ray and Elia Kazan have in common?
|
||||
Thought: I need to search Nicholas Ray and Elia Kazan, find their professions, then find the profession they have in common.
|
||||
Action: Search[Nicholas Ray]
|
||||
Observation: Nicholas Ray (born Raymond Nicholas Kienzle Jr., August 7, 1911 - June 16, 1979) was an American film director, screenwriter, and actor best known for the 1955 film Rebel Without a Cause.
|
||||
Thought: Professions of Nicholas Ray are director, screenwriter, and actor. I need to search Elia Kazan next and find his professions.
|
||||
Action: Search[Elia Kazan]
|
||||
Observation: Elia Kazan was an American film and theatre director, producer, screenwriter and actor.
|
||||
Thought: Professions of Elia Kazan are director, producer, screenwriter, and actor. So profession Nicholas Ray and Elia Kazan have in common is director, screenwriter, and actor.
|
||||
Action: Finish[director, screenwriter, actor]""", # noqa: E501
|
||||
"""Question: Which magazine was started first Arthur's Magazine or First for Women?
|
||||
Thought: I need to search Arthur's Magazine and First for Women, and find which was started first.
|
||||
Action: Search[Arthur's Magazine]
|
||||
Observation: Arthur's Magazine (1844-1846) was an American literary periodical published in Philadelphia in the 19th century.
|
||||
Thought: Arthur's Magazine was started in 1844. I need to search First for Women next.
|
||||
Action: Search[First for Women]
|
||||
Observation: First for Women is a woman's magazine published by Bauer Media Group in the USA.[1] The magazine was started in 1989.
|
||||
Thought: First for Women was started in 1989. 1844 (Arthur's Magazine) < 1989 (First for Women), so Arthur's Magazine was started first.
|
||||
Action: Finish[Arthur's Magazine]""", # noqa: E501
|
||||
"""Question: Were Pavel Urysohn and Leonid Levin known for the same type of work?
|
||||
Thought: I need to search Pavel Urysohn and Leonid Levin, find their types of work, then find if they are the same.
|
||||
Action: Search[Pavel Urysohn]
|
||||
Observation: Pavel Samuilovich Urysohn (February 3, 1898 - August 17, 1924) was a Soviet mathematician who is best known for his contributions in dimension theory.
|
||||
Thought: Pavel Urysohn is a mathematician. I need to search Leonid Levin next and find its type of work.
|
||||
Action: Search[Leonid Levin]
|
||||
Observation: Leonid Anatolievich Levin is a Soviet-American mathematician and computer scientist.
|
||||
Thought: Leonid Levin is a mathematician and computer scientist. So Pavel Urysohn and Leonid Levin have the same type of work.
|
||||
Action: Finish[yes]""", # noqa: E501
|
||||
]
|
||||
SUFFIX = """\nQuestion: {input}
|
||||
{agent_scratchpad}"""
|
||||
|
||||
WIKI_PROMPT = PromptTemplate.from_examples(
|
||||
EXAMPLES, SUFFIX, ["input", "agent_scratchpad"]
|
||||
)
|
||||
Reference in New Issue
Block a user