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

RAG_查询重构与分发 - 实践

用户的原始问题往往不是最优的检索输入。它可能过于复杂、包含歧义,或者与文档的实际措辞存在偏差。为了解决这些问题,我们需要在检索之前对用户的查询进行“预处理”,这就是本节要探讨的查询重构与分发

这个阶段主要包含两个关键技术:

  1. 查询翻译(Query Translation):将用户的原始问题转换成一个或多个更适合检索的形式。
  2. 查询路由(Query Routing):根据问题的性质,将其智能地分发到最合适的数据源或检索器。

本节将重点介绍几种主流的查询翻译技术,并简要讨论查询路由的概念。

一、查询翻译

查询翻译的目标是弥合用户自然语言提问与文档库中存储信息之间的“语义鸿沟”。通过重写、分解或扩展查询,我们可以显著提升检索的准确率。

1.1 提示工程

这是最直接的查询重构方法。通过精心设计的提示词(Prompt),可以引导 LLM 将用户的原始查询改写得更清晰、更具体,或者转换成一种更利于检索的叙述风格。

在第二节查询构建的代码示例中,我们发现 SelfQueryRetriever 无法正确处理“时间最短的视频”这类需要排序或进行比较的查询。

为了解决这个问题,可以采用一种更高级的提示工程技巧:让 LLM 直接构建出查询指令

这种方法的思路是,要求 LLM 直接分析用户的意图,并生成一个结构化(例如 JSON 格式)的指令,告诉我们的代码应该如何操作。对于“时间最短的视频”这个问题,我们期望 LLM 能直接告诉我们:“请按‘时长’字段进行升序排序,并返回第一条结果”。

下面,来看看如何修改代码来实现这一思路。我们不再使用 SelfQueryRetriever,而是直接与 LLM 交互,并根据其返回的指令在代码中执行排序逻辑。

关键的修改主要有两部分:

  1. 设计一个新的提示词(Prompt),要求 LLM 输出 JSON 格式的排序指令。

    # 使用大模型将自然语言转换为排序指令
    prompt = f"""你是一个智能助手,请将用户的问题转换成一个用于排序视频的JSON指令。你需要识别用户想要排序的字段和排序方向。
    - 排序字段必须是 'view_count' (观看次数) 或 'length' (时长) 之一。
    - 排序方向必须是 'asc' (升序) 或 'desc' (降序) 之一。例如:
    - '时间最短的视频' 或 '哪个视频时间最短' 应转换为 {{"sort_by": "length", "order": "asc"}}
    - '播放量最高的视频' 或 '哪个视频最火' 应转换为 {{"sort_by": "view_count", "order": "desc"}}请根据以下问题生成JSON指令:
    原始问题: "{query}"JSON指令:"""
  2. 在代码中调用 LLM,解析其返回的 JSON 指令,并执行相应的排序操作。

    # ... (前略,初始化LLM客户端)# 请求LLM生成指令,并指定返回JSON格式
    response = client.chat.completions.create(model="deepseek-chat",messages=[{"role": "user", "content": prompt}],temperature=0,response_format={"type": "json_object"}
    )# 解析指令并执行排序
    try:import jsoninstruction_str = response.choices[0].message.contentinstruction = json.loads(instruction_str)print(f"--- 生成的排序指令: {instruction} ---")sort_by = instruction.get('sort_by')order = instruction.get('order')if sort_by in ['length', 'view_count'] and order in ['asc', 'desc']:# 在代码中执行排序reverse_order = (order == 'desc')sorted_docs = sorted(all_documents, key=lambda doc: doc.metadata.get(sort_by, 0), reverse=reverse_order)# 获取排序后的第一个结果并打印if sorted_docs:doc = sorted_docs[0]# ... (打印结果的代码)except (json.JSONDecodeError, KeyError) as e:print(f"解析或执行指令失败: {e}")

通过这种方式,成功地将 LLM 从一个简单的“文本改写员”提升为了一个能够理解复杂意图并生成可执行计划的“智能代理”,从而优雅地解决了“最值”查询的难题。

完整代码

1.2 多查询分解 (Multi-query)

</

http://www.gsyq.cn/news/66172.html

相关文章:

  • java要记
  • 2025苯板雕刻加工厂TOP5权威推荐:苯板立体雕刻制造商哪
  • 【C編程】多個.c文件聯編
  • 2025年全国十大会议策划执行服务商排行榜,万贝上海文化传播
  • 【机器学习13】异常检测优化、推荐框架、协同过滤
  • 102302134陈蔡裔数据采集第四次作业
  • 2025年浙江寄宿制美术高中服务哪家好?性价比之选与口碑排名
  • 2025年十大杭州泡沫雕塑服务商厂家排行榜,精选泡沫雕塑厂家
  • 2025年十大泡沫雕塑厂家推荐,专业泡沫雕塑制造商全解析
  • 2025年知名的大连学习3D建模高性价比课程榜
  • 2025年质量好的电袋复合除尘器高评价厂家推荐榜
  • 2025年优秀的大连校企合作的公司实力机构名单
  • 【SpringBoot】31 核心功能 - 单元测试 - JUnit5 单元测试中的断言机制——验证你的代码是否按预期执行了 - 详解
  • 2025年质量好的四川水溶肥厂家最新权威推荐排行榜
  • 2025年优秀的日式搬家公司值得信赖榜
  • 2025年高压电力金具厂家哪家好?五大合作案例丰富企业推荐全
  • 2025年评价高的平焊不锈钢法兰厂家实力及用户口碑排行榜
  • 《再谈图连通性相关算法》阅读笔记
  • 2026高考艺术文化课辅导机构推荐:宁夏五大诚信艺考文化课培
  • 2025年热门的F4星板材厂家推荐及选购参考榜
  • 深入解析 TCP 协议:从细节到实践的全方位解读 - 指南
  • 2025年质量好的轻奢全品类五金品牌厂家排行榜
  • 2025年东北大豆种子企业TOP5排行榜,高产品种天豆1号种
  • 2025年热门的水产养殖塑钢线/农业塑钢线厂家最新实力排行
  • 2025年比较好的纯棉水刺无纺布/包棉衬无纺布实力厂家TOP推荐榜
  • markdown 嵌入可以运行的javascript
  • 2025.11 模拟赛记录
  • fix-broken-img:零依赖的图片优雅降级解决方案
  • 2025年知名的四面弹衬布/服装衬布厂家推荐及选择指南
  • 2025年知名的饮料标签厂家推荐及选择参考