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を返します。
したがって、調整すべき対象は「全文のどこか」ではありません。基準の声を変えるのか、一時モードを変えるのかを先に選びます。
用語を揃える
| 用語 | ここでの意味 |
|---|---|
| identity | Hermes が誰で、普段どう話すかを決める基準です |
SOUL.md | 現在のHERMES_HOMEから読む、持続する基準人格です |
| overlay | 基準の system prompt の後へ加える一時的な指示です |
agent.system_prompt | 利用者が config に置く手動 overlay です |
agent.personalities | 名前付き personality の定義を置く config 項目です |
display.personality | 現在選ばれている personality 名を保持する項目です |
| project context | AGENTS.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.personalities | reviewer、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 行で済む事実確認
- 弱い前提を含む設計案の review
- 初心者向けの短い説明
基準人格の差を見たい時は 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.md | SOUL.md、名前付き personality、agent.system_prompt、project context の役割 |
| Prompt Assembly | identity、Memory、Skills、context file、一時 overlay の組み立て順 |
| Hermes Agent Configuration | config の保存先と context file の扱い |
| hermes_cli/personality.py | personality 名の正規化、選択順、display.personalityへの保存処理 |
| agent/prompt_builder.py | profile home からのSOUL.md読み込みと基準 identity の処理 |
| personalityの回帰test | 選択人格が手動 overlay より優先され、切り替えが手動設定を壊さないこと |
公開ドキュメントと source は更新されます。実運用では、使用中の Hermes Agent の版と公式文書を合わせて確認してください。
