文章目录
- 引言:当RAG遇上"语义鸿沟"
- 为何需要查询转换?
- 查询转换的三重魔法
- 魔法一:查询重写 (Query Rewriting) ------ 视角拓展的艺术
- 魔法二:回溯提示 (Step-Back Prompting) ------ 退一步,海阔天空
- 魔法三:子查询分解 (Sub-Query Decomposition) ------ 化繁为简的力量
- 结语:开启你的查询转换之旅
你的RAG(检索增强生成)应用是不是有时像个固执的图书管理员,只认死理?你问"全球变暖的影响",它却对满载"气候变化"信息的文档视而不见。这并非AI愚笨,而是你的提问与知识库之间存在一道难以逾越的"语义鸿沟"。用户的问题千变万化,而文档的表述却相对固定,这种不匹配正是许多RAG应用效果不佳的根源。
今天,我们就来学习如何用"查询转换"(Query Transformation)这把魔法钥匙,打开通往更高检索精度的大门。它能让你的AI应用不再拘泥于字面,而是真正理解用户意图,从而给出更精准、更全面的回答。
为何需要查询转换?
传统的RAG流程很简单:用户提问 → 嵌入问题 → 向量检索 → 生成答案。这个流程的弱点在于,它假设用户的原始问题就是最佳的检索指令。但现实往往并非如此:
- 措辞模糊:用户可能使用口语化或不精确的词语。
- 视角单一:一个问题可能只触及了复杂主题的一个侧面。
- 问题复合:一个问题可能包含了多个需要独立检索的子问题。
查询转换正是为了解决这些挑战而生。它在将问题送入检索系统之前,先用大语言模型(LLM)对问题本身进行"预处理"和"优化",就像一位聪明的助手,帮你把随口一问,变成一个结构清晰、意图明确的"专业级"检索指令。
查询转换的三重魔法
查询转换并非单一技术,而是一系列策略的集合。其中,最常用且效果显著的有三种,我们称之为"三重魔法"。
魔法一:查询重写 (Query Rewriting) ------ 视角拓展的艺术
想象一下,你在进行头脑风暴,试图从不同角度探讨一个话题。查询重写就是让LLM帮你做这件事。它接收一个原始问题,然后生成多个语义相近但表述不同的新问题。这极大地增加了检索的"覆盖面",能有效捕获那些使用了同义词或不同措辞的相关文档。
这种方法的核心在于提升"召回率"。即使原始查询可能错过某些文档,但经过扩展的查询矩阵很可能会命中它们。
例如,当用户查询"绿色能源"时,一个优秀的查询重写系统可能会生成如下查询列表:
- 原始查询: "绿色能源有哪些?"
- 重写查询1: "可再生能源的种类"
- 重写查询2: "清洁能源技术的例子"
- 重写查询3: "对环境友好的发电方式"
这些查询将分别进行检索,最终将所有结果汇总,为生成答案提供更丰富的素材。这种方法对于依赖关键词检索的系统尤其有效。
实战代码:查询重写
我们可以使用 LangChain 框架轻松实现这一功能。以下代码展示了如何构建一个查询重写链(Chain)。
# 假设已安装 langchain, langchain-openai
# 并设置了 OPENAI_API_KEY 环境变量
import os
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
# 1. 定义用于重写的LLM
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# 2. 创建提示模板
rewrite_template = """
作为一名AI助手,你的任务是重写用户查询,以提升在RAG系统中的检索效果。
请将原始查询改写得更具体、更详细,从而更有可能检索到相关信息。
不要只返回一个结果,请从不同角度生成3个不同的重写版本,用换行符隔开。
原始查询: {original_query}
重写后的查询:
"""
rewrite_prompt = PromptTemplate(
input_variables=["original_query"],
template=rewrite_template
)
# 3. 构建查询重写链
query_rewriter_chain = rewrite_prompt | llm
# 4. 执行重写
original_query = "气候变化对环境有什么影响?"
response = query_rewriter_chain.invoke({"original_query": original_query})
rewritten_queries = response.content.strip().split('\n')
print(f"原始查询: {original_query}\n")
print("重写后的查询:")
for q in rewritten_queries:
print(f"- {q}")
# --- 可能的输出 ---
# 原始查询: 气候变化对环境有什么影响?
#
# 重写后的查询:
# - 气候变化如何具体影响生态系统、生物多样性、天气模式和海平面?
# - 全球变暖对自然环境造成的长期后果是什么?
# - 探讨气候变化在不同地理区域(如极地、热带雨林)的环境表现。
魔法二:回溯提示 (Step-Back Prompting) ------ 退一步,海阔天空
有时候,用户的问题过于具体,导致检索系统只能找到非常零散、缺乏宏观背景的信息。回溯提示的策略是"退一步",让LLM根据具体问题生成一个更宽泛、更上位的概念性问题。先用这个通用问题检索宏观背景知识,再结合原始问题进行精准检索,最终将两者结合,生成既有深度又有广度的答案。
例如,对于一个具体问题:
- 原始查询: “阿尔伯特·爱因斯坦在哪所大学提出了广义相对论?”
- 回溯问题: “广义相对论的科学原理和发展历史是怎样的?”
先检索"回溯问题",可以获得关于广义相对论的全面背景,这为理解和回答原始的具体问题提供了必要的上下文。
实战代码:回溯提示
# 1. 定义用于回溯的LLM (可复用之前的llm实例)
# 2. 创建回溯提示模板
step_back_template = """
作为一名AI助手,你的任务是根据一个具体问题,生成一个更通用、更宏观的“回溯”问题。
这个回溯问题应该有助于检索到能为原始问题提供背景知识的上下文。
原始查询: {original_query}
回溯问题:
"""
step_back_prompt = PromptTemplate(
input_variables=["original_query"],
template=step_back_template
)
# 3. 构建回溯链
step_back_chain = step_back_prompt | llm
# 4. 执行回溯
original_query = "在Python的pandas库中,如何高效地合并两个大型DataFrame?"
response = step_back_chain.invoke({"original_query": original_query})
step_back_query = response.content.strip()
print(f"原始查询: {original_query}\n")
print(f"回溯问题: {step_back_query}")
# --- 可能的输出 ---
# 原始查询: 在Python的pandas库中,如何高效地合并两个大型DataFrame?
#
# 回溯问题: Python中数据操作和处理的基本原则是什么?
魔法三:子查询分解 (Sub-Query Decomposition) ------ 化繁为简的力量
当用户提出一个复杂问题,比如包含比较、因果关系或多主题时,单一的检索很难同时满足所有信息需求。子查询分解就像一位出色的项目经理,将一个庞大的任务拆解成多个清晰、可执行的小任务。LLM会将复杂问题分解为多个简单的子问题,每个子问题都可以独立进行检索。
这种"分而治之"的策略确保了复杂问题的每个方面都能得到充分的信息支持。例如处理"微软和谷歌去年谁赚的钱更多?"这类问题时,分解是必不可少的。
- 原始查询:
"比较一下React和Vue的优缺点,并说明它们各自适合的应用场景。"
- 子查询1: "React框架的主要优点和缺点是什么?"
- 子查询2: "Vue框架的主要优点和缺点是什么?"
- 子查询3: "React框架适合在哪些类型的项目中使用?"
- 子查询4: "Vue框架适合在哪些类型的项目中使用?"
将所有子查询的检索结果整合起来,LLM就能胸有成竹地给出一个全面而有条理的答案。
实战代码:子查询分解
# 1. 定义用于分解的LLM (可复用之前的llm实例)
# 2. 创建分解提示模板
decompose_template = """
作为一名AI助手,你的任务是将一个复杂问题分解为2-4个更简单的子问题。
这些子问题的答案合在一起,应该能全面回答原始问题。
请将每个子问题放在新的一行。
原始查询: {original_query}
子查询:
"""
decompose_prompt = PromptTemplate(
input_variables=["original_query"],
template=decompose_template
)
# 3. 构建分解链
decompose_chain = decompose_prompt | llm
# 4. 执行分解
original_query = "为什么说可再生能源是应对气候变化和促进经济可持续发展的关键?"
response = decompose_chain.invoke({"original_query": original_query})
sub_queries = response.content.strip().split('\n')
print(f"原始查询: {original_query}\n")
print("分解后的子查询:")
for q in sub_queries:
print(f"- {q}")
# --- 可能的输出 ---
# 原始查询: 为什么说可再生能源是应对气候变化和促进经济可持续发展的关键?
#
# 分解后的子查询:
# - 可再生能源如何帮助减少温室气体排放以应对气候变化?
# - 发展可再生能源对经济可持续性有哪些积极影响?
# - 目前主流的可再生能源技术有哪些,它们各自的优势是什么?
# - 推广可再生能源面临哪些挑战?
结语:开启你的查询转换之旅
查询转换并非银弹,但它无疑是RAG工具箱中一件强大的瑞士军刀。通过重写、回溯和分解,我们可以显著提升检索的准确性和全面性,从而让最终生成的答案质量实现质的飞跃。
实现这些技术的关键在于精心设计的提示(Prompt),而这正是LLM时代最富创造力的工作之一。本文提供的代码只是一个起点,你可以根据自己的业务场景,设计出更具针对性的转换策略。
那么,下一个问题是:你将创造出怎样的查询转换魔法,来让你的AI应用变得更智能呢?
最后
为什么要学AI大模型
当下,⼈⼯智能市场迎来了爆发期,并逐渐进⼊以⼈⼯通⽤智能(AGI)为主导的新时代。企业纷纷官宣“ AI+ ”战略,为新兴技术⼈才创造丰富的就业机会,⼈才缺⼝将达 400 万!
DeepSeek问世以来,生成式AI和大模型技术爆发式增长,让很多岗位重新成了炙手可热的新星,岗位薪资远超很多后端岗位,在程序员中稳居前列。

与此同时AI与各行各业深度融合,飞速发展,成为炙手可热的新风口,企业非常需要了解AI、懂AI、会用AI的员工,纷纷开出高薪招聘AI大模型相关岗位。

最近很多程序员朋友都已经学习或者准备学习 AI 大模型,后台也经常会有小伙伴咨询学习路线和学习资料,我特别拜托北京清华大学学士和美国加州理工学院博士学位的鲁为民老师给大家这里给大家准备了一份涵盖了AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频 全系列的学习资料,这些学习资料不仅深入浅出,而且非常实用,让大家系统而高效地掌握AI大模型的各个知识点。
这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】
AI大模型系统学习路线
在面对AI大模型开发领域的复杂与深入,精准学习显得尤为重要。一份系统的技术路线图,不仅能够帮助开发者清晰地了解从入门到精通所需掌握的知识点,还能提供一条高效、有序的学习路径。

但知道是一回事,做又是另一回事,初学者最常遇到的问题主要是理论知识缺乏、资源和工具的限制、模型理解和调试的复杂性,在这基础上,找到高质量的学习资源,不浪费时间、不走弯路,又是重中之重。
AI大模型入门到实战的视频教程+项目包
看视频学习是一种高效、直观、灵活且富有吸引力的学习方式,可以更直观地展示过程,能有效提升学习兴趣和理解力,是现在获取知识的重要途径

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

海量AI大模型必读的经典书籍(PDF)
阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。

600+AI大模型报告(实时更新)
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

AI大模型面试真题+答案解析
我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下


这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】
994

被折叠的 条评论
为什么被折叠?



