跳到内容

Retriever 路由器

RetrieverRouterQueryEngine #

基类: BaseQueryEngine

基于检索器的路由查询引擎。

注意:此功能已弃用,请使用我们新的 ToolRetrieverRouterQueryEngine

使用检索器选择一组节点。每个节点将被转换为 ToolMetadata 对象,并用于检索查询引擎,以形成 QueryEngineTool。

注意:这是一个 Beta 功能。我们正在探索检索器和查询引擎之间的正确接口。

参数

名称 类型 描述 默认值
selector BaseSelector

一个选择器,它基于每个候选的元数据和查询从多个选项中选择一个。

必需
query_engine_tools 序列[QueryEngineTool]

候选查询引擎的序列。它们必须被封装为工具,以便向选择器暴露元数据。

必需
callback_manager 可选[CallbackManager]

一个回调管理器。

源代码位于 llama-index-core/llama_index/core/query_engine/router_query_engine.py
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
class RetrieverRouterQueryEngine(BaseQueryEngine):
    """
    Retriever-based router query engine.

    NOTE: this is deprecated, please use our new ToolRetrieverRouterQueryEngine

    Use a retriever to select a set of Nodes. Each node will be converted
    into a ToolMetadata object, and also used to retrieve a query engine, to form
    a QueryEngineTool.

    NOTE: this is a beta feature. We are figuring out the right interface
    between the retriever and query engine.

    Args:
        selector (BaseSelector): A selector that chooses one out of many options based
            on each candidate's metadata and query.
        query_engine_tools (Sequence[QueryEngineTool]): A sequence of candidate
            query engines. They must be wrapped as tools to expose metadata to
            the selector.
        callback_manager (Optional[CallbackManager]): A callback manager.

    """

    def __init__(
        self,
        retriever: BaseRetriever,
        node_to_query_engine_fn: Callable,
        callback_manager: Optional[CallbackManager] = None,
    ) -> None:
        self._retriever = retriever
        self._node_to_query_engine_fn = node_to_query_engine_fn
        super().__init__(callback_manager)

    def _get_prompt_modules(self) -> PromptMixinType:
        """Get prompt sub-modules."""
        # NOTE: don't include tools for now
        return {"retriever": self._retriever}

    def _query(self, query_bundle: QueryBundle) -> RESPONSE_TYPE:
        nodes_with_score = self._retriever.retrieve(query_bundle)
        # TODO: for now we only support retrieving one node
        if len(nodes_with_score) > 1:
            raise ValueError("Retrieved more than one node.")

        node = nodes_with_score[0].node
        query_engine = self._node_to_query_engine_fn(node)
        return query_engine.query(query_bundle)

    async def _aquery(self, query_bundle: QueryBundle) -> RESPONSE_TYPE:
        return self._query(query_bundle)