> 核心价值:不是"忘记",而是"记住最重要的"。通过智能遗忘机制,让AI在有限的上下文窗口中,始终保留最相关的记忆。
# 方法1:直接复制到技能目录
cp -r wise-forgetting ~/.workbuddy/skills/
# 方法2:使用skills命令(如果已安装)
skills add wise-forgetting
将以下内容添加到 ~/.workbuddy/SOUL.md:
## 记忆管理(Wise-Forgetting)
**遗忘策略**:
- 当工作记忆超过 2000 tokens 时,自动触发遗忘
- 保留:最近10条消息 + 相关性评分 > 0.5 的记忆
- 遗忘:评分最低的20%记忆
- 永久记忆(MEMORY.md):不经过遗忘,但需要手动整理
**相关性评分权重**(可调整):
- recency(时效性):0.3 - 近期记忆更重要
- frequency(频率):0.2 - 经常访问的记忆更重要
- semantic(语义):0.5 - 与当前任务相关的记忆更重要
**调整指南**:
- 如果AI"忘记"重要信息 → 增加 `frequency` 权重
- 如果AI回答"过时" → 增加 `recency` 权重
- 如果AI回答"不相关" → 增加 `semantic` 权重
# 运行演示脚本
python ~/.workbuddy/skills/wise-forgetting/scripts/wise_forget.py
# 预期输出:
# ==========
# 记忆库状态
# ==========
# 总记忆数:4
# 记忆预算:1000 tokens
#
# 记忆列表(按相关性评分排序):
# 1. [0.721] 用户喜欢简洁回答
# 2. [0.654] 项目约定:使用Python 3.9
# 3. [0.432] 2026年3月的旧项目记录(已过时)
# 4. [0.321] 调试记录:某个bug的修复过程
场景1:你与AI对话了50轮,突然发现AI开始"胡言乱语"
场景2:AI回答了与之前矛盾的内容
场景3:每次新会话,AI都不记得昨天教它的技能
步骤1:评分 - 计算每个记忆的重要性(0-1分)
↓
步骤2:排序 - 按评分从高到低排列
↓
步骤3:遗忘 - 删除评分最低的20%(或在预算外的记忆)
Relevance_Score = 0.3 * Recency # 时效性:越近越好
+ 0.2 * Frequency # 频率:越常被访问越好
+ 0.5 * Semantic # 语义:与当前任务越相关越好
class WiseForgetting:
"""智能记忆遗忘核心类"""
def __init__(self, budget: int = 2000,
weights: Optional[Dict[str, float]] = None):
"""
初始化遗忘机制
Args:
budget: 记忆预算(token数)
weights: 相关性评分权重
{"recency": 0.3, "frequency": 0.2, "semantic": 0.5}
"""
self.budget = budget
self.weights = weights or {
"recency": 0.3,
"frequency": 0.2,
"semantic": 0.5
}
self.memories: List[MemoryItem] = []
from wise_forget import WiseForgetting
# 1. 创建遗忘机制(预算=2000 tokens)
wf = WiseForgetting(budget=2000, weights={
"recency": 0.3,
"frequency": 0.2,
"semantic": 0.5
})
# 2. 添加记忆
wf.add_memory("用户喜欢简洁回答", metadata={"type": "user_preference"})
wf.add_memory("项目约定:使用Python 3.9", metadata={"type": "project_convention"})
# 3. 更新访问计数(增加frequency评分)
wf.memories[0].update_access() # "用户喜欢简洁回答" 被访问
# 4. 执行遗忘(保留与"Python"相关的记忆)
forgotten = wf.forget(current_context="用户询问Python版本", strategy="budget")
print(f"已遗忘 {len(forgotten)} 条记忆:")
for item in forgotten:
print(f" - {item.content[:50]}...")
# 5. 查看当前记忆库状态
wf.print_status(current_context="用户询问Python版本")
## 记忆管理(Wise-Forgetting)
**每次工具调用后**:
1. 检查工作记忆token数是否超过预算(2000 tokens)
2. 如果超过,执行遗忘:`forgotten = wf.forget(strategy="budget")`
3. 将重要记忆写入MEMORY.md(不经过遗忘)
4. 将临时记忆写入当日日志(如 `2026-05-11.md`)
**调整权重**:
- 如果AI"忘记"重要信息 → 增加 `frequency` 权重
- 如果AI回答"过时" → 增加 `recency` 权重
- 如果AI回答"不相关" → 增加 `semantic` 权重
# 在每次工具调用后,检查记忆预算
if memory_token_count > BUDGET:
memory_bank = wise_forget(memory_bank, budget=BUDGET)
print(f"已遗忘低相关性记忆,当前记忆数:{len(memory_bank)}")
# archive_memory.py - 归档脚本
from datetime import datetime, timedelta
from pathlib import Path
def archive_memory():
"""归档上个月的记忆"""
today = datetime.now()
last_month = today.replace(day=1) - timedelta(days=1)
archive_month = last_month.strftime('%Y-%m')
memory_file = Path.home() / ".workbuddy" / "memory" / "MEMORY.md"
archive_file = Path.home() / ".workbuddy" / "memory" / "archive" / f"{archive_month}.md"
# 读取当前记忆
with open(memory_file, 'r', encoding='utf-8') as f:
content = f.read()
# 拆分:保留重要信息,归档过时信息
# (这里需要你手动标记哪些要归档)
print(f"✅ 已创建归档文件:{archive_file}")
print(f" 请手动编辑 MEMORY.md,删除已归档的内容")
症状:对话进行20轮后,AI开始回答与之前矛盾的内容
原因:虚假记忆累积,旧错误信息干扰新决策
解决方案:
# 配置示例
wf = WiseForgetting(budget=2000, weights={
"recency": 0.3,
"frequency": 0.2,
"semantic": 0.5
})
# 执行遗忘
forgotten = wf.forget(strategy="threshold", threshold=0.3)
症状:经常看到"上下文过长,请开启新会话"
原因:记忆无限制增长,挤占了有效上下文
解决方案:
# 配置示例
wf = WiseForgetting(budget=2000) # 2000 tokens ≈ 50条记忆
# 执行遗忘(在预算内保留最重要的)
forgotten = wf.forget(strategy="budget")
症状:昨天刚教会AI一个新流程,今天它又不会了
原因:记忆遗忘过度,删除了重要信息
解决方案:
# 配置示例:不遗忘技能相关记忆
def should_forget(item: MemoryItem) -> bool:
"""判断是否应该遗忘"""
# 不遗忘技能相关记忆
if item.metadata.get("type") == "skill_usage":
return False
# 不遗忘用户明确说"记住"的记忆
if "记住" in item.content:
return False
# 其余按评分判断
score = calculate_relevance_score(item)
return score < 0.3
# 执行自定义遗忘
forgotten = [item for item in wf.memories if should_forget(item)]
wf.memories = [item for item in wf.memories if not should_forget(item)]
症状:你昨天告诉AI"改用Python 3.9",今天它还在建议Python 3.8
原因:时效性评分权重太低,旧信息没有被及时遗忘
解决方案:
recency 权重(从0.3增加到0.5)frequency 权重(从0.2减少到0.1)# 调整权重:更看重时效性
wf.weights = {
"recency": 0.5, # 增加 ↑
"frequency": 0.1, # 减少 ↓
"semantic": 0.4 # 微调
}
# 重新执行遗忘
forgotten = wf.forget(strategy="budget")
症状:你问"Python怎么安装",AI回答"你上次问的JavaScript问题..."
原因:语义对齐评分权重太低,保留了太多不相关的记忆
解决方案:
semantic 权重(从0.5增加到0.7)current_context参数)# 调整权重:更看重语义相关性
wf.weights = {
"recency": 0.2, # 减少 ↓
"frequency": 0.1, # 减少 ↓
"semantic": 0.7 # 增加 ↑
}
# 执行遗忘(提供更明确的上下文)
current_context = "用户询问Python安装方法"
forgotten = wf.forget(current_context=current_context, strategy="budget")
相关性评分
1.0 ┤ ●
│ ● ●
0.8 ┤ ● ●
│ ● ●
0.6 ┤ ● ●
│ ● ●
0.4 ┤
│
0.2 ┤
│
0.0 └──────────────────────────────────────→ 时间
创建时 现在
● 遗忘前:评分均匀分布
■ 遗忘后:只保留评分>0.5的记忆
上下文使用量(tokens)
30000 ┤ ■ 无遗忘机制
│ ■
20000 ┤ ■
│ ■
10000 ┤ ■
│■
0 └──────────────────────────────────────→ 对话轮次
1 5 10 15 20
□ 有遗忘机制:稳定在2000 tokens
虚假记忆率(%)
7.0 ┤ ●
│ ●
6.0 ┤
│
5.0 ┤
│
4.0 ┤ ○
│ ○
3.0 ┤ ○
│ ○
2.0 ┤ □
│ □
1.0 ┤ □
│
0.0 └──────────────────────────────────────→ 对话轮次
1 5 10 15 20
● 遗忘前:虚假记忆率上升至6.8%
○ 遗忘中:虚假记忆率开始下降
□ 遗忘后:虚假记忆率稳定在2.0%
| 项目 | 数值 |
|---|---|
| ------ | ------ |
| 模型 | DeepSeek V4 |
| 上下文窗口 | ~64K tokens(假设) |
| 推荐记忆预算 | 20K tokens(30%) |
| MEMORY.md推荐大小 | <2K tokens |
# config.py - 推荐配置
WISE_FORGETTING_CONFIG = {
"budget": 20000, # 20K tokens(DeepSeek V4的30%)
"weights": {
"recency": 0.3, # 时效性:近期记忆更重要
"frequency": 0.2, # 频率:经常访问的记忆更重要
"semantic": 0.5 # 语义:与当前任务相关的记忆更重要
},
"strategy": "budget", # 遗忘策略:在预算内保留最重要的
"threshold": 0.3 # 阈值(当strategy="threshold"时使用)
}
# MEMORY.md 管理
MEMORY_MD_CONFIG = {
"max_size": 2000, # 最大2000 tokens
"archive_age": 30, # 归档30天前的记忆
"keep_types": ["user_preference", "project_convention", "key_decision"]
}
原因:遗忘过度,删除了重要记忆
解决:
budget 是否设置过小(推荐:上下文窗口的30%)frequency 权重(让经常访问的记忆更难被遗忘)strategy="threshold" 而不是 strategy="budget"# 更保守的遗忘策略
wf = WiseForgetting(budget=20000, weights={
"recency": 0.2, # 减少时效性权重
"frequency": 0.4, # 增加频率权重
"semantic": 0.4 # 保持语义权重
})
# 使用阈值策略(只遗忘评分<0.3的记忆)
forgotten = wf.forget(strategy="threshold", threshold=0.3)
原因:记忆预算设置过大,或者没有实际执行遗忘
解决:
budget(如从20000减少到10000)strategy="budget" 而不是 strategy="threshold"# 更激进的遗忘策略
wf = WiseForgetting(budget=10000, weights={ # 减少预算
"recency": 0.3,
"frequency": 0.2,
"semantic": 0.5
})
# 使用预算策略(硬性限制)
forgotten = wf.forget(strategy="budget")
原因:语义评分计算不准确
解决:
semantic 权重(从0.5增加到0.7)current_context 参数# 改进语义评分
def calculate_semantic_score(self, item: MemoryItem, context: str) -> float:
"""计算语义对齐评分(改进版)"""
if not context:
return 0.5
# 使用更好的方法(如sentence-bert)
# 这里简化为关键词重叠
content_words = set(item.content.lower().split())
context_words = set(context.lower().split())
overlap = len(content_words & context_words)
total = len(content_words | context_words)
if total == 0:
return 0.5
score = overlap / total
return min(max(score, 0.0), 1.0)
# 提供明确的上下文
current_context = "用户询问Python安装方法,需要详细步骤"
wf.weights["semantic"] = 0.7 # 增加语义权重
forgotten = wf.forget(current_context=current_context, strategy="budget")
| 资料 | 链接 |
|---|---|
| ------ | ------ |
| 论文:Novel Memory Forgetting Techniques for Autonomous AI Agents | arXiv:2604.02280 |
| 类似技能:agent-memory-forgetting | https://skillsmp.com/skills/hiyenwong-ai-collection-collection-skills-agent-memory-forgetting-skill-md |
| OpenClaw记忆系统解析 | https://cloud.tencent.com/developer/article/2642814 |
| WorkBuddy官方文档 | https://www.codebuddy.cn/docs/workbuddy/Overview |
| 版本 | 日期 | 更新内容 |
|---|---|---|
| ------ | ------ | ---------- |
| 2.0 | 2026-05-11 | 完全重构:增加代码实现、快速开始指南、集成示例、常见场景解决方案、可视化图表 |
| 1.0 | 2026-04-09 | 初始版本(只有理论框架) |
完成! 现在这个技能已经:
接下来我创建归档脚本 archive_memory.py!
共 2 个版本