当前位置: 首页 > news >正文

Amadeus的知识库 | RAG 场景下大模型有记忆了检索系统却犯了难?—— 重中之重是搞清问题重写策略!

一、引文

上一篇文章中我们讲解了实现大模型多轮会话记忆的几种策略,让大家的大模型有了记忆。但是在 RAG 场景下这么做是完全不够的。举个例子,第一轮对话中你问大模型命运石之门中的牧濑红莉栖是什么身份?那 RAG 就会拿着用户这个问题块向量化后去向量数据库里面找文档块向量。第二轮你觉得大模型已经知道你在聊谁了,然后你就省略了具体主语,问“那她的年龄是多少岁?”,你想的确实没错,我们已经实现了多轮会话记忆功能,先前的对话已经一并存入了 messages 数组中,但是这一轮对话依旧只拿着你第二轮的问题“那她的年龄是多少岁”进行向量化然后去向量数据库检索,在这个阶段检索系统压根不知道你说的“她”到底是谁,因为向量数据库里面存的文档,主语大概是牧濑红莉栖而不是她,自然也召回不到相关的文档块,大模型也就无法回答你的问题,依旧失忆。想要解决这个问题,我们必须要用到问题重写,接下来我将会介绍几种常见的需要使用到问题重写的场景以及其对应的具体策略。

二、问题重写策略

1.指代消解

所谓的指代消解其实就是我们引文中提到的案例,虽然大模型的记忆中有她的含义,但是检索阶段向量数据库却不知道她的含义,想要解决这个问题就要再一次调用大模型对用户问题进行重写来对齐两个阶段的信息差。具体操作逻辑就是把之前存下来的多轮会话记忆还有用户问题传给问题改写模型,让它根据之前的记忆来把检索系统不明所以的指示代词替换成有具体含义的名词。这种情况下,改写模型需要根据最近的上下文做判断——通常取最近一次被提到的实体。

2.省略上下文

省略上下文场景其实跟指代消解这个场景有点像,两个场景通常是成对出现的。所谓的省略上下文其实就是用户这轮对话的问题因为省略了他的上下文背景信息进而导致这句话对于检索系统而言语义不明。解决方案与指代消解也比较类似,也是额外调用重写模型,把历史会话传给它,让它补全上下文。

3.口语化表达

口语化表达就是说用户提问时的语句都偏向日常化、口语化,但是我们的向量数据库中的文档块以及原文档通常来说都是一些专业化的书面语,你想想两种风格截然不同的文字拿去计算向量相似度效果能好吗?

这种改写有一个特点:不依赖对话历史。即使是第一轮对话,口语化的 query 也需要转化成更正式的表达。所以口语化转正式其实在单轮对话的 RAG 中也有价值。

不过要注意,口语化转正式不是“翻译”,而是“意图提取”。“能不能便宜点”的意图不是字面上的“降低价格”,而是“查询有没有优惠”。改写模型需要理解用户的真实意图。

4.多意图混合

多意图混合就是说用户提问的时候它涉及到了多个需求,比如说既要查今天重庆天气,又要查重庆邮电大学的保研政策,这完全是两个不相干的话题杂糅在了一起,而且它们一个要走 Function Calling,另一个又是走 RAG 检索。对于一般的 RAG 流程来说要么路由到Function Calling,要么路由到下一步把用户这轮提问的话全部拿去向量化然后去向量数据库里面检索,你想想这么搞召回效果能好吗?再说了用户查今天重庆天气压根就不用走向量数据库检索,里面也没有记录今天重庆的天气,而是要通过 MCP 调用第三方工具。这么一看对用户的问题进行意图拆分就很有必要了,拆成多个 Query 然后分别路由,这样一来效果就好多了。

5.模糊描述

按照字面意思,这种场景就是说用户的问题提的很模糊,其特征就是经常使用一些相对性比较强亦或是摸棱两可的形容词,这个时候问题重写需要做的就是在基于上下文理解问题背景的前提下,对用户问题进行重写,使之变成对检索系统友好的 Query。常见的方法可以是关键词扩充,就是补充同义词和相关术语,提高检索的召回率。

这种改写主要对关键词检索有帮助——BM25 是按词匹配的,同义词扩展能提高命中率。对向量检索来说,帮助有限,因为向量检索本身就能理解语义相似性(屏幕碎了和屏幕破损的向量已经很接近了)。

如果你的 RAG 系统用的是混合检索(向量 + BM25),关键词扩展在 BM25 那一路上会有明显提升。

6.注意事项

整个问题重写策略其实只需要合理地设计一个改写模型的 Prompt 就可以得到解决,一个优秀的 Prompt 通常会覆盖到前面五种场景,而且还需要指明问题改写的具体时机,比如说第一轮对话?原 Query 已经足够完整了?那是不是就没必要改写。反之如果问题中包含了指示代词,涉及到多轮对话的追问,问题很简短,是不是就要考虑问题重写了,这就需要你合理地设置改写模型的 Prompt 实现这种智能。

值得一提的是,上面五种策略多意图混合场景设计 Prompt 进行意图拆分是比较特殊的,因为涉及到意图拆分,把一个 Query 拆分成多个 query,这个需要改写模型额外输出,通常可以把拆分后的 query 数组指定成 JSON 格式输出,方便你的后端代码进行解析,进行下一步路由。

三、总结

我们在这篇文章中指明了 RAG 场景下仅靠大模型多轮会话记忆不够,因检索阶段无法理解问题中的指代、省略等信息,需通过问题重写解决。随后介绍了指代消解、省略上下文、口语化转正式、多意图混合、模糊描述五种重写策略及各自原理、解决方案,还提到需合理设计改写模型 Prompt,明确改写时机,其中多意图混合需拆分 Query 并指定 JSON 格式输出。

http://www.jsqmd.com/news/603665/

相关文章:

  • 约束优化实战:从罚函数到乘子法的算法演进与代码实现
  • 终极Windows 11优化指南:如何用Win11Debloat一键清理系统臃肿
  • 华硕笔记本终极性能控制指南:G-Helper完整使用教程
  • 项目实战之评论情感分析模型——基于Bert(含任务头)
  • 基于51单片机的扫地小车设计与实现:寻迹避障、智能往返清扫功能详解
  • 涨薪技术|Prometheus中配置Alertmanager
  • openpilot技术实战指南:从问题诊断到解决方案的系统方法论
  • Spring Boot 性能优化最佳实践:构建高性能应用
  • Zabbix监控Docker化部署避坑指南:从镜像版本选择到安全加固的完整配置
  • 别再傻傻分不清!Quectel RX500U 5G模组的‘网卡模式’和‘路由模式’到底怎么选?
  • Uni-App水印相机避坑指南:解决canvas绘制白屏、iOS拍照失败和权限获取的那些坑
  • 什么是埋点测试,app埋点测试怎么做?
  • 09-多模型配置指南
  • C++ 移动构造与移动赋值:类成员变量处理方式
  • DFS:带重复项的全排列,程序运行全流程解析
  • 【研报287】小马智行深度报告:Robotaxi赛道的竞争格局
  • 212_视觉处理的基石:深入浅出卷积层(Convolutional Layer)
  • IBM V3700控制器更换实战:从503错误到系统恢复的全过程解析
  • 原木全屋定制工厂:优质厂商选择标准深度解析
  • 从LevelDB到自研PoolEngine:金融C++内存池测试演进史(2003–2024,12次重大架构迭代中的3次致命教训)
  • Venera开源漫画管理工具:从环境搭建到高级功能应用全指南
  • 关于对RNN,LSTM,BiLSTM算法的初步认识
  • XUnity.AutoTranslator:高性能Unity游戏实时翻译架构解析
  • 原型与原型链、原型属性学习笔记
  • STM32定时器级联功能实战:如何构建64位定时器
  • python boto3
  • Win11Debloat:轻松打造极速、纯净Windows 11的终极指南
  • 4大维度掌握AI音乐源分离:Demucs的技术突破与实践指南
  • 告别理论推导!用《有源滤波器的快速实用设计》手把手搞定1kHz带通滤波器(附Multisim仿真)
  • Kubernetes网络入门003篇【20260407】