Routers are modules that take in a user query and a set of “choices” (defined by metadata), and returns one or more selected choices.
They can be used on their own (as “selector modules”), or used as a query engine or retriever (e.g. on top of other query engines/retrievers).
They are simple but powerful modules that use LLMs for decision making capabilities. They can be used for the following use cases and more:
Selecting the right data source among a diverse range of data sources
Deciding whether to do summarization (e.g. using summary index query engine) or semantic search (e.g. using vector index query engine)
Deciding whether to “try” out a bunch of choices at once and combine the results (using multi-routing capabilities).
The core router modules exist in the following forms:
LLM selectors put the choices as a text dump into a prompt and use LLM text completion endpoint to make decisions
Pydantic selectors pass choices as Pydantic schemas into a function calling endpoint, and return Pydantic objects
A simple example of using our router module as part of a query engine is given below.
from llama_index.query_engine.router_query_engine import RouterQueryEngine
from llama_index.selectors.pydantic_selectors import PydanticSingleSelector
from llama_index.tools.query_engine import QueryEngineTool
list_tool = QueryEngineTool.from_defaults(
description="Useful for summarization questions related to the data source",
vector_tool = QueryEngineTool.from_defaults(
description="Useful for retrieving specific context related to the data source",
query_engine = RouterQueryEngine(
You can find more details using routers as standalone modules, as part of a query engine, and as part of a retriever below in the usage pattern guide.