Skip to content

路由器#

概念#

路由器是一个模块,接收用户查询和一组“选择”(由元数据定义),并返回一个或多个已选选择。

它们可以单独使用(作为“选择器模块”),也可以用作查询引擎或检索器的一部分(例如在其他查询引擎/检索器之上)。

它们是简单但功能强大的模块,使用LLM进行决策能力。它们可以用于以下用例以及更多:

  • 在多样化的数据源中选择合适的数据源
  • 决定是进行摘要(例如使用摘要索引查询引擎)还是语义搜索(例如使用向量索引查询引擎)
  • 决定是否一次“尝试”一堆选择并组合结果(使用多路由能力)。

核心路由器模块以以下形式存在:

  • LLM选择器将选择作为文本转储放入提示中,并使用LLM文本完成端点做出决策
  • Pydantic选择器将选择作为Pydantic模式传递到调用端点的函数,并返回Pydantic对象

使用模式#

下面是使用我们的路由器模块作为查询引擎的简单示例。

from llama_index.core.query_engine import RouterQueryEngine
from llama_index.core.selectors import PydanticSingleSelector
from llama_index.core.tools import QueryEngineTool


list_tool = QueryEngineTool.from_defaults(
    query_engine=list_query_engine,
    description="用于与数据源相关的摘要问题",
)
vector_tool = QueryEngineTool.from_defaults(
    query_engine=vector_query_engine,
    description="用于检索与数据源相关的特定上下文",
)

query_engine = RouterQueryEngine(
    selector=PydanticSingleSelector.from_defaults(),
    query_engine_tools=[
        list_tool,
        vector_tool,
    ],
)
query_engine.query("<query>")

使用模式#

定义“选择器”是定义路由器的核心。

您可以轻松地将我们的路由器用作查询引擎或检索器。在这些情况下,路由器将负责“选择”要路由用户查询的查询引擎或检索器。

我们还强调了我们的ToolRetrieverRouterQueryEngine用于检索增强路由 - 这是一种情况,其中选择本身可能非常庞大并且可能需要进行索引。注意:这是一个测试功能。

我们还强调了将我们的路由器用作独立模块。

定义选择器#

以下是使用LLM和Pydantic基础的单/多选择器的一些示例:

from llama_index.core.selectors import LLMSingleSelector, LLMMultiSelector
from llama_index.core.selectors import (
    PydanticMultiSelector,
    PydanticSingleSelector,
)

# pydantic选择器将pydantic对象馈送到调用API的函数中
# 单选择器(pydantic)
selector = PydanticSingleSelector.from_defaults()
# 多选择器(pydantic)
selector = PydanticMultiSelector.from_defaults()

# LLM选择器使用文本完成端点
# 单选择器(LLM)
selector = LLMSingleSelector.from_defaults()
# 多选择器(LLM)
selector = LLMMultiSelector.from_defaults()

作为查询引擎使用#

RouterQueryEngine是在其他查询引擎上构建的工具。

from llama_index.core.query_engine import RouterQueryEngine
from llama_index.core.selectors import PydanticSingleSelector
from llama_index.core.selectors.pydantic_selectors import Pydantic
from llama_index.core.tools import QueryEngineTool
from llama_index.core import VectorStoreIndex, SummaryIndex

# 定义查询引擎
...

# 初始化工具
list_tool = QueryEngineTool.from_defaults(
    query_engine=list_query_engine,
    description="用于与数据源相关的摘要问题",
)
vector_tool = QueryEngineTool.from_defaults(
    query_engine=vector_query_engine,
    description="用于检索与数据源相关的特定上下文",
)

# 初始化路由器查询引擎(单选择,pydantic)
query_engine = RouterQueryEngine(
    selector=PydanticSingleSelector.from_defaults(),
    query_engine_tools=[
        list_tool,
        vector_tool,
    ],
)
query_engine.query("<query>")

作为检索器使用#

同样,RouterRetriever是在其他检索器上构建的工具。以下是一个示例:

from llama_index.core.query_engine import RouterQueryEngine
from llama_index.core.selectors import PydanticSingleSelector
from llama_index.core.tools import RetrieverTool

# 定义索引
...

# 定义检索器
vector_retriever = vector_index.as_retriever()
keyword_retriever = keyword_index.as_retriever()

# 初始化工具
vector_tool = RetrieverTool.from_defaults(
    retriever=vector_retriever,
    description="用于从 Paul Graham 的《我做过的事》(What I Worked On) 文章中检索特定上下文。",
)
keyword_tool = RetrieverTool.from_defaults(
    retriever=keyword_retriever,
    description="用于从 Paul Graham 的《我做过的事》(What I Worked On) 文章中检索特定上下文(使用查询中提到的实体)。",
)

# 定义检索器
retriever = RouterRetriever(
    selector=PydanticSingleSelector.from_defaults(llm=llm),
    retriever_tools=[
        list_tool,
        vector_tool,
    ],
)

作为独立模块使用选择器#

您可以将选择器作为独立模块使用。将选择定义为 ToolMetadata 列表或字符串列表。

from llama_index.core.tools import ToolMetadata
from llama_index.core.selectors import LLMSingleSelector


# 选择定义为工具元数据列表
choices = [
    ToolMetadata(description="choice 1 的描述", name="choice_1"),
    ToolMetadata(description="choice 2 的描述", name="choice_2"),
]

# 选择定义为字符串列表
choices = [
    "choice 1 - choice 1 的描述",
    "choice 2: choice 2 的描述",
]

selector = LLMSingleSelector.from_defaults()
selector_result = selector.select(
    choices, query="IBM 在 2007 年的营收增长是多少?"
)
print(selector_result.selections)

更多示例: