- nginx 安全加固 (CSP, HSTS, 缓存策略) - 共享 style.css - 138个页面全部接入 Co-authored-by: Hermes AI <agent@hermes>
395 lines
19 KiB
HTML
395 lines
19 KiB
HTML
<!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 DB(SQLite + 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>
|
||
--schedule <span class="str">"0 3 * * *"</span> \<br>
|
||
--prompt <span class="str">"分析过去48小时的Session记录..."</span> \<br>
|
||
--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>
|
||
- html<br>
|
||
- 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>
|
||
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>
|
||
<span class="str">"id"</span>: <span class="str">"patch-001"</span>,<br>
|
||
<span class="str">"skill_name"</span>: <span class="str">"skills/operations/system-stewardship/SKILL.md"</span>,<br>
|
||
<span class="str">"type"</span>: <span class="str">"update"</span>,<br>
|
||
<span class="str">"reason"</span>: <span class="str">"源于web_search缺失的反复调用——需要在已知坑中新增替代方案"</span>,<br>
|
||
<span class="str">"suggested_change"</span>: <span class="str">"新增规则:工具首次调用失败后立即切browser代替"</span>,<br>
|
||
<span class="str">"old_text_pattern"</span>: <span class="str">"..."</span>,<br>
|
||
<span class="str">"new_text"</span>: <span class="str">"..."</span>,<br>
|
||
<span class="str">"confidence"</span>: <span class="str">"high"</span>,<br>
|
||
<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>
|