Hermes Agent を読み解く — 状態管理とコンパクション
連載「Hermes Agent を読み解く」第3回。
連載「Hermes Agent を読み解く」全10回
- 第1回 全体像と読み方
- 第2回 コアの会話ループ
- [第3回 状態管理とコンパクション](本記事)
- [第4回 記憶アーキテクチャと人格]
- 第5回 ツールシステム
- [第6回 マルチエージェント並列]
- [第7回 Kanban 永続タスクボード]
- [第8回 接続層とインタフェース総覧]
- [第9回 拡張運用]
- [第10回 セキュリティと安全運用]
はじめに — 会話はどこに、どう貯まるのか
前回のループは、1 周ごとに状態を「永続化」していた。その永続化先が hermes_state.py だ。そしてループ内の「圧縮」が context_compressor.py。この 2 つは表裏一体で、長い会話を、壊さずに、context window に収め続けるという難題を分担している。
1. セッションストア(SQLite + FTS5)
Hermes はセッションを SQLite に保存する。同時アクセスへの備えが二重に効いている。
- WAL モードで「並列リーダー + 単一ライター」を実現。読みは詰まらせず、書きは 1 本に絞る
- 書き込み競合にはジッタ付きリトライで対応(一斉再試行による衝突を散らす)
検索は FTS5 の二重インデックス。英語向けの標準トークナイザに加え、CJK 向けの trigram インデックス(messages_fts_trigram)を別に張る。日本語・中国語のように空白で語が切れない言語でも全文検索が効くようにする工夫だ(hermes_state.py:345 付近で実在を確認)。
さらに、ストアを NFS / SMB 上に置いた場合のフォールバックを持つ。ネットワークファイルシステムでは SQLite の WAL が正しく動かないことがあるため、その環境では DELETE ジャーナルモードへ退避する(hermes_state.py:42 付近)。NAS にホームを置く運用を実際に想定した実装で、私のように Synology を併用する身には嬉しい配慮だ。
2. コンパクション(圧縮)の発火と保護
context は無限ではない。Hermes は閾値を超えると会話の中盤を要約して畳む。
-
発火閾値: context 長の約 50%(
threshold_percent = 0.50)。ただし下限 64,000 トークン(MINIMUM_CONTEXT_LENGTH = 64_000)を割らない(context_compressor.py:587/model_metadata.py:133) - スラッシング防止: 圧縮直後にまたすぐ閾値を超えて再圧縮……という振動を避けるガードを持つ
「50%」という早めの発火が効いている。context が満杯になってから慌てて畳むのではなく、半分の時点で余裕をもって畳む。下限 64K は、小さい context のモデルで過剰に圧縮しすぎないための床だ。
畳み方は head / tail を保護し、middle を要約する方式。
冒頭(タスクの前提)と末尾(直近の文脈)は残し、中盤だけを要約に置き換える。そして最新のユーザーメッセージは必ず tail に残す——これを畳むと「今何を頼まれているか」が消えてしまうからだ。
3. parent_session_id 系譜チェーン
圧縮は破壊的操作だ。元の会話を上書きしてしまうと、後から「圧縮前は何だったか」を辿れない。Hermes はこれを避ける。
圧縮のたびに新しい session_id を作り、旧セッションへ parent_session_id でリンクする。圧縮後のセッションは新 ID を名乗りつつ、親を指す。結果として、圧縮を繰り返すほど親 → 子 → 孫……の系譜チェーンが伸びる。元の会話は消えず、必要なら遡れる。
この設計は第4回の記憶論とも響き合う。圧縮は「忘却」だが、系譜チェーンによって「忘れた事実への参照」は保たれる。
4. tool pair の整合性
ツール呼び出しと結果は対になっている。tool_use(呼び出し)と tool_result(結果)は API 上ペアでなければならない。圧縮で中盤を畳むと、このペアが割れることがある——呼び出しだけ残って結果が消える、あるいはその逆。
Hermes は API へ渡す前に孤児になったツール結果を除去、またはスタブ化する。片割れを抱えたまま API に送ると、プロバイダ側でエラーになるからだ。前回触れた「正本は触らず送信用コピーを加工する」設計が、ここで効いてくる。畳んだ結果ペアが割れても、正本は無傷で、送信コピー側だけ辻褄を合わせる。
次回はいよいよ山場。圧縮で「忘れる」エージェントが、それでも連続した人格を保てるのはなぜか。記憶アーキテクチャと、テーゼ 人格 = 知能 × 記憶 を扱う。
対応マップ章: §2.3, §13.2-4 / 行番号は hermes update でずれうる
クイックイタレート株式会社
IoT / 電力監視 / AI / 衛星・無線通信 / システムインテグレーション/
ローカル LLM・エージェント基盤に関するお問い合わせはお気軽にどうぞ。