记忆衰减与垃圾回收
定期遗忘过时且相关性低的记忆,让索引始终聚焦于重要内容。
记忆衰减与垃圾回收 是 CoddyKit 上的免费 AI Agents 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Agents 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Agents 课程共包含 4 节课。
记忆无限增长
如果不主动维护,您的记忆存储会不断增长。过时且不相关的记忆会污染检索结果并浪费存储空间。
记忆和其他资源一样,也需要进行垃圾回收。
为什么删除记忆?
- 隐私——遵守 GDPR/CCPA 删除请求
- 相关性——较旧的事实现在更可能已经不准确
- 成本——规模扩大后,向量存储成本会不断累积
- 质量——臃肿的索引会削弱搜索相关性
策略 1:TTL
为每条记忆设置过期时间戳:
ALTER TABLE semantic_facts ADD COLUMN expires_at TIMESTAMPTZ;
-- short-lived
INSERT INTO semantic_facts (..., expires_at) VALUES (..., NOW() + INTERVAL '7 days');
-- garbage collect
DELETE FROM semantic_facts WHERE expires_at < NOW();策略 2:基于时间的衰减
随着时间推移降低置信度——较旧的记忆会被降低优先级:
import math
def decayed_confidence(original, age_days, half_life_days=30):
return original * math.exp(-age_days * math.log(2) / half_life_days)
# Then retrieval filters: WHERE decayed_confidence > 0.3
for age in [0, 30, 60, 90]:
print(f"Age {age} days -> confidence {decayed_confidence(1.0, age):.3f}")
策略 3:基于使用情况的衰减
从未被检索的记忆没有用处——经过一段宽限期后将其删除:
ALTER TABLE semantic_facts ADD COLUMN last_used_at TIMESTAMPTZ DEFAULT NOW();
-- update on retrieval
UPDATE semantic_facts SET last_used_at = NOW() WHERE id = ANY(:retrieved_ids);
-- gc
DELETE FROM semantic_facts WHERE last_used_at < NOW() - INTERVAL '90 days';策略 4:每位用户的容量上限
限制每位用户的记忆数量;达到上限后,移除使用最少的记忆:
MAX_FACTS = 500
SELECT COUNT(*) FROM semantic_facts WHERE user_id = %s;
-- if > MAX_FACTS: delete oldest unused压缩:合并相似记忆
多条记忆可能只是用不同方式表达了同一件事。请定期进行聚类并合并:
def compact(user_id):
facts = all_facts(user_id)
clusters = cluster_by_embedding(facts, threshold=0.85)
for cluster in clusters:
merged = llm.invoke(f'Merge these into one canonical statement: {cluster}')
replace_with_merged(cluster, merged)解决矛盾
如果两条记忆相互矛盾,请将较旧的那条标记为已失效:
def resolve(user_id, new_fact):
similar = retrieve(user_id, new_fact, k=5)
for s in similar:
if llm_says_contradicts(s, new_fact):
mark_obsolete(s.id)
save(new_fact)策略 5:重要性加权
有些记忆比其他记忆更重要。请为每条记忆评分:
importance_prompt = 'Rate the importance of this fact for future interactions (0-1):\n{fact}'
for fact in facts:
score = float(llm.invoke(importance_prompt.format(fact=fact)).content)
update_importance(fact.id, score)
# Retrieval: weight by importance and recencyLetta 风格的摘要
当存储空间用尽时,Letta(MemGPT)会通过总结相关事实块来压缩旧的归档记忆:
if archival_size > LIMIT:
block = oldest_facts(50)
summary = summarise(block)
replace(block, summary)用户触发的删除
为用户提供一个“忘记我”按钮。点击后:
def forget_user(user_id):
conn.execute('DELETE FROM semantic_facts WHERE user_id = %s', (user_id,))
conn.execute('DELETE FROM episodes WHERE user_id = %s', (user_id,))
vector_db.delete(filter={'user_id': user_id})软删除与硬删除
出于审计需要,建议先进行软删除(标记为已删除,但保留加密数据),等保留期限结束后再进行硬删除:
ALTER TABLE semantic_facts ADD COLUMN deleted_at TIMESTAMPTZ;
-- queries always: WHERE deleted_at IS NULL定时执行垃圾回收任务
按照计划运行垃圾回收任务(例如定时任务或每日工作进程)。不要在请求处理过程中执行繁重的垃圾回收——这会增加用户延迟:
# Daily cron at 03:00 UTC
for user_id in all_users():
decay_confidence(user_id)
delete_expired(user_id)
compact_clusters(user_id)为什么会衰减?
为什么记忆的置信度会随时间推移而衰减?
回顾
TTL、衰减、基于使用情况的移除、容量上限、压缩、矛盾解决以及用户触发的删除。记忆需要清理程序,请构建一个。
常见问题解答
「记忆衰减与垃圾回收」课时是免费的吗?
是的 — 「记忆衰减与垃圾回收」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Agents 课程的其余内容,请升级到 CoddyKit PRO。 AI Agents 课程共包含 4 节课。
「记忆衰减与垃圾回收」这节课中我会学到什么?
定期遗忘过时且相关性低的记忆,让索引始终聚焦于重要内容。 你通过在浏览器中直接运行的动手代码来练习 AI Agents,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AI Agents 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AI Agents 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「记忆衰减与垃圾回收」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AI Agents 课中编写并运行代码吗?
能。每节 AI Agents 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 情节记忆(按会话记录)
- 语义记忆(向量化事实)
- 程序记忆(技能库)
- 记忆衰减与垃圾回收