当模型需要回答一个跨越几十轮对话的多步问题时,往往在前几轮记住的信息到后面就模糊了;当推理链需要引用十多个前提条件时,中间结论也容易在传递过程中被覆盖。这类问题的根源不在于模型的推理能力不足,而在于推理过程中缺乏可靠的记忆支撑。基于记忆的推理正是针对这一痛点提出的思路:让模型在推理时能够显式地存取信息,而不是把一切都压缩在一个固定长度的上下文窗口里。

记忆推理的核心原理与记忆类型划分
记忆推理的本质,是把推理过程拆分为「计算」和「存储」两个可以解耦的部分。传统的前馈式模型每生成一个 token 都要重新处理全部上下文,信息只能依赖注意力机制隐式地保留;而引入记忆机制后,模型可以把关键事实、中间推理结论写入外部存储,在需要时再检索回来参与计算。这样一来,即使推理链很长,关键信息也不会因为距离当前生成位置太远而失效。
从时间维度上看,记忆通常分为短期记忆和长期记忆两类。短期记忆对应模型当前工作上下文中的信息,比如当前对话的最近几轮、当前问题的已知条件,它的特点是容量有限但读写延迟极低。长期记忆则位于模型参数之外,通常以向量数据库、键值缓存或者结构化知识库的形式存在,容量几乎不受限制,但访问需要经过检索这一步。两类记忆的配合方式,直接决定了记忆推理系统的上限。
还有一类介于两者之间的记忆形式值得单独说明,即「情景记忆」。它记录的不是通用知识,而是模型在当前任务或历史会话中的具体经历,例如某次推理中得到的中间结论、用户曾经纠正过的错误偏好。情景记忆的价值在于让推理具备连续性,这对多轮任务规划、智能体长期运行等场景尤其重要。一个典型的划分可以总结为下表:
| 记忆类型 | 存储位置 | 容量 | 典型用途 |
|---|---|---|---|
| 短期记忆 | 上下文窗口 | 受窗口大小限制 | 当前问题条件、最近对话 |
| 长期记忆 | 外部向量库或知识库 | 近乎无限 | 领域知识、历史事实 |
| 情景记忆 | 会话级缓存 | 中等 | 中间结论、任务状态、用户偏好 |
记忆的写入、检索与更新策略
记忆系统的设计难点不在于「存」,而在于决定「什么时候存、存什么、怎么取、何时淘汰」。写入策略方面,常见做法有三种:全量写入(把每一步推理输出都记录下来)、选择性写入(用一个小模型或规则判断当前信息是否值得保存)以及摘要写入(定期把一段过程压缩成摘要后存储)。全量写入实现简单但会快速膨胀存储;摘要写入节省空间但可能丢失细节,实践中往往需要组合使用。
检索策略是记忆推理的性能瓶颈所在。目前主流方案是基于向量相似度检索:把记忆条目编码为向量,推理时用当前查询向量去检索最相关的若干条记忆,拼接到提示词中供模型参考。除了纯向量检索,还可以叠加 BM25 等关键词检索形成混合检索,或者利用图结构记录记忆之间的依赖关系,让检索可以沿关系链扩展。下面是一段简化 Python 代码,演示记忆写入与检索的基本流程:
import numpy as np
class MemoryStore:
def __init__(self, dim=768):
self.dim = dim
self.items = [] # 存储原始记忆文本
self.vectors = [] # 存储对应的向量表示
def write(self, text, embed_fn):
# 将记忆文本编码为向量后写入存储
self.items.append(text)
self.vectors.append(embed_fn(text))
def retrieve(self, query, embed_fn, top_k=3):
# 通过余弦相似度检索最相关的记忆
q = embed_fn(query)
mat = np.array(self.vectors)
scores = mat @ q / (np.linalg.norm(mat, axis=1) * np.linalg.norm(q) + 1e-8)
idx = np.argsort(scores)[::-1][:top_k]
return [self.items[i] for i in idx]
# 使用示例
memory = MemoryStore()
memory.write("用户的预算上限是5000元", embed_fn)
memory.write("用户偏好轻便型设备", embed_fn)
print(memory.retrieve("推荐一台合适的笔记本", embed_fn))
更新与遗忘同样关键。如果记忆只增不减,检索质量会随着噪声条目增多而持续下降。常用的做法包括:基于时间衰减的打分(越久未被访问的记忆权重越低)、基于访问频率的淘汰(长期不被检索命中的记忆优先移除)以及冲突检测(新记忆与旧记忆矛盾时,以时间戳更新的为准并标记冲突供上层判断)。一个健壮的记忆系统,往往同时运行多套淘汰策略并允许配置化调整。
如何把记忆模块嵌入推理流程
在工程实践中,把记忆嵌入推理流程最直接的方式是「检索增强生成」范式:推理前先检索相关记忆,拼接进提示词,再让模型基于这些材料作答。这种方式实现成本低,适合快速落地。更进阶的做法是让模型在推理过程中主动调用记忆工具,即在思维链的每一步,模型可以自行决定是继续推理、写入记忆还是检索记忆,这种交错式的执行模式通常被称为 ReAct 风格,能够处理更复杂的多跳问题。
举一个具体场景:智能客服处理用户退款问题时,短期记忆保存当前对话的上下文,长期记忆检索该用户的历史订单与售后政策条文,情景记忆记录此前已经确认过的事实(比如用户已提供订单号、已经核实过物流状态)。每一步推理都建立在这些记忆之上,模型就不会反复向用户索要已经提供过的信息,也能保证推理结论和政策条文一致。
需要强调的是,拼接进提示词的记忆数量需要严格控制。经验上,注入 3 到 8 条高相关记忆通常效果最好,注入过多不仅浪费 token,还会引入干扰信息,反而降低推理准确率。同时建议在提示词中明确标注记忆的来源和时效(例如「以下是三天前的对话记录」),让模型能自行判断记忆的可信度。
记忆推理的挑战与应对思路
记忆推理并非银弹,落地时会遇到几个典型问题。第一个是知识冲突:当检索到的记忆与模型参数中的知识、或者与多条记忆之间相互矛盾时,模型可能给出不可预测的输出。应对方式是在检索阶段做冲突检测与去重,并在提示词中给出明确的优先级规则,例如外部权威记忆优先于模型内部记忆。
第二个挑战是检索噪声。如果记忆库中混入了大量低质量条目,检索结果会污染推理链。除了前面提到的淘汰策略,还可以引入重排序模型对初筛结果做二次排序,或者在写入阶段就做质量过滤,把「是否值得记忆」这一判断前置,从源头减少噪声。此外,记忆的权限与隐私问题也不容忽视,多用户系统必须做到记忆按用户隔离,避免 A 用户的信息被检索进 B 用户的推理过程。
总体来看,记忆推理是从「更大上下文窗口」之外的另一条提升路径,它用可扩展的外部存储换取推理的深度和连续性。对于需要长期运行、跨会话协作或者多步规划的应用来说,设计良好的记忆系统带来的收益,往往远超单纯堆叠模型参数。掌握写入、检索、更新三个环节的设计权衡,就掌握了记忆推理落地的核心。