标准回答
什么是 Re-Reading(RE2)
Re-Reading(论文里叫 RE2,Re-Reading improves reasoning in LLMs)是一种简单到「白嫖」的提示技巧。核心动作只有一个:在提示词里把问题重复一遍,并附上一句「请再读一遍这个问题」。
它的直觉是:大模型是单向(从左到右)解码的,读到后半段时对前半段问题的「印象」已经变弱。把问题再写一遍,相当于让模型在开始推理前二次审题,重新建立对题目条件的注意力。对算术、逻辑、多条件约束这类复杂推理题,这个小改动常能带来准确率提升,而代价只是多了一点输入 token,几乎零成本。
典型 prompt 形态
{question}
Read the question again: {question}也就是先放原问题,再用一句引导语把同一个问题重复一次,然后让模型作答。注意它增强的是模型对问题的理解,而不是给出额外知识。
用 Spring AI 的 Advisor 实现
Spring AI 的 Advisor 机制可以在请求真正发给模型之前拦截并改写它,非常适合实现 Re-Reading:
- 自定义一个实现
CallAdvisor(及流式的StreamAdvisor)的类,比如ReReadingAdvisor。 - 在 advise 方法里取出用户的原始输入文本,按 RE2 模板拼成「原问题 + Read the question again: 原问题」,替换回请求中再放行给下游。
- 把它注册到 ChatClient 的 advisor 链上(
.advisors(new ReReadingAdvisor())),之后所有走这条链的请求都会自动应用 Re-Reading,业务代码无感知。
这样做的好处是可插拔、可复用:开关一加即可对推理类接口统一启用,不必在每处 prompt 里手动重复问题。
适用与局限
适用:数学、逻辑、多约束推理等需要严谨审题的任务。局限:对简单事实问答、闲聊几乎没收益,反而徒增 token;问题特别长时重复会明显抬高输入成本和上下文占用。所以应按任务类型选择性启用,而不是全局默认开。
常见误区
⚠️ 常见踩坑
别把 Re-Reading 当成万能增益全局开启——它只对复杂推理类任务有效,对简单问答和闲聊几乎无收益,还会因重复问题白白增加输入 token。对很长的 prompt,重复一遍会显著抬高成本和上下文压力,甚至挤占有效信息。它也不会给模型补充任何新知识,只是改善审题,不能替代检索增强或思维链。
追问
追问 1:Re-Reading 和思维链(CoT)是一回事吗?能不能一起用?
不是一回事,但可以叠加。CoT 是引导模型「分步把推理过程写出来」,作用在「怎么想」;Re-Reading 是让模型「把题目再读一遍」,作用在「读懂题」。一个改善推理过程、一个改善问题理解,互补。实践中常把 RE2 放在前面(重复问题)、再接 CoT 提示(Let's think step by step),两者结合在复杂推理上往往比单用任一个更稳。
追问 2:为什么把问题重复一遍就能提升推理,背后机制是什么?
直觉解释是:Transformer 解码是单向的,模型生成答案时对靠前的问题条件注意力会衰减;把问题再放一次,等于在更靠近生成位置处「刷新」了关键条件,让自注意力能更充分地覆盖题目要求,类似人做难题时回头再读一遍题干。它增强的是对输入的编码与注意力分布,而非引入新信息,所以对条件多、易漏读的题收益明显。
追问 3:为什么用 Advisor 实现而不是直接在每个 prompt 里手写重复?
用 Advisor 是为了关注点分离和可维护性。手写重复会让 RE2 逻辑散落在每处调用里,难以统一开关、难以复用。封装成 ReReadingAdvisor 后,它作为一个横切组件挂在 ChatClient 的 advisor 链上,统一拦截并改写请求,业务代码完全无感;要灰度、A/B 或下线只需增删这一个 advisor,还能和日志、检索增强等其他 advisor 组合编排,工程上更干净。
🔗 相似问题
同一考点的不同问法,面试官可能换着问,一起刷更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习