Files
sxbh.ltd/hermes-dream-mode.html
Hermes CI FixandHermes AI e1a9b25afa init: sxbh.ltd 官网初始提交
- nginx 安全加固 (CSP, HSTS, 缓存策略)
- 共享 style.css
- 138个页面全部接入

Co-authored-by: Hermes AI <agent@hermes>
2026-07-11 17:29:24 +08:00

395 lines
19 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>手把手实现 Hermes Agent 梦境模式 | AI自进化实践</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{
font-family:-apple-system,"PingFang SC","Microsoft YaHei","Noto Sans CJK SC",sans-serif;
background:#f5f6f7;color:#2c3e50;line-height:1.8
}
.container{max-width:800px;margin:0 auto;padding:0 20px}
/* Header */
.header{
background:linear-gradient(135deg,#0f172a 0%,#1e293b 50%,#1a1a2e 100%);
padding:48px 0;text-align:center
}
.header h1{
font-size:30px;font-weight:700;color:#fff;line-height:1.4;
background:linear-gradient(135deg,#38bdf8,#818cf8,#34d399);
-webkit-background-clip:text;-webkit-text-fill-color:transparent
}
.header .meta{color:#94a3b8;font-size:14px;margin-top:16px}
.header .meta span{margin:0 12px}
.header .label{
display:inline-block;padding:4px 14px;border-radius:20px;
font-size:12px;font-weight:600;margin-top:12px
}
.label-practice{background:rgba(52,211,153,0.15);color:#34d399}
.label-tech{background:rgba(56,189,248,0.15);color:#38bdf8}
/* Content */
.content{background:#fff;padding:40px 0}
.content h2{
font-size:22px;font-weight:700;margin:36px 0 16px;
padding-bottom:8px;border-bottom:2px solid #e2e8f0
}
.content h3{font-size:17px;font-weight:600;margin:24px 0 12px;color:#0f172a}
.content p{font-size:15px;margin-bottom:14px;color:#334155}
.content p.lead{font-size:17px;color:#1e293b;font-weight:500}
.content ul,.content ol{padding-left:24px;margin-bottom:14px;font-size:15px;color:#334155}
.content li{margin-bottom:6px}
/* Code */
.code-block{
background:#1e2a35;border-radius:8px;padding:16px 20px;
margin:14px 0;overflow-x:auto;font-family:'JetBrains Mono','Fira Code',monospace;
font-size:13px;line-height:1.6;color:#e2e8f0
}
.code-block .cm{color:#6b7280}
.code-block .kw{color:#818cf8}
.code-block .str{color:#34d399}
.code-block .fn{color:#38bdf8}
.code-block .num{color:#fbbf24}
/* Table */
table{width:100%;border-collapse:collapse;margin:16 0;font-size:14px}
th,td{padding:10px 14px;text-align:left;border-bottom:1px solid #e2e8f0}
th{background:#0f172a;color:#fff;font-weight:600}
td{color:#334155}
tr:nth-child(even){background:#f8fafc}
/* Card */
.card-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:16px 0}
.card{
background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:18px
}
.card .title{font-weight:600;font-size:14px;margin-bottom:6px}
.card .desc{font-size:13px;color:#64748b}
/* Quote */
.quote{
background:#f0f9ff;border-left:4px solid #38bdf8;
padding:14px 18px;margin:16px 0;border-radius:0 8px 8px 0;font-size:14px;color:#334155
}
.quote-warn{
background:#fffbeb;border-left:4px solid #fbbf24;
padding:14px 18px;margin:16px 0;border-radius:0 8px 8px 0;font-size:14px;color:#92400e
}
/* Architecture Flow */
.arch-flow{
display:flex;align-items:center;justify-content:center;
gap:10px;flex-wrap:wrap;padding:20px 0
}
.arch-box{
background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;
padding:10px 16px;text-align:center;min-width:90px
}
.arch-box .name{font-size:13px;font-weight:600}
.arch-box .sub{font-size:11px;color:#94a3b8;margin-top:2px}
.arch-arrow{color:#38bdf8;font-size:18px;font-weight:700}
/* Badge */
.badge{display:inline-block;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600}
.badge-green{background:rgba(52,211,153,0.12);color:#059669}
.badge-yellow{background:rgba(251,191,36,0.12);color:#b45309}
.badge-red{background:rgba(239,68,68,0.12);color:#dc2626}
/* Footer */
.footer{
background:#0f172a;color:#94a3b8;text-align:center;
padding:24px 0;font-size:13px
}
@media(max-width:640px){
.card-grid{grid-template-columns:1fr}
.header h1{font-size:24px}
}
</style>
<link rel="stylesheet" href="/style.css">
</head>
<body>
<div class="header">
<div class="container">
<h1>手把手实现 Hermes Agent 梦境模式<br>当 AI 在深夜开始反思自己</h1>
<div class="meta">
<span>📅 2026-06-26</span>
<span>🏷️ Hermes Agent · 自进化 · 工程实践</span>
<span>⏱ 阅读约 12 分钟</span>
</div>
<span class="label label-practice">🔬 实战案例</span>
<span class="label label-tech" style="margin-left:8px">⚙️ 技术架构</span>
</div>
</div>
<div class="content">
<div class="container">
<h2>一、起因:一篇头条文章引出的实验</h2>
<p class="lead">
今天在今日头条看到一篇文章《Hermes Agent 的"梦境模式":当 AI 在深夜开始"反刍"记忆》。文章讲了一个概念:让 AI Agent 在夜间通过 Cron 触发,自动回顾白天的 Session 记录,识别错误模式、提取优化机会,甚至自动为 Skill 文件打补丁。
</p>
<p>
这个概念非常吸引人——它描述了 Hermes Agent 从"高级工具"向"自进化数字生命"跨越的关键一步。但文章本质是概念推演,并未给出完整可运行的实现。
</p>
<p>
于是我做了一个决定:<strong>用一下午时间,把这个"梦境模式"从概念变成真实可运行的工程方案。</strong>
</p>
<h2>二、梦境模式的系统架构</h2>
<h3>2.1 核心设计</h3>
<p>"梦境模式"在技术上并不神秘——它是一个 <strong>后台反思循环(Background Reflection Loop</strong>,由以下组件构成:</p>
<div class="arch-flow">
<div class="arch-box"><div class="name">🔍 Session DB</div><div class="sub">FTS5全文索引</div></div>
<div class="arch-arrow"></div>
<div class="arch-box" style="border-color:#38bdf8"><div class="name">🌙 梦境Agent</div><div class="sub">cronjob定时触发</div></div>
<div class="arch-arrow"></div>
<div class="arch-box" style="border-color:#818cf8"><div class="name">📊 复盘报告</div><div class="sub">JSON结构化输出</div></div>
<div class="arch-arrow"></div>
<div class="arch-box" style="border-color:#34d399"><div class="name">🧩 Skill补丁</div><div class="sub">自动生成·确认生效</div></div>
</div>
<table>
<tr><th width="120">组件</th><th>技术实现</th><th>说明</th></tr>
<tr><td>数据源</td><td>Hermes Session DBSQLite + FTS5</td><td>所有历史对话被实时索引,支持全文检索</td></tr>
<tr><td>触发器</td><td>Hermes cronjob 系统</td><td>每日凌晨 3:00 自动触发,无需人干预</td></tr>
<tr><td>分析引擎</td><td>Agent 通过 session_search 读取并分析</td><td>调用 LLM 对 Session 内容进行模式识别</td></tr>
<tr><td>产物A</td><td>复盘报告 (dream_YYYYMMDD.json)</td><td>错误模式、优化机会、原则对齐</td></tr>
<tr><td>产物B</td><td>补丁建议 (patches_YYYYMMDD.json)</td><td>可执行的 Skill 修改 diff,需确认后生效</td></tr>
<tr><td>安全护栏</td><td>只读操作 + 人类确认</td><td>Phase 1 只读不写;Phase 2 补丁需 approve</td></tr>
</table>
<h3>2.2 两阶段递进</h3>
<div class="card-grid">
<div class="card">
<div class="title">🌙 Phase 1:复盘报告</div>
<div class="desc">
零风险只读模式。Agent 浏览近期 Session、识别错误模式、提取优化机会、评估与用户原则的对齐度。输出结构化 JSON 报告。<br><br>
<span class="badge badge-green">已运行</span> 首份报告已产出
</div>
</div>
<div class="card">
<div class="title">🧩 Phase 2:补丁生成</div>
<div class="desc">
在复盘基础上,Agent 读取现有 Skill 库,针对重复出现的错误模式生成具体的 Skill 修改建议(含 diff 格式的 old_text/new_text)。<br><br>
<span class="badge badge-green">已运行</span> 补丁生成已就绪
</div>
</div>
</div>
<h2>三、Phase 1 实现:复盘报告</h2>
<h3>3.1 一行命令创建梦境cronjob</h3>
<p>Hermes 内置了完整的 cronjob 系统,无需写 Python handler 或修改源码:</p>
<div class="code-block">
<span class="cm"># 创建一个每日凌晨3点的梦境复盘cronjob</span><br>
hermes cron create \<br>
&nbsp;&nbsp;--schedule <span class="str">"0 3 * * *"</span> \<br>
&nbsp;&nbsp;--prompt <span class="str">"分析过去48小时的Session记录..."</span> \<br>
&nbsp;&nbsp;--deliver origin
</div>
<p>cronjob 的 Agent 会按顺序执行:</p>
<ol>
<li><strong>浏览</strong>——用 <code>session_search()</code> 获取近期活跃 Session 列表</li>
<li><strong>阅读</strong>——选出 2-3 个有实质内容的 Session,读取完整记录</li>
<li><strong>分析</strong>——识别错误模式(errors)、优化机会(optimizations)、原则对齐(alignments</li>
<li><strong>输出</strong>——写入结构化的 JSON 报告到 <code>~/WB_WS/_dream/</code></li>
<li><strong>摘要</strong>——返回一段 200 字以内的可读"梦境摘要"</li>
</ol>
<h3>3.2 第一份梦境报告发现了什么</h3>
<p>梦境第一次运行就发现了有价值的模式。以下是实际输出中的部分内容:</p>
<table>
<tr><th width="80">严重度</th><th>发现的错误模式</th><th>根因</th></tr>
<tr>
<td><span class="badge badge-red">High</span></td>
<td><code>web_search</code> 工具不存在但每个 Session 都调用</td>
<td>系统提示词中有这个工具名但实际未启用</td>
</tr>
<tr>
<td><span class="badge badge-yellow">Medium</span></td>
<td>头条反爬导致大量无效重试</td>
<td>curl 无 JS 运行时获取到混淆代码</td>
</tr>
<tr>
<td><span class="badge badge-yellow">Medium</span></td>
<td>Nginx 配置编辑时 Python 正则转义语法错误</td>
<td>转义符处理不当导致 nginx -t 验证失败</td>
</tr>
<tr>
<td><span class="badge badge-green">Low</span></td>
<td>浏览器 Console eval <code>let</code> 变量命名冲突</td>
<td>多次注入 JS 用同一变量名</td>
</tr>
</table>
<div class="quote">
<strong>💡 价值:</strong> 第一个 High 严重度的错误模式——<code>web_search</code> 工具缺失——之前从未被系统化地识别过。梦境报告让它浮出水面,变成了一个可跟踪、可量化的改进项。
</div>
<h2>四、一个真实的修复案例:web_search 从缺失到就绪</h2>
<p>梦境报告指出了 <code>web_search</code> 不可用的问题后,下一个自然的问题是:<strong>为什么它不存在?怎么修?</strong></p>
<h3>4.1 排查过程</h3>
<p>检查 Hermes 配置发现 <code>web.search_backend</code> 为空字符串。Hermes 支持多种搜索后端:</p>
<table>
<tr><th>后端</th><th>配置方式</th><th>费用</th><th>国内可用性</th></tr>
<tr><td>Firecrawl</td><td>API Key</td><td>500次/月免费</td><td></td></tr>
<tr><td><strong>SearXNG</strong></td><td><strong>自建 Docker</strong></td><td><strong>免费</strong></td><td><strong>✅ 已有实例</strong></td></tr>
<tr><td>DDGS (DuckDuckGo)</td><td>零配置</td><td>免费</td><td>⚠️ 可能被墙</td></tr>
<tr><td>Brave Search</td><td>API Key</td><td>2000次/月免费</td><td></td></tr>
</table>
<p>检查发现服务器上已有一个 SearXNG Docker 实例在运行——但它的 JSON API 输出被禁用,且默认搜索引擎(Google、DuckDuckGo)在国内无法访问。</p>
<h3>4.2 修复链</h3>
<p>这是一条完整的"问题发现→诊断→修复→验证"链:</p>
<div class="code-block">
<span class="cm"># 1. 启用 JSON 输出格式(默认只有 html)</span><br>
<span class="cm"># 编辑 SearXNG settings.yml,在 formats 中加入 json</span><br>
formats:<br>
&nbsp;&nbsp;- html<br>
&nbsp;&nbsp;- json <span class="cm"># ← 新增</span><br><br>
<span class="cm"># 2. 更换可用的搜索引擎</span><br>
<span class="cm"># 禁用 Google/DuckDuckGo/Brave(国内被墙),启用百度/搜狗</span><br>
<span class="cm"># baidu: disabled: false</span><br>
<span class="cm"># sogou: disabled: false</span><br><br>
<span class="cm"># 3. 调大超时(默认3秒对中国网络太短)</span><br>
request_timeout: <span class="num">10.0</span><br>
max_request_timeout: <span class="num">15.0</span><br><br>
<span class="cm"># 4. 配置 Hermes 连接 SearXNG</span><br>
<span class="cm"># ~/.hermes/.env</span><br>
SEARXNG_URL=http://127.0.0.1:8080<br><br>
<span class="cm"># ~/.hermes/config.yaml</span><br>
web:<br>
&nbsp;&nbsp;search_backend: searxng
</div>
<h3>4.3 验证结果</h3>
<p>修复后,SearXNG 搜索正常工作:</p>
<div class="quote">
✅ 搜索 "Hermes Agent" → 返回 20 条结果(百度+搜狗引擎)<br>
✅ 搜索 "Hermes Agent 梦境模式" → 返回相关中文博客和教程<br>
✅ 跨 Profile 继承——全局配置一处修改,8 个 Profile 全部生效
</div>
<h2>五、Phase 2 实现:Skill 补丁自动生成</h2>
<h3>5.1 补丁生成流程</h3>
<p>Phase 2 在复盘报告的基础上增加了一个关键步骤——<strong>查看现有技能库,生成具体的文件修改建议</strong></p>
<div class="arch-flow">
<div class="arch-box"><div class="name">📋 输出A</div><div class="sub">复盘报告</div></div>
<div class="arch-arrow"></div>
<div class="arch-box" style="border-color:#818cf8"><div class="name">📂 技能库</div><div class="sub">skill_view()</div></div>
<div class="arch-arrow"></div>
<div class="arch-box" style="border-color:#34d399"><div class="name">📝 输出B</div><div class="sub">补丁建议</div></div>
<div class="arch-arrow"></div>
<div class="arch-box" style="border-color:#fbbf24"><div class="name">👤 你确认</div><div class="sub">approve后生效</div></div>
</div>
<h3>5.2 补丁格式</h3>
<p>每个补丁都包含完整可执行的 diff 信息:</p>
<div class="code-block">
{<br>
&nbsp;&nbsp;<span class="str">"id"</span>: <span class="str">"patch-001"</span>,<br>
&nbsp;&nbsp;<span class="str">"skill_name"</span>: <span class="str">"skills/operations/system-stewardship/SKILL.md"</span>,<br>
&nbsp;&nbsp;<span class="str">"type"</span>: <span class="str">"update"</span>,<br>
&nbsp;&nbsp;<span class="str">"reason"</span>: <span class="str">"源于web_search缺失的反复调用——需要在已知坑中新增替代方案"</span>,<br>
&nbsp;&nbsp;<span class="str">"suggested_change"</span>: <span class="str">"新增规则:工具首次调用失败后立即切browser代替"</span>,<br>
&nbsp;&nbsp;<span class="str">"old_text_pattern"</span>: <span class="str">"..."</span>,<br>
&nbsp;&nbsp;<span class="str">"new_text"</span>: <span class="str">"..."</span>,<br>
&nbsp;&nbsp;<span class="str">"confidence"</span>: <span class="str">"high"</span>,<br>
&nbsp;&nbsp;<span class="str">"requires_approval"</span>: <span class="kw">true</span><br>
}
</div>
<h3>5.3 安全设计</h3>
<ul>
<li><strong>默认只读</strong>——Phase 1 不修改任何文件,Phase 2 只生成建议不执行</li>
<li><strong>需要确认</strong>——所有补丁的 <code>requires_approval</code> 默认为 true</li>
<li><strong>置信度标注</strong>——High 表示重复性错误明确需要修;Medium 有价值但不紧急;Low 仅供参考</li>
<li><strong>改进追踪</strong>——每次报告追踪上期问题的修复状态(fixed / still_exists / improved</li>
</ul>
<h2>六、经验与避坑</h2>
<h3>6.1 什么做对了</h3>
<ul>
<li><strong>渐进式推进</strong>——Phase 1(只读复盘)→ Phase 2(补丁建议)→ Phase 3(自动执行)。每次增加一个风险级别,而不是一口气到位</li>
<li><strong>利用已有基础设施</strong>——Hermes 的 cronjob、session_search、skill 系统已经覆盖了"梦境"需要的所有组件,没有任何额外安装</li>
<li><strong>改进追踪闭环</strong>——每次报告记录上期问题的状态,"web_search 缺失 → 确认仍未修复 → 手动修复 → 下期确认 fixed" 形成一个完整的 PDCA 循环</li>
</ul>
<h3>6.2 踩了哪些坑</h3>
<ul>
<li><strong>走了 SearXNG 的弯路</strong>——明明有更轻量的后端方案(Brave Search 免费 Key),却因为"已有 SearXNG 实例"而选择了需要修容器的复杂路线</li>
<li><strong>Docker 网络问题</strong>——容器重启时 iptables 规则损坏,端口映射丢失,需要切换到 host 网络模式解决</li>
<li><strong>搜索引擎被墙</strong>——默认配置的 Google、DuckDuckGo、Brave 在国内全部超时,需要手动切换到百度/搜狗</li>
<li><strong>Profile 配置层级</strong>——改了全局 config.yaml 后发现 Profile 有自己的配置覆盖了全局,需要逐个同步</li>
</ul>
<h2>七、下一步:Phase 3 方向</h2>
<p>当前"梦境模式"已经能稳定运行:每晚自动复盘,输出结构化报告和补丁建议。Phase 3 的可能方向:</p>
<table>
<tr><th>方向</th><th>说明</th><th>风险</th></tr>
<tr><td>低置信度补丁自动执行</td><td>confidence=high 且明确的错误修复,可自动写入 Skill</td><td>需要严格的版本回滚机制</td></tr>
<tr><td>多维度交叉验证</td><td>同一问题被多个 Session 报告 → 置信度自动提升</td><td>低,只需修改分析逻辑</td></tr>
<tr><td>梦境报告实时推送到群聊</td><td>凌晨分析完成后自动推送摘要到企业微信群</td><td>低,cronjob 本身已支持 deliver</td></tr>
<tr><td>n8n MCP 集成</td><td>把梦境报告中的度量数据推送到 n8n 工作流</td><td>需先完成 n8n 部署</td></tr>
</table>
<h2>八、总结</h2>
<div class="quote">
<p style="font-size:16px;"><strong>"梦境模式不是一行命令或一个功能,它是一个工程思维——让 Agent 从自己的经验中学习。"</strong></p>
</div>
<p>Hermes 的独特之处不在于它跑得比别的 Agent 快,而在于它有"记忆"和"反思"的架构基础。梦境模式只是这个基础之上的一种应用——利用已有的 SQLite + FTS5 会话存储、cronjob 定时调度、skill 知识沉淀能力,组合出"自我复盘→发现问题→提出改进→确认生效"的完整进化回路。</p>
<p>最重要的启示是:<strong>自进化 AI 不一定需要复杂的强化学习框架</strong>。一个结构化的复盘循环 + 可执行的补丁机制 + 人类监督护栏,已经能让 Agent 从经验中持续改进。</p>
<div class="quote-warn">
<strong>⚠️ 重要提醒:</strong> 梦境模式本质是对 LLM 输出进行再分析,存在"幻觉级联"风险——如果 LLM 在复盘时产生了错误的分析结论,基于此生成的补丁可能引入新问题。这就是为什么 Phase 2 的补丁强制需要人类确认。建议初始使用至少运行 1-2 周的 Phase 1,积累足够的模式数据后再启用补丁生成。
</div>
</div>
</div>
<div class="footer">
博海技术管理 · hermes-yanxue · 2026-06-26
</div>
</body>
</html>