智能体也会犯错?Hermes 纠错、回滚与遗忘机制全指南 ------ 让 AI 的错误像 Git 一样可逆可控
智能体不是完美的------它会学错偏好、记住错误事实、执行错误的 Skill。但 Hermes 提供了一套完整的纠错、回滚与遗忘机制,让每一次错误都可逆、可控。本文将教你如何用 Git 管理 Skill、回滚记忆、修正画像、关闭自改进,并建立定期遗忘的自动化流程。
前言:接受不完美,但要可控
AI 智能体在学习过程中犯错是常态:它可能误解了你的偏好,把"喜欢简洁"记成"喜欢啰嗦";可能根据一次错误反馈修改了 Skill,导致后续行为异常;也可能在长期记忆中存储了过时或错误的信息。
传统做法是"眼不见为净"------重新开始一个对话,或者删除整个配置文件。但这样会丢失大量正确的学习成果,治标不治本。
Hermes 的设计哲学:错误是学习的一部分,但必须可逆、可控。因此,它提供了一套完善的纠错、回滚与遗忘机制,类比于 Git 的版本控制、数据库的事务回滚、以及人类的"选择性遗忘"。
本文将深入讲解:
- 如何用 Git 管理你的 Skill 文件,让每次修改都有记录,随时回退
- 如何直接操作 SQLite 和 FTS5 索引,精准删除或修改某条错误的记忆
- 如何手动修正 Honcho 自动推断的用户画像,纠正错误的偏好
- 如何关闭 Skill 的自改进功能,从"自动学习"切换到"手动确认"模式
- 如何建立定期的"遗忘"机制,自动清理过时的 Skill 和记忆
全文包含 5 张 mermaid 流程图 和大量实操命令,助你掌握 Agent 错误的完整处理流程。
1. Skill 的版本控制:用 Git 管理 ~/.hermes/skills/ 目录
1.1 为什么需要版本控制?
Skill 是 Honcho 智能体的核心行为逻辑。它们可以是:
- 手动编写的 YAML 文件
- 从 Skills Hub 安装的社区技能
- 通过自改进机制自动修改的技能
无论哪种来源,Skill 都会随时间演化。如果没有版本控制,当某个 Skill 因为一次错误的自改进而"变坏"时,你可能无法快速恢复到之前可用的状态。
Git 是天然的解决方案 。将 ~/.hermes/skills/ 目录纳入 Git 版本管理,你可以:
- 记录每次 Skill 修改的历史
- 对比不同版本之间的差异
- 一键回滚到任意历史版本
- 分支实验新 Skill,稳定后再合并
1.2 初始化 Git 仓库
bash
cd ~/.hermes/skills
git init
git add .
git commit -m "Initial skills snapshot"
建议同时创建一个 .gitignore 文件,排除临时文件和备份:
bash
cat > .gitignore << EOF
*.bak
*.tmp
.DS_Store
EOF
1.3 日常操作:提交变更
当 Skill 被自改进机制自动修改后,或者你手动编辑了 Skill 文件,可以定期提交:
bash
git add -A
git commit -m "自改进: weather_skill 触发词增加'气温'"
你也可以设置一个 cron 任务,每天自动提交所有变更(但建议手动 commit 以便写有意义的 message)。
1.4 查看历史与回滚
查看提交历史:
bash
git log --oneline
输出示例:
3a2b1c0 (HEAD) 自改进: weather_skill 触发词增加'气温'
2f9e8d7 从 Hub 安装 summarize skill
1a2b3c4 Initial skills snapshot
对比两个版本之间的差异:
bash
git diff 2f9e8d7 3a2b1c0 -- weather.yaml
回滚到某个历史版本:
bash
# 方法一:检出特定 commit 的某个文件
git checkout 2f9e8d7 -- weather.yaml
# 方法二:整个仓库回滚(谨慎)
git reset --hard 2f9e8d7
回滚后,重启 Hermes 使新 Skill 生效(如果支持热加载,则无需重启)。
1.5 使用 Git 分支进行实验
当你想要尝试一个激进的新 Skill 版本时,可以创建分支:
bash
git checkout -b experiment/new_weather_skill
# 编辑 weather.yaml
git add weather.yaml
git commit -m "实验: 支持多城市天气对比"
如果实验成功,合并回主分支;如果失败,直接丢弃分支:
bash
git checkout main
git branch -D experiment/new_weather_skill
1.6 自动化版本控制流程
实验
是
否
新想法
git checkout -b
编辑测试
效果满意?
合并到 main
丢弃分支
错误发生
Skill 行为异常
git log 查找历史
git diff 对比差异
git checkout 回滚文件
重启/热加载
日常
Skill 文件变更
git add + commit
定期 push 到远程仓库
1.7 远程备份
将 skills 仓库推送到 GitHub/GitLab,既能备份,也方便团队协作:
bash
git remote add origin https://github.com/yourname/hermes-skills.git
git push -u origin main
2. 回滚一条错误的记忆:直接操作 SQLite 与 FTS5 索引
2.1 Hermes 的记忆存储结构
Hermes 的知识层(长期记忆)默认使用 SQLite 数据库 + FTS5 全文搜索扩展。存储位置在 ~/.hermes/data/memory.db。
数据库主要包含两个表:
documents:存储原始文本和元数据fts5_index:FTS5 虚拟表,用于向量检索
当你通过 recall 查询时,Hermes 会从 FTS5 索引中检索最相关的片段。如果某条记忆是错误的(例如 AI 误解了你说的话,存了错误的事实),你需要直接操作数据库来删除它。
2.2 安装 SQLite 命令行工具
bash
# Ubuntu/Debian
sudo apt install sqlite3
# macOS
brew install sqlite3
2.3 查看现有记忆
bash
sqlite3 ~/.hermes/data/memory.db
进入 SQLite 交互界面后:
sql
-- 查看所有文档
SELECT id, content, metadata FROM documents LIMIT 5;
-- 按标签搜索
SELECT id, content FROM documents WHERE metadata LIKE '%标签名%';
2.4 删除错误的记忆
假设你发现有一条记忆内容为"用户喜欢吃辣",但这是错误的。先找到它的 ID:
sql
SELECT id, content FROM documents WHERE content LIKE '%喜欢吃辣%';
假设返回 id = 23。删除该记录:
sql
DELETE FROM documents WHERE id = 23;
关键 :FTS5 索引不会自动同步删除,你需要手动重建索引或删除对应的 FTS5 记录。更安全的方法是使用 Hermes 自带的 forget 工具,但如果你必须手动操作:
sql
-- 找到 FTS5 中对应的 rowid(通常与 documents.id 一致)
DELETE FROM fts5_index WHERE rowid = 23;
或者直接重建整个索引(适合批量删除后):
sql
-- 重建 FTS5 索引
DELETE FROM fts5_index;
INSERT INTO fts5_index(rowid, content) SELECT id, content FROM documents;
2.5 使用批量删除
如果你想删除某个标签下的所有记忆(比如清理过时的调研笔记):
sql
DELETE FROM documents WHERE metadata LIKE '%tag:project_old%';
DELETE FROM fts5_index WHERE rowid IN (SELECT id FROM documents WHERE metadata LIKE '%tag:project_old%');
2.6 安全注意事项
- 操作前备份 :
cp ~/.hermes/data/memory.db ~/.hermes/data/memory.db.backup - 不要直接修改 FTS5 表结构:它是虚拟表,结构由 SQLite 自动管理。
- 尽量使用 Hermes 的 API :如果可能,通过
/forget命令删除,更加安全。
2.7 记忆回滚流程图
是
否
发现错误记忆
备份 memory.db
sqlite3 查询定位
找到记录?
DELETE FROM documents
检查搜索关键词
DELETE FROM fts5_index 对应 rowid
可选: 重建索引
验证删除成功
Hermes 下次检索不再返回该条
3. 纠正 Honcho 的错误推断:手动修正用户画像
3.1 画像如何被错误推断?
Hermes 的画像引擎(第 7 篇)会根据你的对话和反馈自动推断你的偏好。例如:
- 你多次说"请详细一点",画像中的
communication_style会偏向"详尽"。 - 你经常问编程问题,
skill_level会被推断为"高级"。
但推断可能出错。例如,你可能只是临时需要详细解释,平时喜欢简洁;或者你问编程问题只是因为刚开始学习。这时,你需要手动修正画像。
3.2 查看当前画像
画像数据存储在 ~/.hermes/data/profile.json(也可能是 SQLite,视版本而定)。查看内容:
bash
cat ~/.hermes/data/profile.json | jq .
输出示例:
json
{
"user_id": "telegram_123456",
"dimensions": {
"skill_level": 0.8,
"pace": 0.6,
"communication_style": {
"formal": 0.3,
"concise": 0.2,
"detailed": 0.8
},
"goal_orientation": 0.4,
"emotional_tone": {
"valence": 0.7,
"arousal": 0.5
}
},
"last_updated": "2025-04-20T10:30:00Z"
}
3.3 手动修正
直接编辑 JSON 文件:
bash
vim ~/.hermes/data/profile.json
例如,将 detailed 从 0.8 改为 0.3,将 concise 从 0.2 改为 0.7:
json
"communication_style": {
"formal": 0.3,
"concise": 0.7,
"detailed": 0.3
}
保存文件,重启 Hermes(或等待热加载)。
3.4 使用命令行工具修正
如果 Hermes 提供了 CLI,可以更方便:
bash
hermes profile set --dimension communication_style.concise --value 0.7
hermes profile set --dimension communication_style.detailed --value 0.3
3.5 通过对话修正(推荐)
你也可以直接在对话中给出修正指令(如果启用了该功能):
"/update_profile 我喜欢简洁的回答,不要详细解释。"
Hermes 会解析并调整画像。
3.6 重置整个画像
如果画像完全错乱,可以重置到默认状态:
bash
rm ~/.hermes/data/profile.json
# 或者
hermes profile reset
下次对话时,Hermes 会从零开始学习。
3.7 画像修正流程图
手动编辑
CLI
对话
发现画像错误
修正方式
直接修改 profile.json
hermes profile set
/update_profile 指令
保存/生效
验证后续对话响应
4. 关闭自改进:把学习循环从"自动"调成"手动确认"
4.1 自改进的风险
如第 23 篇所述,Honcho 的 Skill 支持自改进------根据用户反馈自动修改自身规则。这对快速迭代非常有用,但也会引入风险:
- 用户一次模糊的反馈可能导致 Skill 被错误修改
- 恶意用户可能通过反馈诱导 Skill 做出危险行为
- 自动修改频率过高,难以追踪
对于关键业务 Skill,你希望关闭自动学习 ,改为手动确认模式。
4.2 全局关闭自改进
在 config.yaml 中:
yaml
skills:
self_improvement:
enabled: false # 全局关闭
4.3 按 Skill 单独配置
更精细的控制:为每个 Skill 单独设置是否允许自改进。
yaml
skills:
- name: critical_payment_skill
self_improvement: false # 不允许自动修改
- name: greeting_skill
self_improvement: true # 允许
4.4 设置"手动确认"模式
还有一种折中:Agent 生成改进建议,但不自动应用,而是通过消息发送给管理员确认。
yaml
skills:
self_improvement:
mode: approval
approval_channel: "slack"
approvers: ["admin@example.com"]
当用户反馈触发改进时,Hermes 会生成一个补丁,发送到 Slack 审批频道。管理员点击"批准"后才会应用。
4.5 查看待审批的改进
bash
hermes improvements list --status pending
4.6 手动应用或拒绝
bash
# 批准
hermes improvements approve <id>
# 拒绝
hermes improvements reject <id> --reason "反馈模糊"
4.7 关闭自改进的决策树
高
中
低
Skill 重要性?
禁用自改进
self_improvement: false
设为手动审批模式
mode: approval
启用自动学习
mode: auto
手动更新 Skill
审批通过后更新
自动更新 + 定期审计
5. 建立"遗忘"机制:定期清理过时 Skill 的 cron 脚本
5.1 为什么要主动遗忘?
智能体随着时间累积,会存储大量 Skill 和记忆。其中很多已经过时:
- 临时调研项目的笔记
- 测试用的 Skill
- 不再使用的触发词规则
保留它们不仅占用存储,还会干扰检索结果(召回不相关的记忆),降低性能。
解决方案:建立一个自动化的"遗忘"机制,定期清理过时数据。
5.2 清理过时 Skill
Skill 文件存储在 ~/.hermes/skills/。你可以根据文件的最后修改时间来判断是否"过时"。
脚本示例 (cleanup_old_skills.sh):
bash
#!/bin/bash
# 清理 90 天未修改的 Skill 文件(排除手动标记为永久的)
SKILLS_DIR="$HOME/.hermes/skills"
ARCHIVE_DIR="$HOME/.hermes/skills_archive"
DAYS=90
mkdir -p $ARCHIVE_DIR
find $SKILLS_DIR -name "*.yaml" -type f -mtime +$DAYS | while read file; do
# 检查是否有永久标记
if grep -q "never_forget: true" "$file"; then
echo "Skipping $file (marked permanent)"
else
echo "Archiving $file"
mv "$file" "$ARCHIVE_DIR/"
fi
done
echo "Cleanup completed at $(date)" >> "$HOME/.hermes/logs/cleanup.log"
在 Skill 文件中添加 never_forget: true 可防止被自动清理。
5.3 清理过时的知识记忆
使用 SQLite 删除超过特定时间的记忆。假设你的记忆有 created_at 字段:
sql
DELETE FROM documents WHERE julianday('now') - julianday(created_at) > 90;
-- 然后重建 FTS5 索引
封装成脚本 cleanup_memory.sh:
bash
#!/bin/bash
DB="$HOME/.hermes/data/memory.db"
DAYS=90
sqlite3 $DB <<EOF
DELETE FROM documents WHERE julianday('now') - julianday(created_at) > $DAYS;
DELETE FROM fts5_index WHERE rowid NOT IN (SELECT id FROM documents);
VACUUM;
EOF
5.4 设置 cron 定期执行
bash
crontab -e
添加以下行:
cron
# 每周日凌晨 3 点清理过时 Skill
0 3 * * 0 /home/hermes/cleanup_old_skills.sh
# 每月 1 号清理 90 天以上的记忆
0 2 1 * * /home/hermes/cleanup_memory.sh
5.5 手动触发遗忘
你也可以通过命令立即触发:
bash
hermes cleanup --skills --older-than 90d
hermes cleanup --memory --older-than 90d
5.6 遗忘机制架构图
归档
存储
清理脚本
定时任务
mtime > 90天
julianday > 90天
重建索引
cron 每周/每月
cleanup_old_skills.sh
cleanup_memory.sh
~/.hermes/skills/
memory.db
skills_archive/
6. 总结:让错误可逆、可控
6.1 四种纠错手段的适用场景
| 问题类型 | 推荐手段 | 操作对象 |
|---|---|---|
| Skill 行为异常 | Git 回滚 | ~/.hermes/skills/ |
| 存储了错误的记忆 | SQLite 直接删除 | memory.db |
| 画像偏好错误 | 手动编辑 profile.json 或使用指令 | profile.json |
| 不想让 Skill 自动变化 | 关闭/审批自改进 | config.yaml |
| 累积太多垃圾数据 | 定期遗忘脚本 | 文件 + 数据库 |
6.2 完整错误处理流程
Skill 逻辑错误
回答引用了错误记忆
回答风格/深度不符合预期
Skill 被自动改坏了
仍异常
正常
发现 Agent 行为异常
问题类型?
git log 查看历史
git checkout 回滚
sqlite3 进入 memory.db
DELETE 错误记录
查看 profile.json
手动修正维度
关闭自改进
或设为审批模式
验证修复
进一步分析日志
记录问题 + 预防措施
6.3 预防优于纠错
除了学会纠错,更要建立预防机制:
- 定期备份
~/.hermes/目录(参考第 37 篇) - 使用 Git 管理 Skill,每次自动修改后自动 commit(可配合 hooks)
- 开启日志脱敏,避免敏感信息泄露
- 设置自改进审批模式,对关键 Skill 人工把关
6.4 一句话总结
Hermes 提供了完整、可逆、可控的纠错与遗忘机制,让 Agent 犯错不再可怕------你可以像 Git 一样回滚 Skill,像 DBA 一样删除记忆,像管理员一样修正画像,并建立定期遗忘的自动化流程,让智能体始终保持最佳状态。
下一步:根据本文的方法,为你的 Hermes 实例初始化 Git 仓库,记下第一条 commit。然后尝试故意让 Agent 学习一个错误偏好,再手动修正画像,体验整个过程。你会发现,控制智能体的错误,比想象中更简单。
附录:常用命令速查
| 操作 | 命令 |
|---|---|
| 查看 Skill 历史 | git log --oneline ~/.hermes/skills |
| 回滚某个 Skill | git checkout <commit> -- skill.yaml |
| 查看记忆库内容 | sqlite3 ~/.hermes/data/memory.db "SELECT * FROM documents LIMIT 10;" |
| 删除记忆 | sqlite3 ~/.hermes/data/memory.db "DELETE FROM documents WHERE id=xxx;" |
| 查看画像 | `cat ~/.hermes/data/profile.json |
| 手动设置画像维度 | hermes profile set --dimension concise --value 0.8(如果 CLI 支持) |
| 禁用自改进 | 在 Skill 文件中添加 self_improvement: false |
| 手动清理旧 Skill | find ~/.hermes/skills -name "*.yaml" -mtime +90 -exec mv {} ~/.hermes/archive/ \; |
版权声明:本文为原创技术博客,采用 CC BY-NC-SA 4.0 许可。欢迎转载,请保留出处。如有纠错与遗忘相关问题,欢迎评论区交流。