记忆点:补全意图,扩展表达,检索后再融合;改写不能改变用户意图。
💡 答案要点
Query改写 = 优化用户原始问题,使其更适合检索
核心问题:
用户问题往往不够精确:
- "昨天说的那个事" → 缺少上下文
- "怎么办" → 太模糊
- "价格多少" → 缺少主语改写策略:
1. 补充上下文(多轮对话)
python
# 对话历史
history = [
("什么是RAG?", "RAG是检索增强生成..."),
("它有什么优势?", "...")
]
# 用户新问题
user_query = "如何实现它?"
# 改写后
rewritten_query = "如何实现RAG检索增强生成系统?"2. 查询扩展
python
# 原始查询
query = "Python多线程"
# 扩展后
expanded_query = """
Python多线程
Python threading模块
Python GIL全局解释器锁
Python并发编程
"""
# 用扩展后的多个查询检索,合并结果3. HyDE(假设性文档嵌入)
python
# 原始问题
query = "如何优化RAG检索准确率?"
# 让LLM生成假设性答案
hypothetical_doc = llm.generate(f"假设回答: {query}")
# "可以通过混合检索、Rerank、query改写等方法..."
# 用假设性答案的向量去检索(而非原问题)
embedding = embed(hypothetical_doc)
results = vector_db.search(embedding)HyDE优势: 答案和文档库中的文档更相似,检索更准
4. 多查询生成
python
# 原始问题
query = "RAG系统慢怎么办?"
# 生成多个视角的查询
sub_queries = llm.generate(f"将问题拆分成3个子问题: {query}")
# 1. "如何提升RAG检索速度?"
# 2. "RAG系统性能瓶颈在哪?"
# 3. "向量数据库优化方法?"
# 分别检索后合并结果实现示例:
python
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
# Query改写器
def rewrite_query(query, chat_history):
prompt = f"""
对话历史: {chat_history}
当前问题: {query}
请补充上下文,改写成独立完整的问题。
"""
return llm.generate(prompt)
# HyDE改写
def hyde_rewrite(query):
prompt = f"假设你要回答这个问题,你会怎么说: {query}"
hypothetical_answer = llm.generate(prompt)
return hypothetical_answer
# 使用
user_query = "如何优化?"
rewritten = rewrite_query(user_query, history)
results = retriever.get_relevant_documents(rewritten)性能对比:
| 方法 | Recall@5 | Precision@5 |
|---|---|---|
| 原始查询 | 65% | 58% |
| +上下文补充 | 75% | 68% |
| +HyDE | 82% | 76% |
| +多查询 | 88% | 80% |
面试话术:
示例表达(仅在能用本人经历或可复现实验佐证时使用): "Query改写是RAG的前置优化。用户问题往往模糊或缺上下文,我们用LLM补充完整,或用HyDE生成假设答案去检索。我们项目用HyDE,召回率从67%提升到85%。"
