Co-authored-by: Harrison Chase <hw.chase.17@gmail.com>
Co-authored-by: Lance Martin <lance@langchain.dev>
Co-authored-by: Jacob Lee <jacoblee93@gmail.com>
This commit is contained in:
Erick Friis
2023-10-25 18:47:42 -07:00
committed by GitHub
parent 43257a295c
commit ebf998acb6
242 changed files with 53432 additions and 31 deletions

View File

@@ -0,0 +1,3 @@
from xml_agent.agent import agent_executor
__all__ = ["agent_executor"]

View File

@@ -0,0 +1,48 @@
from langchain.chat_models import ChatAnthropic
from langchain.tools.render import render_text_description
from langchain.agents.format_scratchpad import format_xml
from langchain.agents import AgentExecutor
from langchain.retrievers.you import YouRetriever
from langchain.agents.agent_toolkits.conversational_retrieval.tool import create_retriever_tool
from langchain.pydantic_v1 import BaseModel
from xml_agent.prompts import conversational_prompt, parse_output
from langchain.schema import AIMessage, HumanMessage
from typing import List, Tuple
def _format_chat_history(chat_history: List[Tuple[str, str]]):
buffer = []
for human, ai in chat_history:
buffer.append(HumanMessage(content=human))
buffer.append(AIMessage(content=ai))
return buffer
model = ChatAnthropic(model="claude-2")
# Fake Tool
retriever = YouRetriever(k=5)
retriever_tool = create_retriever_tool(retriever, "search", "Use this to search for current events.")
tools = [retriever_tool]
prompt = conversational_prompt.partial(
tools=render_text_description(tools),
tool_names=", ".join([t.name for t in tools]),
)
llm_with_stop = model.bind(stop=["</tool_input>"])
agent = {
"question": lambda x: x["question"],
"agent_scratchpad": lambda x: format_xml(x['intermediate_steps']),
"chat_history": lambda x: _format_chat_history(x["chat_history"]),
} | prompt | llm_with_stop | parse_output
class AgentInput(BaseModel):
question: str
chat_history: List[Tuple[str, str]]
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True).with_types(
input_type=AgentInput
)
agent_executor = agent_executor | (lambda x: x["output"])

View File

@@ -0,0 +1,50 @@
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.schema import AgentAction, AgentFinish
template = """You are a helpful assistant. Help the user answer any questions.
You have access to the following tools:
{tools}
In order to use a tool, you can use <tool></tool> and <tool_input></tool_input> tags. You will then get back a response in the form <observation></observation>
For example, if you have a tool called 'search' that could run a google search, in order to search for the weather in SF you would respond:
<tool>search</tool><tool_input>weather in SF</tool_input>
<observation>64 degrees</observation>
When you are done, you can respond as normal to the user.
Example 1:
Human: Hi!
Assistant: Hi! How are you?
Human: What is the weather in SF?
Assistant: <tool>search</tool><tool_input>weather in SF</tool_input>
<observation>64 degrees</observation>
It is 64 degress in SF
Begin!"""
conversational_prompt = ChatPromptTemplate.from_messages([
("system", template),
MessagesPlaceholder(variable_name="chat_history"),
("user", "{question}"),
("ai", "{agent_scratchpad}")
])
def parse_output(message):
text = message.content
if "</tool>" in text:
tool, tool_input = text.split("</tool>")
_tool = tool.split("<tool>")[1]
_tool_input = tool_input.split("<tool_input>")[1]
if "</tool_input>" in _tool_input:
_tool_input = _tool_input.split("</tool_input>")[0]
return AgentAction(tool=_tool, tool_input=_tool_input, log=text)
else:
return AgentFinish(return_values={"output": text}, log=text)