Hermes Agentの人格レイヤーを競合させない|SOUL.mdと一時設定の優先順位

Hermes Agentの人格レイヤーを競合させない|SOUL.mdと一時設定の優先順位

/personality noneへ戻したのに、Hermes Agent の人格が初期状態へ戻らないことがあります。原因は不具合とは限りません。agent.system_promptに手動の指示が残っていれば、名前付き personality の代わりにその指示が選ばれます。

人格を安定させるには、設定を増やす前に各レイヤーの所有範囲を決めます。長く保つ声、一時的な役、project 固有の規約を別々に管理すると、返答の変化を追いやすくなります。

前回完了時から今回完了後まで

前回は、長く使う声と判断姿勢をSOUL.mdへ置きました。今回は、その基準へ一時設定がどう重なるかを確認します。

時点状態
前回完了時SOUL.mdへ基準の人格を書き、project 規約や一時的な役と分けられます
今回完了後名前付き personality とagent.system_promptの選択順を説明し、モデルなしで解決結果を検査できます

読み飛ばせる章: SOUL.mdだけを使い、agent.system_promptも/personalityも設定していない場合は、「モデルを呼ばずに選択結果を確かめる」まで飛ばせます。

人格の競合を先に解く理由

Hermes の返答は、1 枚の人格ファイルだけでは決まりません。基準の identity に、Memory、Skills、project context、一時 overlay が加わります。

同じ指示を複数の場所へ書くと、変更時に片方だけが残ります。たとえばSOUL.mdで「理由を添える」と決め、名前付き personality で「答えだけを書く」と指定すれば、短さの程度が読みにくくなります。

さらに、名前付き personality と手動 overlay は同時に足されません。公式 source のresolve_ephemeral_system_prompt()は、有効なdisplay.personalityを先に返します。それが無い時だけagent.system_promptを返します。

したがって、調整すべき対象は「全文のどこか」ではありません。基準の声を変えるのか、一時モードを変えるのかを先に選びます。

用語を揃える

用語ここでの意味
identityHermes が誰で、普段どう話すかを決める基準です
SOUL.md現在のHERMES_HOMEから読む、持続する基準人格です
overlay基準の system prompt の後へ加える一時的な指示です
agent.system_prompt利用者が config に置く手動 overlay です
agent.personalities名前付き personality の定義を置く config 項目です
display.personality現在選ばれている personality 名を保持する項目です
project contextAGENTS.mdや.hermes.mdなど、作業場所に属する規約です

人格レイヤーの構成

大きな流れは次の形です。

[SOUL.md]
  持続するidentity
        │
        ▼
[tools / Memory / Skills / project context]
  能力、継続情報、作業場所の規約
        │
        ▼
[一時overlayは次のどちらか1つ]
  display.personalityが有効 → 名前付きpersonality
  それ以外                  → agent.system_prompt
        │
        ▼
[そのturnで使うsystem prompt]

SOUL.mdと project context は別の層です。「率直に反対意見を示す」はSOUL.mdへ置きます。「PR を作る前に test を実行する」は repository 側へ置きます。

一時 overlay の中では、名前付き personality が手動 overlay より先に選ばれます。/personality noneはSOUL.mdだけへ戻す命令ではありません。手動 overlay が残っていれば、次はそれが使われます。

3つの設定先へ責任を分ける

設定先置く内容置かない内容
SOUL.md率直さ、温度感、不確実性の扱いport 番号、test command、一日だけの役
agent.system_prompt全セッションへ加えたい手動 overlay名前で切り替えたい複数の役
agent.personalitiesreviewer、teacher などの切り替える役常に守る基準人格

agent.system_promptは便利ですが、選択中の personality があると表面へ出ません。常設したい声ならSOUL.mdへ寄せます。作業ごとに外したい役なら、名前付き personality にします。

たとえば review 用の定義は、次のように config へ置けます。

agent:
  system_prompt: >
    回答は日本語で書き、確認済みの事実と推測を分けます。
  personalities:
    reviewer:
      system_prompt: >
        変更点を検査し、欠陥と根拠を優先順に示します。
      tone: direct
      style: concise
display:
  personality: reviewer

この状態ではreviewerが選ばれます。agent.system_promptの日本語指定は、reviewer の文章へ自動合成されません。両方で必要な条件なら、基準のSOUL.mdか personality 定義側へ責任を寄せます。

モデルを呼ばずに選択結果を確かめる

設定を本番へ書く前に、公式 source の解決関数へ小さな config を渡します。2026 年 9 月 25 日に、Hermes Agent v0.21.0 の source root で実行しました。

標準 installer を使った環境では、次の command をそのまま実行できます。別の場所へ source を置いた場合は、1 行目だけ実際の root へ替えます。

cd ~/.hermes/hermes-agent
.venv/bin/python - <<'PY'
from pathlib import Path
from tempfile import TemporaryDirectory
from agent.prompt_builder import load_soul_md
from hermes_cli.personality import resolve_ephemeral_system_prompt

with TemporaryDirectory() as raw_home:
    home = Path(raw_home)
    (home / "SOUL.md").write_text("BASE VOICE", encoding="utf-8")
    print("base=" + (load_soul_md(home_override=home) or "NONE"))

cfg = {
    "display": {"personality": "reviewer"},
    "agent": {
        "system_prompt": "MANUAL OVERLAY",
        "personalities": {"reviewer": "REVIEW MODE"},
    },
}
print("overlay=" + resolve_ephemeral_system_prompt(cfg))
cfg["display"]["personality"] = "none"
print("after_none=" + resolve_ephemeral_system_prompt(cfg))
PY

実際の出力は次の 3 行でした。

base=BASE VOICE
overlay=REVIEW MODE
after_none=MANUAL OVERLAY

1 行目は、指定した profile home のSOUL.mdを読めた結果です。2 行目では、選択中のreviewerが手動 overlay より優先されています。3 行目では、noneへ戻した後に手動 overlay が選ばれています。

この検査は API を呼びません。token 消費も、会話履歴への書き込みもありません。仮のSOUL.mdは一時 directory 内だけに作られ、command 終了時に消えます。

実際の切り替えは1か所から行う

名前付き personality の切り替えには、会話内の/personalityを使います。

/personality reviewer
/personality none

公式 source では、この操作がdisplay.personalityへ正規化した名前を書きます。personality の切り替え処理はagent.system_promptを書き換えません。そのため、noneにした後で手動 overlay が再び現れても、古い personality が残ったとは限りません。

SOUL.mdを編集した場合は、新しいセッションで確認します。基準人格はセッションの system prompt を組み立てる時に読まれるためです。一方、/personalityの変更は一時モードの選択として扱います。

確認用の問いは、編集前後で同じものを使います。次の 3 種類なら、層の違いが出やすくなります。

  1. 1 行で済む事実確認
  2. 弱い前提を含む設計案の review
  3. 初心者向けの短い説明

基準人格の差を見たい時は personality をnoneにし、agent.system_promptも空か確認します。reviewer の差を見たい時だけ、名前付き personality を選びます。

よくあるエラー

症状主な原因対応
noneにしても口調が戻りませんagent.system_promptが残っていますconfig の手動 overlay を確認します
手動 overlay が効きませんdisplay.personalityで有効な名前を選んでいます/personality noneで選択を外します
SOUL.mdを直しても変化しません編集前からのセッションを続けています新しいセッションを始めます
custom personality が選べません定義名と選択名が一致していません小文字化後の名前と config の位置を確認します
reviewer でも project 規約を守りません規約を人格設定へ置いていますrepository のAGENTS.mdか.hermes.mdへ移します
profile ごとに別の声になりません別 profile が同じ home を参照しています各 profile の config path とSOUL.mdを確認します
短い回答と詳しい回答が不安定です複数の層へ反対の長さ指定があります所有する層を1つに決め、重複を削ります

人格は足し算ではなく所有権で整える

Hermes Agent の人格を調整する時は、指示の数より置き場所を見ます。SOUL.mdは持続する identity、project context は作業規約、名前付き personality は外せる役です。

一時 overlay の選択では、名前付き personality が有効ならそれを使います。選択を外した時だけ、手動のagent.system_promptへ戻ります。この順序を先に検査すれば、効いていない設定へ指示を足し続けずに済みます。

一次情報

出典確認した内容
Personality & SOUL.mdSOUL.md、名前付き personality、agent.system_prompt、project context の役割
Prompt Assemblyidentity、Memory、Skills、context file、一時 overlay の組み立て順
Hermes Agent Configurationconfig の保存先と context file の扱い
hermes_cli/personality.pypersonality 名の正規化、選択順、display.personalityへの保存処理
agent/prompt_builder.pyprofile home からのSOUL.md読み込みと基準 identity の処理
personalityの回帰test選択人格が手動 overlay より優先され、切り替えが手動設定を壊さないこと

公開ドキュメントと source は更新されます。実運用では、使用中の Hermes Agent の版と公式文書を合わせて確認してください。

この記事をシェア