Skip to main content

XML Agent

Some language models (like Anthropic’s Claude) are particularly good at reasoning/writing XML. This goes over how to use an agent that uses XML when prompting.

Initialize the tools​

We will initialize some fake tools for demo purposes

from langchain.agents import tool


@tool
def search(query: str) -> str:
"""Search things about current events."""
return "32 degrees"
tools = [search]
from langchain.chat_models import ChatAnthropic

model = ChatAnthropic(model="claude-2")

Use LangChain Expression Language​

We will first show how to create this agent using LangChain Expression Language

from langchain import hub
from langchain.agents.format_scratchpad import format_xml
from langchain.agents.output_parsers import XMLAgentOutputParser
from langchain.tools.render import render_text_description
prompt = hub.pull("hwchase17/xml-agent")
prompt = 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"]),
}
| prompt
| llm_with_stop
| XMLAgentOutputParser()
)
from langchain.agents import AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke({"question": "whats the weather in New york?"})


> Entering new AgentExecutor chain...
<tool>search</tool>
<tool_input>weather in new york32 degrees <tool>search</tool>
<tool_input>weather in new york32 degrees <final_answer>
The weather in New York is 32 degrees.
</final_answer>

> Finished chain.
{'question': 'whats the weather in New york?',
'output': '\nThe weather in New York is 32 degrees.\n'}

Use off-the-shelf agent​

from langchain.agents import XMLAgent
from langchain.chains import LLMChain
chain = LLMChain(
llm=model,
prompt=XMLAgent.get_default_prompt(),
output_parser=XMLAgent.get_default_output_parser(),
)
agent = XMLAgent(tools=tools, llm_chain=chain)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke({"input": "whats the weather in New york?"})


> Entering new AgentExecutor chain...
<tool>search</tool>
<tool_input>weather in new york32 degrees

<final_answer>The weather in New York is 32 degrees

> Finished chain.
{'input': 'whats the weather in New york?',
'output': 'The weather in New York is 32 degrees'}