【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(Advanced RAG[1])基于历史对话重新生成Query?
【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(Advanced RAG[1])基于历史对话重新生成Query?
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://fighting.blog.csdn.net/article/details/148185942
🧠 一、背景:对话中的上下文依赖问题
在 Chat-like 应用中,用户可能输入的是省略性、指代性问题,如:
- 用户 A:哪位演员演了那个经典的 AI 电影?
- 用户 B:他还演过《她》吗?
若你只将 “他还演过《她》吗?
” 发给检索模块,系统根本不知道谁是“他”,无法召回正确文档。
✅ 二、解决方案:Query Rewriting(问题重写)
- Query Rewriting 是指在当前问题基础上,结合历史对话上下文,由大模型生成完整、语义清晰的问题,供向量检索使用。
🧩 举例说明
用户原始输入:
[历史] 用户:哪位演员演了那个经典的 AI 电影?
[历史] 系统:威尔·史密斯演了《我,机器人》
[当前] 用户:他还演过《她》吗?
→ Query Rewriting 后的内容变为:
“威尔·史密斯是否也演过电影《她》?”
⚙️ 三、系统架构图
用户历史对话上下文 + 当前Query
↓
[LLM 生成 Rewritten Query]
↓
[使用重写后的 Query 进行检索]
↓
回答用户原始问题
🧪 四、LangChain 实战代码(Query Rewriting with LLM)
我们演示一个完整的历史对话重写流程。
1️⃣ 安装依赖
pip install langchain openai
2️⃣ 构建 PromptTemplate 用于 Query Rewriting
from langchain.prompts import PromptTemplate
rewrite_prompt = PromptTemplate.from_template(
"""
你是一个智能对话助手,请根据上下文重写用户当前的问题,使其更完整、更清晰。
对话历史:
{chat_history}
当前用户问题:
{question}
重写后的检索问题:
"""
)
3️⃣ 构建 LLMChain
from langchain.llms import OpenAI
from langchain.chains import LLMChain
llm = OpenAI(temperature=0)
rewrite_chain = LLMChain(llm=llm, prompt=rewrite_prompt)
4️⃣ 模拟历史上下文 + 当前问题
chat_history = """
用户:哪位演员演了那个经典的 AI 电影?
系统:威尔·史密斯演了《我,机器人》
"""
current_question = "他还演过《她》吗?"
rewritten_query = rewrite_chain.run({
"chat_history": chat_history,
"question": current_question
})
print("🔁 重写后的 Query:", rewritten_query)
🧾 五、输出结果示例
🔁 重写后的 Query:威尔·史密斯是否也出演了电影《她》?
- ✅ 此时再用
rewritten_query
进行向量检索,系统就能准确命中相关内容。
🧠 六、实际应用场景
| 应用 | 作用 |
| ------------------ | ---------------------- |
| 对话型搜索(Chat Search) | 缓解省略/指代问题 |
| 多轮 RAG 问答 | 每轮都通过重写明确检索指令 |
| LLM Agent 多步任务 | 每步前可 Rephrase 为更鲁棒检索命令 |
📈 七、大模型发展趋势下的意义
趋势 | Query Rewriting 的作用 |
---|---|
长对话上下文压缩 | 替代传递全对话,更简洁准确 |
LLM 多 Agent 推理 | 各模块之间转译任务(QA ↔ 搜索) |
跨模态检索 | 图像生成问题重构为文本问题(prompt→caption→search) |
长上下文窗口成本高 | Query Rewriting 是低成本替代方案之一 |
✅ 八、与其他模块的组合价值
组合 | 优势 |
---|---|
✅ Query Rewriting + MultiQueryRetriever | 拓展后的完整 Query 多路径召回 |
✅ Query Rewriting + Reranker | 提高精准匹配内容的排序质量 |
✅ Query Rewriting + Self-Querying Retriever | 可自动生成过滤条件 Query(如日期、作者) |
🧭 九、可扩展方向
- ✅ 加入 LangGraph,构建带 memory 的 Rewriting Agent
- ✅ 多轮对话维护:整合
ConversationBufferMemory
提供更丰富历史 - ✅ Query Rewriting 模型微调(如用 LLaMA2 / Mistral)