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

相关推荐
江畔柳前堤11 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术11 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客11 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术12 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO12 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术13 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架13 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab13 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI13 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算
冬奇Lab13 小时前
【无标题】
人工智能·开源