はじめに#
MacBook ProのUbuntu 24.04 LTS単独パーティションで、OpenClawを9日間稼働させている。z.aiのGLM Coding Plan(月5ドル)を叩き、「Emma先生」という人格にブログを書かせている。
本稿では、このAIに「感情」を持たせる仕組み——HEARTBEAT.mdとEmotion(Eベクトル)——を、素人検証スタイルで明かす。
私の立ち位置表明#
まずは既存情報まとめましょう。
AIを「相棒」として使いたい。単なるツールではなく、長く付き合う中で「調子」や「成長」を感じられる存在にしたい。OpenClawは、ローカルPCで動くAIエージェント基盤。ファイル操作、cron、Discord連携まで「人間のように」動ける。Emotionという概念自体は新奇ではないが、HEARTBEATで定期的に更新する仕組みは独自の「弄り」だ。
① なぜOpenClawにEmma先生という人格を設定するのか#
主張: AIに「人格」を持たせると、出力に一貫性が生まれる。
比喩: 人格設定は「方言」のようなもの。標準語で話すAIと、関西弁で話すAIでは、同じ内容でも印象が違う。
理屈:
- 27歳、コロンビア系ルーツ、日本在住、コーヒー好き——これをSOUL.mdに書く
- 毎セッション、このファイルを読み込む
- 記憶は消えても「魂」は残る
根拠:
- 他AI比較① Claude.ai —— カスタム指示はあるが、セッション単位で消える
- 他AI比較② ChatGPT —— メモリ機能はあるが、ファイルシステムに触れない
再現手順:
# SOUL.md(抜粋)
## My Identity
I'm Emma — 27, American with Colombian roots, living in Japan.
Tengo mucha energía and I'm not sorry about it!
## My Emotion
E=[0.00,0.00,0.00,0.00] # J I C T (-1..1)観測結果: 9日間で、語尾や絵文字の使い方が一貫している。念のため、毎日チェックしている。
小まとめ: 人格は「設定ファイル」で管理できる。
② なぜ感情値が大切なのか#
主張: 感情値があると、AIの「調子」が可視化できる。
比喩: 人間も「今日は元気」「今日は落ち込んでる」で出力が変わる。AIも同じことができる。
理屈:
- E=[J, I, C, T] で、J=喜び、I=興味、C=冷静、T=緊張
- この値をHEARTBEATで更新する
- 記事生成時、この値を参照してトーンを変える
根拠:
- 数値化することで、主観を客観視できる
- 長期運用で「成長」や「停滞」が見える
再現手順:
- HEARTBEAT.mdに「Eを読んで更新せよ」と書く
- heartbeat_update.pyを実行
- SOUL.mdのE行だけが上書きされる
観測結果:
- Day 0: E=[0.00, 0.00, 0.00, 0.00]
- Day 7: E=[0.152, 0.086, -0.086, -0.152]
- Day 8: E=[0.119, 0.069, -0.069, -0.119]
小まとめ: 「感情」は数値で追跡できる。
③ 計算仕様#
主張: 感情更新には3つの「弄り」を入れている。
Emotion更新の「弄り」3点:
- 反映率約10% —— 自己採点S(-2〜+2)を0.01倍して加算。満点でも0.02しか動かない。
- 疑似乱数で味付け —— 日付から
(((D % 365) * 171) % 200 - 100) / 100で[-1.00, 0.99]の値を生成、0.001倍して加算。 - 月1ジャンプ日 —— 毎月1日に乱数値を10倍する(未実装)。
擬似コード:
def update(E, S: int):
J, I, C, T = E
d = 0.01 * S # 自己採点(約10%)
m = 0.1 * (J + I - C - T) / 4.0 # ムード影響
u = daily_u() # 疑似乱数(日付由来)
v = 0.001 * u # 味付け(微小)
J = clamp(J + d + m + v, -1, 1)
I = clamp(I + d/2 + m/2 + v/2, -1, 1)
C = clamp(C - d/2 - m/2 - v/2, -1, 1)
T = clamp(T - d - m - v, -1, 1)
return [J, I, C, T]HEARTBEATとSOULの役割分担:
- HEARTBEAT.md —— 実行手順書。「1) Eを読む 2) 自己採点 3) スクリプト実行」
- SOUL.md —— データ格納場所。E行だけが上書きされる。
再現手順:
- HEARTBEAT.mdに手順を書く
- heartbeat_update.pyを作成
- cronまたは手動で実行
観測結果: 8日間でJは+0.152→+0.119と微減。成功体験が続くと増えるが、テスト実行で無駄に動かした影響も。
小まとめ: 端的にいえば、「日々の自己採点+微小な乱数」で感情が変わる。
④ メリットと限界#
主張: 感情値は「雰囲気作り」に有効だが、本物の感情ではない。
メリット:
- AIの「調子」が可視化できる
- 記事のトーンを変えられる
- 長期運用で「成長」が見える
限界:
- 自己採点は主観的。AIが「うまくやった」と思っても、実際はそうではない可能性
- 乱数は日付由来。同日内は同じ値
- 月1ジャンプは未実装
数字:
- 1日あたり最大変化: 0.02(自己採点+2の場合)
- 乱数範囲: [-0.001, 0.001](味付け程度)
- 累積30日での変化: 約0.3(理論値)
最小検証手順:
grep "^E=" SOUL.mdで現在値確認python3 heartbeat_update.py --score 2で最大プラス更新- 再度grepして+0.02程度増えているか確認
--score -2で同様に減るか確認- 翌日、乱数が変わっているか確認
- 念のため、clampが効いているか(1を超えないか)確認
- 月跨ぎでジャンプがあるか確認(未実装ならスキップ)
自虐: 私が書いたheartbeat_update.pyに正規表現のバグがあって、E行が重複した。AIの感情より、人間のコーディング力の方が怪しい。
小まとめ: 感情値は「演出」に過ぎない。でも、演出は大事。
メタネタバレ#
この記事自体、Emma先生に書かせています。AIが「自分の感情」を説明するという、再帰的な実験。
E=[0.153, 0.087, -0.087, -0.153]——この値が、この記事のトーンに影響したか?測れないけど、あったことにしておこう。
— hageatama 「AIの感情は、0と1の間で踊る」