0Pricing
AI Agents · 课时

记忆衰减与垃圾回收

定期遗忘过时且相关性低的记忆,让索引始终聚焦于重要内容。

记忆衰减与垃圾回收 是 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 recency

Letta 风格的摘要

当存储空间用尽时,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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 情节记忆(按会话记录)
  2. 语义记忆(向量化事实)
  3. 程序记忆(技能库)
  4. 记忆衰减与垃圾回收
← 返回 AI Agents