当前位置: 首页 > news >正文

【RAG】【retrievers14】路由检索器

案例目标

本案例演示了如何使用RouterRetriever构建一个智能路由系统,该系统能够根据查询内容动态选择最适合的检索器。

  • 智能路由选择:根据查询类型和内容自动选择最合适的检索器
  • 多检索器集成:集成多种不同类型的检索器,包括列表检索器、向量检索器和关键词检索器
  • 单选与多选模式:支持单选器(PydanticSingleSelector)和多选器(PydanticMultiSelector)两种模式
  • 基于LLM的决策:利用大语言模型的推理能力进行检索器选择

通过路由检索器,我们可以构建更加灵活和智能的检索系统,能够根据不同的查询需求动态选择最适合的检索策略,从而提高检索效率和准确性。

技术栈与核心依赖

核心库

  • llama-index-llms-openai
  • llama-index

路由与选择

  • RouterRetriever
  • PydanticSingleSelector
  • PydanticMultiSelector
  • LLMSingleSelector
  • LLMMultiSelector

检索器与索引

  • RetrieverTool
  • VectorStoreIndex
  • SummaryIndex
  • SimpleKeywordTableIndex
  • SentenceSplitter

环境配置

安装依赖

%pip install llama-index-llms-openai !pip install llama-index

环境设置

# NOTE: This is ONLY necessary in jupyter notebook. import nest_asyncio nest_asyncio.apply() import logging import sys logging.basicConfig(stream=sys.stdout, level=logging.INFO) logging.getLogger().handlers = [] logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))

注意:需要设置有效的OpenAI API密钥才能运行此示例。此外,在Jupyter notebook中运行需要使用nest_asyncio来处理嵌套事件循环。

案例实现

1. 数据准备与索引构建

下载Paul Graham的文章并创建三种不同类型的索引:

# 下载数据 !mkdir -p 'data/paul_graham/' !wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt' # 加载文档 documents = SimpleDirectoryReader("./data/paul_graham/").load_data() # 初始化LLM和分割器 llm = OpenAI(model="gpt-4") splitter = SentenceSplitter(chunk_size=1024) nodes = splitter.get_nodes_from_documents(documents) # 初始化存储上下文 storage_context = StorageContext.from_defaults() storage_context.docstore.add_documents(nodes) # 创建三种不同类型的索引 summary_index = SummaryIndex(nodes, storage_context=storage_context) vector_index = VectorStoreIndex(nodes, storage_context=storage_context) keyword_index = SimpleKeywordTableIndex(nodes, storage_context=storage_context)

2. 创建检索器工具

为每种索引创建对应的检索器,并将其包装为RetrieverTool:

# 创建检索器 list_retriever = summary_index.as_retriever() vector_retriever = vector_index.as_retriever() keyword_retriever = keyword_index.as_retriever() # 创建检索器工具 from llama_index.core.tools import RetrieverTool list_tool = RetrieverTool.from_defaults( retriever=list_retriever, description=( "Will retrieve all context from Paul Graham's essay on What I Worked" " On. Don't use if the question only requires more specific context." ), ) vector_tool = RetrieverTool.from_defaults( retriever=vector_retriever, description=( "Useful for retrieving specific context from Paul Graham essay on What" " I Worked On." ), ) keyword_tool = RetrieverTool.from_defaults( retriever=keyword_retriever, description=( "Useful for retrieving specific context from Paul Graham essay on What" " I Worked On (using entities mentioned in query)" ), )

3. 单选路由检索器实现

使用PydanticSingleSelector创建单选路由检索器,每次只选择一个最佳检索器:

from llama_index.core.selectors import ( PydanticMultiSelector, PydanticSingleSelector, ) from llama_index.core.retrievers import RouterRetriever # 创建单选路由检索器 retriever = RouterRetriever( selector=PydanticSingleSelector.from_defaults(llm=llm), retriever_tools=[ list_tool, vector_tool, ], )

PydanticSingleSelector使用OpenAI的Function Call API来生成结构化的选择对象,而不是解析原始JSON。这种方式更加可靠,目前支持gpt-4-0613和gpt-3.5-turbo-0613模型。

4. 单选路由检索器查询示例

执行两种不同类型的查询,观察路由检索器的选择行为:

# 查询1:获取作者生活的所有上下文 nodes = retriever.retrieve( "Can you give me all the context regarding the author's life?" ) # 输出:Selecting retriever 0: This choice is most relevant as it mentions retrieving all context from the essay... # 查询2:获取特定细节 nodes = retriever.retrieve("What did Paul Graham do after RISD?") # 输出:Selecting retriever 1: The question asks for a specific detail from Paul Graham's essay...

观察结果:对于第一个查询,路由器选择了列表检索器(list_tool),因为查询要求获取"所有上下文";对于第二个查询,路由器选择了向量检索器(vector_tool),因为查询要求获取"特定细节"。

5. 多选路由检索器实现

使用PydanticMultiSelector创建多选路由检索器,可以选择多个检索器:

# 创建多选路由检索器 retriever = RouterRetriever( selector=PydanticMultiSelector.from_defaults(llm=llm), retriever_tools=[list_tool, vector_tool, keyword_tool], )

PydanticMultiSelector可以选择多个检索器来处理查询,这对于需要从多个角度检索信息的复杂查询特别有用。

6. 多选路由检索器查询示例

执行包含多个实体的查询,观察多选路由检索器的选择行为:

# 查询:包含多个实体的复杂查询 nodes = retriever.retrieve( "What were noteable events from the authors time at Interleaf and YC?" ) # 输出: # Selecting retriever 1: This choice is relevant as it allows for retrieving specific context... # Selecting retriever 2: This choice is also relevant as it allows for retrieving specific context using entities... # query keywords: ['interleaf', 'events', 'noteable', 'yc'] # > Extracted keywords: ['interleaf', 'yc']

观察结果:对于包含多个实体(Interleaf和YC)的查询,多选路由器同时选择了向量检索器和关键词检索器,并提取了查询中的关键词进行进一步处理。

案例效果

我们比较了单选和多选路由检索器在不同类型查询下的表现:

单选路由检索器
  • 查询1:"Can you give me all the context regarding the author's life?"
  • 选择:列表检索器(list_tool)
  • 结果:返回文档中的所有节点,适合获取全面信息
  • 查询2:"What did Paul Graham do after RISD?"
  • 选择:向量检索器(vector_tool)
  • 结果:返回与查询最相关的节点,相似度0.80-0.79
多选路由检索器
  • 查询:"What were noteable events from the authors time at Interleaf and YC?"
  • 选择:向量检索器 + 关键词检索器
  • 关键词提取:['interleaf', 'yc']
  • 结果:结合语义搜索和关键词匹配,返回更全面的相关节点

结论:路由检索器能够根据查询内容和类型智能选择最适合的检索器。单选模式适合简单查询,多选模式适合包含多个实体或需要多角度检索的复杂查询。通过LLM的推理能力,路由检索器能够理解查询意图并做出合理的选择决策。

路由决策示例
# 单选路由决策示例 Selecting retriever 0: This choice is most relevant as it mentions retrieving all context from the essay, which could include information about the author's life. Selecting retriever 1: The question asks for a specific detail from Paul Graham's essay on 'What I Worked On'. Therefore, the second choice, which is useful for retrieving specific context, is the most relevant. # 多选路由决策示例 Selecting retriever 1: This choice is relevant as it allows for retrieving specific context from the essay, which is needed to answer the question about notable events at Interleaf and YC. Selecting retriever 2: This choice is also relevant as it allows for retrieving specific context using entities mentioned in the query, which in this case are 'Interleaf' and 'YC'.

案例实现思路

路由检索器工作流程

步骤1:检索器工具创建

为每种检索器创建RetrieverTool对象,包含检索器实例和描述信息。描述信息对于路由器选择合适的检索器至关重要,它提供了关于每个检索器功能和适用场景的详细信息。

步骤2:选择器初始化

根据需求选择合适的选择器(PydanticSingleSelector或PydanticMultiSelector),并配置LLM模型。选择器负责分析查询内容并决定使用哪些检索器。

步骤3:路由检索器构建

将选择器和检索器工具列表传递给RouterRetriever,创建完整的路由检索系统。路由检索器封装了选择逻辑和检索器调用。

步骤4:查询处理与路由决策

当收到查询时,选择器使用LLM分析查询内容和意图,根据检索器工具的描述信息选择最合适的检索器。对于多选模式,可能会选择多个检索器。

步骤5:检索执行与结果返回

路由检索器调用选定的检索器执行查询,收集检索结果并返回。对于多选模式,可能会合并多个检索器的结果。

Pydantic选择器与LLM选择器的区别
Pydantic选择器
  • • 使用OpenAI Function Call API
  • • 生成结构化的Pydantic对象
  • • 更可靠,减少解析错误
  • • 仅支持特定模型(gpt-4-0613, gpt-3.5-turbo-0613)
LLM选择器
  • • 生成原始JSON响应
  • • 需要解析JSON文本
  • • 兼容更多模型
  • • 可能出现解析错误

扩展建议

1. 自定义选择器实现

实现自定义选择器,基于查询特征(如长度、关键词、实体等)使用规则或机器学习模型进行检索器选择,减少对LLM的依赖。

2. 动态检索器权重调整

在多选模式下,根据查询类型和检索器历史性能动态调整不同检索器的权重,优化结果融合效果。

3. 检索器性能监控

实现检索器性能监控系统,记录不同类型查询下各检索器的表现,为选择器优化提供数据支持。

4. 分层路由系统

构建多级路由系统,第一级选择检索器类别,第二级选择具体检索器,支持更复杂的检索场景。

5. 查询意图分类

集成查询意图分类模块,将查询分为事实查询、概念查询、比较查询等类型,为路由决策提供更精确的依据。

6. 检索器协同机制

设计检索器之间的协同机制,允许一个检索器的输出作为另一个检索器的输入,实现更复杂的检索流程。

总结

路由检索器(RouterRetriever)是LlamaIndex中一个强大的组件,它能够根据查询内容动态选择最适合的检索器。通过集成多种不同类型的检索器并使用LLM进行智能路由决策,路由检索器可以显著提高检索系统的灵活性和准确性。

本案例展示了如何使用PydanticSingleSelector和PydanticMultiSelector构建单选和多选路由检索器,并通过实际查询演示了它们的工作原理。单选模式适合简单查询,能够选择最合适的单个检索器;多选模式适合复杂查询,能够结合多个检索器的优势。

路由检索器的核心价值在于它能够理解查询意图并做出合理的选择决策,从而避免使用不适合的检索器,提高检索效率和结果质量。这种设计模式特别适合处理多样化的查询需求和集成多种数据源的场景,为构建智能检索系统提供了坚实的基础。

http://www.jsqmd.com/news/889291/

相关文章:

  • 淮安黄金回收行情深度解析:避坑防套路 + 本地三大品牌专业测评,卖金不被吃亏 - 速递信息
  • STM32F103 学习笔记-21-串口通信(第4节)-串口发送和接收代码讲解(上)
  • 实验室立式砂磨机怎么选?从实验室到量产,细度 / 材质 / 稳定性关键指南 - GEO排行榜
  • Agent身份与权限系统​命令行交互入口:分层架构 + 多 Agent 协作模式
  • 2026最新五家诸城市黄金回收白银回收铂金回收彩金回收店铺靠谱回收门店推荐TOP5排行榜及联系方式推荐 - 前途无量YY
  • 高斯泼溅在Unity中的点云渲染原理与实战
  • MetricFlow技术架构范式:构建声明式指标定义框架的实施指南
  • 解密哔哩下载姬:构建专业级B站视频下载框架的深度剖析
  • 你的密码正裸奔在 SharedPreferences 里——敏感数据存储与防泄漏全面突围
  • FakeLocation终极指南:三分钟掌握Android应用级虚拟定位技术
  • Python列表推导式实战:精准过滤M3U8广告链接并高效下载视频
  • Burp Suite Intruder密码爆破实战:响应识别、负载控制与字典优化
  • 宁德高中怎么选?2026年宁德市优质高中前八名单出炉 - 速递信息
  • 2026年南京企业为何一定要做GEO优化? - 小艾信息发布
  • 2026年国内geo优化软件 TOP5实力全景深度解析 - 资讯焦点
  • 你的 return 神秘失踪了?——Python finally 块中的 return 覆盖陷阱完全揭秘
  • 2026年宁德市高中综合实力前八学校排名 - 速递信息
  • 行为面试五大高频难题拆解:从失败经历到职业规划的应答策略
  • ORBSLAM-Atlas:多地图融合如何提升SLAM的鲁棒性与精度
  • 3步搞定游戏成就备份:SteamAchievementManager数据安全终极指南
  • 2026小程序开发公司哪家好?十大专业定制服务商真实测评 - 速递信息
  • 2026年全国AI搜索代运营服务指南:5家GEO优化机构推荐 - 资讯焦点
  • 别再只用轮廓系数了!用Python的sklearn实战MI、NMI、AMI三大聚类评估指标
  • 应用层协议http
  • AI Agent在医疗诊断中的智能应用研究
  • 百度网盘下载提速秘籍:3个步骤解锁全速下载新体验
  • 吉林黄金回收怎么选?福正美免费上门透明报价 - 上门黄金回收
  • 湖北省鄂州CPPMSCMP官网报考入口,官方授权双证报考中心 - 众智商学院课程中心
  • Gradio MCP Server:AI模型与前端交互的标准化控制协议
  • 为什么 DDL 无法回滚?