Memory-of-Thought Prompting
Memory-of-Thought Prompting(Li & Qiu, 2023b)的要点是:把模型在“无标注训练样本”上生成的 CoT 推理过程,当作一种可检索的“记忆库”;测试时针对当前题目,**检索相似样本的(问题+模型生成的推理链)**来组成 few-shot CoT prompt,从而提升推理表现。
1) 方法分两阶段
A. 测试前(离线):为无标注样本生成“Thought Memory”
给定一批无标注训练样本 (U={x_i})(只有题目/输入,没有答案/解释):
- 对每个 (x_i) 用 CoT 提示让 LLM 生成推理链(以及可选的最终答案)。
- 把结果存成“记忆条目”(memory item):
- 输入/问题:(x_i)
- 模型推理:(r_i)(chain-of-thought)
- (可选)模型答案:(y_i)
- (可选)embedding/索引信息,便于后续检索
直觉:即使没有人工标注答案,模型生成的推理链仍然携带了任务结构、解题套路、常用中间步骤等,可作为“范例”。
B. 测试时(在线):检索相似记忆,动态构造 few-shot CoT prompt
对测试样本 (x):
- 在记忆库中检索与 (x) 最相似的若干条(top-k),得到 ({(x_j, r_j, y_j)})。
- 相似度可用:文本向量 embedding cosine、BM25、或任务特定特征。
- 将这些检索到的条目作为 few-shot exemplars,拼成 prompt,例如:
- Example: 问题 (x_j)
- Reasoning: (r_j)
- Answer: (y_j)(如果保存了)
- 把当前测试问题 (x) 接在后面,让模型在这些“记忆示例”引导下生成自己的 CoT 与答案。
2) 它与“检索增强(RAG)”/“few-shot检索”的区别
- 传统 RAG 常检索的是外部知识文档(事实文本)。
- Memory-of-Thought 检索的是推理过程本身(thoughts/rationales):更像“解题套路库/推理模板库”。
- 传统 few-shot retrieval 多检索(问题→相似问题)然后把(问题, 正确答案)塞进 prompt;但这里很多是无标注数据,因此用“模型生成的 CoT”来充当可用示例。
3) 为什么可能有效(直觉)
- 对算术、常识、事实推理等任务,许多题目共享相似的推理结构(比如“先找关系→再做一步转换→再比较/求和”)。
- 检索到的 CoT 等于给模型提供了“近邻题的解题脚手架”,比随机 few-shot 更对症。
- 利用无标注数据扩充示例来源,成本低(主要成本是离线生成 CoT)。
4) 实现时的关键设计点
- 记忆库规模:无标注样本越多,覆盖越好,但离线生成与索引成本更高。
- 检索信号:用 embedding(更泛化)还是 BM25(更精确匹配关键词),或混合检索。
- 是否保存 Answer:无标注时答案是模型猜的,可能错;有的实现只放“推理过程”,避免把错误最终答案当成强监督信号。
- 去噪/筛选:可用自一致性、置信度、规则校验(算术可验算)过滤明显错误的记忆条目。
- 提示格式:要明确区分“示例”和“当前题”,并保持 reasoning/answer 的结构一致。
5) 适用场景与效果(按你给的描述)
该技术在 Arithmetic、commonsense、factual reasoning 等基准上报告了显著提升。一般最受益的是:题目可被相似结构复用且检索能找到“近邻题”的任务。
如果你希望我把它写成一段可直接实现的伪代码(离线构建 memory + 在线检索组 prompt + 推理),告诉我你偏好用 embedding 检索还是 BM25,以及你的任务输出是多选还是数值/短答案。