【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(Advanced RAG[1])基于历史对话重新生成Query?

发布于:2025-07-13 ⋅ 阅读:(22) ⋅ 点赞:(0)

【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)

网站公告

今日签到

点亮在社区的每一天
去签到