【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(Advanced RAG[1])基于历史对话重新生成Query?
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://fighting.blog.csdn.net/article/details/148185942
在 Chat-like 应用中,用户可能输入的是省略性、指代性问题,如:
若你只将 “他还演过《她》吗?
” 发给检索模块,系统根本不知道谁是“他”,无法召回正确文档。
用户原始输入:
[历史] 用户:哪位演员演了那个经典的 AI 电影?
[历史] 系统:威尔·史密斯演了《我,机器人》
[当前] 用户:他还演过《她》吗?
→ Query Rewriting 后的内容变为:
“威尔·史密斯是否也演过电影《她》?”
用户历史对话上下文 + 当前Query
↓
[LLM 生成 Rewritten Query]
↓
[使用重写后的 Query 进行检索]
↓
回答用户原始问题
我们演示一个完整的历史对话重写流程。
pip install langchain openai
from langchain.prompts import PromptTemplate
rewrite_prompt = PromptTemplate.from_template(
"""
你是一个智能对话助手,请根据上下文重写用户当前的问题,使其更完整、更清晰。
对话历史:
{chat_history}
当前用户问题:
{question}
重写后的检索问题:
"""
)
from langchain.llms import OpenAI
from langchain.chains import LLMChain
llm = OpenAI(temperature=0)
rewrite_chain = LLMChain(llm=llm, prompt=rewrite_prompt)
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(如日期、作者) |
ConversationBufferMemory
提供更丰富历史