【Hermes:安全、权限与生产环境】39、智能体也会犯错?Hermes 纠错、回滚与遗忘机制全指南 —— 让 AI 的错误像 Git 一样可逆可控

智能体也会犯错?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 许可。欢迎转载,请保留出处。如有纠错与遗忘相关问题,欢迎评论区交流。

相关推荐
小白编程锤炼1 小时前
深入解析:质量门禁
人工智能·算法·架构·vibe-coding
Ares-Wang1 小时前
AI》》 监督学习,无监督学习,半监督学习、强化学习 、深度学习 统计学的常用方法
人工智能·深度学习·学习
江瀚视野1 小时前
DeepWay深向盈利拐点趋近意味着什么?
大数据·人工智能
爱学习的张大1 小时前
KG与LLM:大模型时代的智能规划
人工智能
三维重建-光栅投影1 小时前
线性代数之超定方程使用最小二乘求解
人工智能·线性代数
老码观察2 小时前
数环通iPaaS知识库选型实践:从技术评估到RAGFlow深度调优
人工智能·agent·知识库
从零开始的奋豆2 小时前
从零构建 ClaudeCode 风格的 AI 编程助手:Code Agent 完整架构解析
人工智能·架构
多年小白2 小时前
【行情复盘】2026年5月12日(周二)
人工智能·科技·机器学习·ai·金融
智享食事2 小时前
从能说到能做:OpenClaw技能系统完全解析
人工智能