上一篇文章里,我聊过 Agent 记忆的五层模型。那篇文章更多是框架视角:我们需要区分短期记忆、长期记忆、情景记忆、语义记忆、技能记忆等等。
但是,当真正开始在工程里落地的时候,很多人会遇到一个更具体的问题:

Agent 每天都在接收大量输入,但不可能把所有内容都存下来。那,究竟应该“记什么”?

这个问题听起来简单,背后却很关键。因为一旦写入策略没设计好,要么记忆库很快“垃圾堆积”,要么遗漏了用户真正关心的事实。今天就来聊聊 记忆写入策略


TL;DR

多轮对话 Agent 不可能“什么都记”,关键是设计写入策略。
本文总结了三种常用方法,并给出 LangGraph + 向量库的代码示例:

  • LLM 打分(重要性):让大模型自己评估一条信息对未来是否重要,重要才写入。
  • 相似度检测(新颖性):用 embedding 检查新信息是否与已有记忆相似,避免重复存储。
  • 计数与蒸馏(高频性):对重复出现的信息进行计数,达到阈值后用 LLM 总结为一条稳定事实。

这三种策略往往要混合使用,才能既不遗漏关键信息,也避免记忆库膨胀。


策略一:LLM 打分(重要性)

第一种策略很直接:让模型自己判断
做法是:在对话后,把新信息丢给一个 LLM,让它用自然语言理解的能力打一个 “重要性分数”。比如:

1
2
请根据以下事件对未来是否重要打分(1-10):
“用户告诉你她最喜欢喝黑咖啡。”

测试设定一个合适的阈值,分数高于这个阈值 → 写入长期记忆,分数低于这个阈值 → 丢掉或只保留在短期上下文。
这种方法在 Generative Agents 论文里就被用过。研究发现,模型给出的打分,和人类直觉其实挺接近的。

优点:

  • 能理解上下文的语义,不只是关键词匹配。
  • 灵活,可以针对不同任务改写 prompt。

缺点:

  • 每次都要额外调用 LLM,成本较高。
  • 打分可能不稳定(受 prompt 影响)。

但即便如此,作为第一道“筛子”,它仍然很实用。


策略二:相似度检测(新颖性)

第二种方法是避免重复
我们可以把每条候选记忆编码成向量,存入一个向量数据库(比如 FAISS、Chroma、Weaviate)。
当新内容出现时,先检索一下:如果相似度很高,说明这东西之前就存过。→ 不新建,只更新一下计数或时间戳。如果相似度很低,说明这是全新的信息。→ 写入为新记忆。
例如:第一次用户说“我喜欢咖啡” → 存下来。后来又说“我很爱喝黑咖啡” → 与已有记忆相似度很高 → 不新建,而是给原记忆增加一个“+1 出现次数”。

优点:

  • 避免记忆冗余。
  • 让记忆库保持精炼。

缺点:

  • 阈值难调。过高会漏掉细微差别,过低又容易写入重复。

策略三:计数与蒸馏(高频性)

第三种思路是重复即重要
人类也是这样:别人随口说一次的话我们可能忘记,但如果一再强调,我们会牢牢记住。
在 Agent 中,可以通过“计数器”实现:每次遇到类似的事实,就给计数 +1。当 count ≥ 阈值(比如 3),触发一次总结:用 LLM 把这几次重复的信息,合并成一条稳定的长期记忆。

比如: “我喜欢咖啡” 出现了 3 次 → 总结为一条稳定记忆:“用户偏好:咖啡”。

这样做的好处是:

  • 记忆越来越浓缩,避免无限膨胀。
  • 高频事实得到强化,和人类习惯接近。

实战示例:LangGraph + 向量库

下面是我写的一个简化的 demo,展示如何把三种策略放到一个 写入节点 里。这里我用 LangGraph 来组织流程,用 FAISS 来做相似度搜索。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from langgraph.graph import StateGraph
from langchain_openai import ChatOpenAI
from langchain.vectorstores import FAISS

# 初始化 LLM 和向量库
llm = ChatOpenAI(model="gpt-4o-mini")
vectorstore = FAISS.load_local("memory_index")

def memory_writer(state):
text = state["observation"]

# 1. 重要性打分
score = llm.predict(f"请对以下内容打分(1-10)重要性:{text}")
if int(score) < 6:
return state # 分数太低,不写入

# 2. 相似度检测
docs = vectorstore.similarity_search(text, k=1)
if docs and docs[0].score > 0.9:
# 已存在 → 更新计数
docs[0].metadata["count"] += 1
if docs[0].metadata["count"] >= 3:
summary = llm.predict(f"总结以下信息为一条稳定事实:{docs[0].page_content}")
vectorstore.update(docs[0].id, summary)
return state

# 3. 新建记忆
vectorstore.add_texts([text], metadatas=[{"count": 1}])
return state

# 在 LangGraph 中注册节点
graph = StateGraph()
graph.add_node("memory_writer", memory_writer)

这只是最简版骨架,真正的系统里可以扩展:

  • importance_score 和 similarity_score 可以做加权平均。
  • 高频性总结可以用更复杂的聚类 + LLM 总结。
  • 遗忘机制(衰减 / FIFO 替换)也可以接上。

总结

大语言模型的上下文长度是有限的。就算用上 100k、甚至百万级上下文,你也不会想把所有历史对话原样塞进去。
写入策略决定了 Agent 的“人格”——它记什么,忘什么,直接影响了用户体验。
写入必须有一个“门槛”,类似人脑的选择性记忆。我们往往只会保留:

  • 重要的:影响未来决策的事情 → 避免噪音。
  • 新鲜的以前没出现过的事实 → 避免冗余
  • 高频的:多次重复强调的偏好 → 提炼知识

工程上,三种策略往往是混合使用。
我的建议是:

  • 从最简单的相似度检测开始,先解决重复存储问题。
  • 再加上 LLM 打分和高频总结,让记忆越来越“聪明”。

下一篇,我会聊 记忆的检索与遗忘 ——如何从一大堆记忆里找回最相关的那几条,以及如何避免记忆库无限膨胀。


延伸阅读