mirror of
https://github.com/hwchase17/langchain.git
synced 2025-09-09 06:53:59 +00:00
Templates (#12294)
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:
3
templates/xml-agent/xml_agent/__init__.py
Normal file
3
templates/xml-agent/xml_agent/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from xml_agent.agent import agent_executor
|
||||
|
||||
__all__ = ["agent_executor"]
|
48
templates/xml-agent/xml_agent/agent.py
Normal file
48
templates/xml-agent/xml_agent/agent.py
Normal 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"])
|
50
templates/xml-agent/xml_agent/prompts.py
Normal file
50
templates/xml-agent/xml_agent/prompts.py
Normal 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)
|
Reference in New Issue
Block a user