文章目录
你的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=[

847

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



