forked from Archives/langchain
196 lines
6.7 KiB
Plaintext
196 lines
6.7 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "5436020b",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Routing Chains\n",
|
|
"Some applications will require not just a predetermined chain of calls to LLMs/other tools, but potentially an unknown chain that depends on the user input. In these types of chains, there is a \"router\" LLM chain which has access to a suite of tools. Depending on the user input, the router can then decide which, if any, of these tools to call.\n",
|
|
"\n",
|
|
"These types of chains are called Routing Chains. When used correctly these can be extremely powerful. The purpose of this notebook is to show you how to easily use routing chains through the simplest, highest level API. If you want more low level control over various components, check out the documentation for custom routing chains."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "3c6226b9",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Concepts\n",
|
|
"\n",
|
|
"In order to understand routing chains, you should understand the following concepts:\n",
|
|
"- Tool: A function that performs a specific duty. This can be things like: Google Search, Database lookup, Python REPL, other chains. The interface for a tool is currently a function that is expected to have a string as an input, with a string as an output.\n",
|
|
"- LLM: The language model responsible for doing the router.\n",
|
|
"- RouterType: The type of the router to use. This should be a string (see more on the allowed router types below). Because this notebook focuses on the simplest, highest level API, this only covers using the standard supported routers. If you want to implement a custom router, see the documentation for custom routing chains."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "05d4b21e",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Tools\n",
|
|
"When constructing your own Routing Chain, you will need to provide it with a list of tools that it can use. This is done with a list of Tools. The Tools are used not only to create the Routing Chain, but is also sometimes used to create the router itself (often, the router logic depends on the tools available). \n",
|
|
"\n",
|
|
"```python\n",
|
|
"class Tool(NamedTuple):\n",
|
|
" \"\"\"Interface for tools.\"\"\"\n",
|
|
"\n",
|
|
" name: str\n",
|
|
" func: Callable[[str], str]\n",
|
|
" description: Optional[str] = None\n",
|
|
"```\n",
|
|
"\n",
|
|
"The two required components of a ToolConfig are the name and then the tool itself. A tool description is optional, as it is needed for some routers but not all."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "2558a02d",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Loading the chains\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "36ed392e",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Import things that are needed generically\n",
|
|
"from langchain.routing_chains import load_routing_chain, Tool\n",
|
|
"from langchain.llms import OpenAI"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "56ff7670",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Load the tool configs that are needed.\n",
|
|
"from langchain import LLMMathChain, SerpAPIChain\n",
|
|
"llm = OpenAI(temperature=0)\n",
|
|
"search = SerpAPIChain()\n",
|
|
"llm_math_chain = LLMMathChain(llm=llm, verbose=True)\n",
|
|
"tools = [\n",
|
|
" Tool(\n",
|
|
" name = \"Search\",\n",
|
|
" func=search.run,\n",
|
|
" description=\"useful for when you need to answer questions about current events\"\n",
|
|
" ),\n",
|
|
" Tool(\n",
|
|
" name=\"Calculator\",\n",
|
|
" func=llm_math_chain.run,\n",
|
|
" description=\"useful for when you need to answer questions about math\"\n",
|
|
" )\n",
|
|
"]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "5b93047d",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Construct the routing chain. We will use the default router type here.\n",
|
|
"# See documentation for a full list of options.\n",
|
|
"router_llm = OpenAI(temperature=0)\n",
|
|
"chain = load_routing_chain(tools, router_llm, verbose=True)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "6f96a891",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"\n",
|
|
"\u001b[1m> Entering new chain...\u001b[0m\n",
|
|
"What is the age of Olivia Wilde's boyfriend raised to the 0.23 power?\n",
|
|
"Thought:\u001b[32;1m\u001b[1;3m I need to find the age of Olivia Wilde's boyfriend\n",
|
|
"Action: Search\n",
|
|
"Action Input: \"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",
|
|
"Thought:\u001b[32;1m\u001b[1;3m I need to find the age of Harry Styles\n",
|
|
"Action: Search\n",
|
|
"Action Input: \"Harry Styles age\"\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",
|
|
"Action: Calculator\n",
|
|
"Action Input: 28^0.23\u001b[0m\n",
|
|
"\n",
|
|
"\u001b[1m> Entering new chain...\u001b[0m\n",
|
|
"28^0.23\u001b[32;1m\u001b[1;3m\n",
|
|
"\n",
|
|
"```python\n",
|
|
"print(28**0.23)\n",
|
|
"```\n",
|
|
"\u001b[0m\n",
|
|
"Answer: \u001b[33;1m\u001b[1;3m2.1520202182226886\n",
|
|
"\u001b[0m\n",
|
|
"\u001b[1m> Finished chain.\u001b[0m\n",
|
|
"\n",
|
|
"Observation: \u001b[33;1m\u001b[1;3mAnswer: 2.1520202182226886\n",
|
|
"\u001b[0m\n",
|
|
"Thought:\u001b[32;1m\u001b[1;3m I now know the final answer\n",
|
|
"Final Answer: 2.1520202182226886\u001b[0m\n",
|
|
"\u001b[1m> Finished chain.\u001b[0m\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'2.1520202182226886'"
|
|
]
|
|
},
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"chain.run(\"What is the age of Olivia Wilde's boyfriend raised to the 0.23 power?\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "2f0852ff",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.7.6"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|