3行でいうと
- AIエージェントに、毎晩22時に「今日の日記」を1ファイル書かせる。cron 1本と短い指示文で始められます
- 日記は**手元のPCで動くローカルLLM(埋め込みモデル)**で索引にしておき、あとで意味検索で引く。別の日・別のチャンネルでも「前に決めたこと」が通じるようになります
- 3週間やって、良いことも困ることも見えてきたので、実例と数字で書きます
この記事の話
自宅のマシンで OpenClaw を動かしていて、そのうちの1台(以下「おぷー」)は Discord に常駐して、雑多な相談や定期ジョブを引き受けています。
このおぷーに、毎晩22時に「今日の日記」を書かせるようにしました。書いた日記はローカルの埋め込みモデルで索引に入り、後から意味検索で引けます。日記のファイル自体は6月からありましたが、何かあった日だけ短く書くメモでした(6/16〜8/24 で26日分・441行)。毎晩必ず書く形にしたのは2026年9月8日で、それからほぼ3週間になります。
この記事の前半は使う側から見た話です。何が変わったか、どんな得があったか、そしてうまくいっていないことを、実際に起きたことをもとに書きます。後半は短く、設定と仕組みの要点だけ書きます。
日記には家族の予定や仕事のやり取りなど、公開できない内容がたくさん入っています。この記事では中身は引用せず、例は一般化するか作り例に置き換えています。数字(件数・文字数・スコア)は実測です。
検索の仕組みそのもの(索引の材料をどう増やしたか、スコアがなぜ伸びなかったか)は前回の記事に書きました。この記事ではそこは繰り返しません。
全体像: 会話・日記・索引のつながり
登場するものは5つです。
| 何か | いつ・誰が作るか | |
|---|---|---|
| 会話 | Discord の各チャンネルでのやり取り | ユーザーが話しかけたとき |
| OpenClaw | メッセージを受けてエージェントに渡し、返事を返す常駐プログラム | 常に動いている |
| 会話の記録 | やり取りそのままの記録(sessions)。チャンネルごとに分かれている |
OpenClaw が自動で保存(④) |
| 日記 | 1日1ファイルの memory/YYYY-MM-DD.md。全チャンネルの出来事を要点に絞ったもの |
毎晩22時の日記ジョブ(⑤) |
| 索引 | 日記と会話の記録をベクトルにして入れた SQLite。意味とキーワードの両方で探せる | ローカルの埋め込みモデル(⑥) |
ポイントは⑤です。会話の記録はチャンネルごとの生ログで、量も多く、別のチャンネルの話は横から見えません。日記ジョブがそれを1日1枚に、決めたこと・頼まれたこと・失敗に絞ってまとめるので、翌日以降どのチャンネルで聞かれても⑦⑧で引けるようになります。夜中の3時には OpenClaw の dreaming が日記を読み直して、長期記憶に上げる候補を探します。
索引はローカルLLMで作っている
この仕組みでおもしろいのは、思い出すための部分(⑥⑦⑧)が、クラウドではなく手元のPCで動いていることです。
| 部分 | どこで動くか | 使っているモデル |
|---|---|---|
| 返事を書く(エージェント) | クラウド | Claude |
| 日記を書く(22時の日記ジョブ) | クラウド | Claude |
| 索引にする・探す(⑥⑦⑧) | 手元のPC |
embeddinggemma-300m(llama.cpp で動かす埋め込みモデル) |
索引に使っているのは、会話をするタイプの LLM ではなく、文を数字の列(ベクトル)に変える「埋め込みモデル」です。意味の近い文どうしは近い数字になるので、言い方が違っても「前に決めたこと」を見つけられます。
うちで動かしてみると、こうでした。
- モデルは約329MBのファイル1つ。OpenClaw の llama.cpp プラグインが自動で落としてきます(公式ドキュメントでも「約0.3GB」)1
-
自分のマシンの中(
127.0.0.1)だけで待ち受けるllama-serverとして常駐。メモリは約200MB - API キーも、使うたびの料金も要らない。日記と会話の記録、合わせて約7,900チャンクを索引にしています
- 索引を作るために、日記の中身を外部の埋め込み API に送らずに済む。日記には家族やお金の話も入るので、ここが手元で済むのは安心材料です
設定のしかたは後半の「検索をローカルで動かす」に書きました。
1日の流れ
おぷーの1日は、だいたいこう回っています。
日記ジョブに渡している指示は短いものです(実物をほぼそのまま載せます)。
今日の日記を書いてください。
1. 今日の日付のファイル memory/YYYY-MM-DD.md を確認する。既にあれば追記、無ければ新規作成。
2. 今日のやり取りを振り返る。誰と何を話したか / 頼まれたこと / 作ったもの / 学んだこと・詰まったこと / 気づいたこと。
3. 箇条書きで具体的に書く(名前・パス・URL・判断を残す)。日本語で可。
4. 何も起きなかった日も必ず1行書く: 「- メンションなし。静かな一日。」
空の日を飛ばすと記録が途切れて、後から思い出せなくなる。
5. チャットには何も投稿しない。ファイルを書いたら終わり。報告も不要。
3週間でできた日記は17日分、合計でおよそ14万字(1日あたり4,500〜16,000字)です。
何が変わったか
ビフォー・アフター
| 毎晩の日記を始める前(〜9/7) | 3週間後(9/30) | |
|---|---|---|
| 日記ファイル | 1件(6〜8月の26日分は消えていた) | 17件(約14万字) |
索引の memory 側 |
35ファイル・87チャンク | 166ファイル・3,284チャンク |
| 別のチャンネルでの話 | そのチャンネルでしか分からない | 日記を経由して引ける |
| 昨日決めたこと | 同じ会話の中にいれば覚えている | 翌日の別の会話でも日記に残っている |
| 自動ジョブの失敗 | その場で流れて終わり | 日記に日付つきで積み上がる |
| 「前にも言ったよね」 | 毎回言い直し | 回数まで数えられる |
※ 9/7 時点で1件だったのは、6〜8月に書いていた26日分がバックアップの誤りで消えていたためです(下の実例3)。memory 側の増加には、日記のほかに前回の記事で入れた Discord の生ログや dreaming の出力も含まれます。内訳は後で書きます。
以下、実際にあったことを順に書きます。
1. 前に決めたことを、翌日の別の会話でも覚えている
ある問い合わせの返信を毎朝見張る定期ジョブがあり、しばらく失敗が続いていました。ある日ユーザーと相談して「この失敗は以後、チャンネルには流さない」と決めました。
この決定は日記に書かれていたので、翌日以降のおぷーは毎朝同じ失敗に当たっても、チャンネルには流さずに日記にだけ書いていました。前に決めたことを守った、という意味ではうまく働いています。
ただし、これには裏があります(「デメリット」の節で書きます)。
もっと身近な例もあります。記事を頼んでいたとき、ユーザーから「別の記事なら別のスレッドで頼んでほしい」と言われました。おぷーはこれを記憶の目次に書き足し、そのあとの依頼では毎回、最初から新しいスレッドで頼むようになりました(この約束がどのファイルから読まれているかは、後の「長期記憶に上がらない」の節で書きます)。

実際のやり取りを再現。名前は伏せています。C-lord は記事を書く作業用のエージェントです。
2. チャンネルをまたいで話がつながる
うちでは相談の種類ごとに Discord のチャンネルを分けています。OpenClaw には、別の会話の内容を思い出す Remember across conversations という機能がありますが、これは個人の DM どうしのための仕組みで、グループやチャンネルの会話は対象外です2。
つまり、チャンネルAで話したことは、チャンネルBの会話からは直接見えません。日記はそこをつなぐ役になります。夜の日記ジョブがすべてのチャンネルの出来事を1つのファイルにまとめるので、翌日どのチャンネルで聞かれても、日記を検索すれば引けるようになります。
作り例で書くとこういう流れです。
[月曜・#家の用事] 「来月の旅行、宿は2泊で探して」
[月曜・22:00 日記] - #家の用事: 来月の旅行の宿探し。2泊で、と指定あり。
[水曜・#雑談] 「そういえば旅行の件どうなった?」
→ 日記を検索 → 「2泊の条件で探す話でしたね」
3. 自分の不具合を、日記が見つけた
毎晩の日記を始めて6日目の日記に、おぷー自身が大きな不具合を書いていました。それまでの晩に書いたはずの日記が、1本も残っていなかったのです。
調べると、原因はワークスペースを毎晩バックアップするスクリプトでした。別の場所のメモを memory/ に同期する処理が rsync --delete で書かれていて、しかも同期元のパスが間違っていました。結果として、8月27日から毎晩3時に memory/ が丸ごと別の中身で上書きされていました。6月から書いていた26日分のメモも、日記ジョブを始めた最初の5日分(9/8〜9/12)も、このせいで消えています(6〜8月の分は git の履歴には残っていました)。前回の記事で「日記は1件だけ」と書いた1台がおぷーで、実は書いても消えていたのでした。
被害は日記だけではありませんでした。定期ジョブの「どこまで読んだか」の記録も memory/ に置いていたので、毎晩それが消え、1か月以上前のメールを新着として投稿し直すことが起きていました。
日記に「今日回った自動処理」を書かせていたので、同じおかしなことが毎日並んで見えるようになり、原因にたどり着けました。日記を書く習慣がなければ、気づくのはもっと後だったと思います。
rsync --delete の同期先に、ほかの処理も書き込むディレクトリを指定してはいけません。同期先は専用のサブディレクトリに分けます。うちでは同期先を memory/ の下の専用フォルダに移して直しました。
4. 「前にも言ったよね」を数えられる
おぷーは返事が長くなりがちで、「短くして」と何度も言われていました。そこで毎晩、その日の返信の長さを集計して日記に追記するジョブを足しました。
直近5日分の数字です。
| 日 | おぷーの発言数 | 中央値 | 600字超えの割合 | ユーザーの発言に対する長さ |
|---|---|---|---|---|
| 1日目 | 76 | 686字 | 70% | 14.3倍 |
| 2日目 | 35 | 292字 | 31% | 9.9倍 |
| 3日目 | 5 | 129字 | 0% | 5.7倍 |
| 4日目 | 13 | 256字 | 0% | 9.1倍 |
| 5日目 | 57 | 404字 | 19% | 12.6倍 |
数字が日記に残るようになってから、600字を超える返事の割合は下がりました。ただ、5日目にまた増えていて、一度下がったら終わりではありません。集計には「『短くして』は17日間で7回言われている」という一文も入れていて、指摘の回数そのものが記録として残るようになりました。
5. 「前に確かめた」と「前に思い出した」を区別できる
おぷーの行動ルール(AGENTS.md)には、次のような決まりを入れています。
- 一度確認したことは、その会話の中では確定事項として扱う。(数ターン後にまた疑い直さない)
- ただし「確定」「裏取りした」と言ってよいのは、この会話の中で実際に確かめた主張だけ。記憶頼りの話は「未確認だけど」と分かる言い方をする
この区別は日記と相性が良いです。日記に書いてあることは「前にそうだった」という記録で、今もそうだとは限りません。昔、12日前の記憶のまま、あるリポジトリの設定を逆に言い切ってしまったことがあり、それ以来「日記やメモから思い出したことは、確かめられるなら確かめてから言う」を教訓メモに残しています。
デメリット・まだうまくいっていないこと
良いことばかりではありません。むしろこちらの方が、これから試す人には役に立つと思います。
一覧
| 困りごと | うちで起きたこと | いまの対処 |
|---|---|---|
| 決めたことが効きすぎる | 「失敗は流さない」を守り続け、8日間失敗が続いていたのにチャンネルからは見えなかった | 未対策(決定に「いつまで」「何が起きたら見直すか」も書かせたい) |
| 書いたメモが足りない | 「その有料プランはもう契約済み」と言ったが、メモにあったのは値段だけだった | 思い出した内容は「未確認」として扱う |
| 書いてあっても引かれない | 自分で書いた手順メモを調べずに、ユーザーに許可を求めた | 「調べれば分かることは先に自分で調べる」をルールに追加 |
| 検索で別のものが上に来る | 日記より dreaming の出力の方が上位に出る | 未対策(後述) |
| 日記が抜ける日がある | モデルの認証エラーで1晩失敗し、その日だけ日記が無い | 未対策(再実行していない) |
| 長期記憶に上がらない | dreaming は18晩動いたが、長期記憶への昇格は0件 | 様子見 |
| 何でも書き残る | 家族・お金・取引先の話もそのまま日記に入る | 公開する場には出さない。共有チャンネルでは長期記憶を読まない |
| コスト | 日記ジョブは毎晩1〜7分、モデルを1回まるごと使う | 許容している |
以下、いくつか補足します。
決めたことが効きすぎる
「前に決めたことを覚えている」の裏返しです。先ほどの「この失敗は以後流さない」という決定を、おぷーは律儀に守りました。そのあいだ監視ジョブは8日間連続で失敗していて、原因の見立ても間違っていました。日記にはちゃんと毎日書かれていたのですが、ユーザーは日記を毎日読むわけではないので、気づくのが遅れました。
日記に残る決定には期限がありません。「いつまで有効か」「どうなったら見直すか」を一緒に書かないと、古い決定がずっと効き続けます。OpenClaw の公式ドキュメントにも、行動に関わるメモには「いつ適用するか」「いつ期限切れになるか」を書くように、という節があります3。
書いたメモが足りない・古い
日記は「そのとき分かっていたこと」しか書かれていません。ある買い物の相談で、おぷーは「そのプランはもう持っていますよね」と言いましたが、あとで見直すと、メモにあったのは値段を調べたことだけで、買ったことは書かれていませんでした。
記憶から思い出した話は、書かれた時点の情報で、しかも抜けがあるかもしれません。「確かめたこと」と「思い出したこと」を区別するルールは、このために入れています。
書いてあっても、引かれない・引けない
2種類あります。
1つ目は、検索しないこと。 あるツールが権限で弾かれたとき、おぷーはユーザーに「設定を開けてほしい」と頼みました。実際には、代わりに使える道具が手元にあり、しかもその使い方を自分でメモに書いていました。メモがあっても、「探そう」と思わなければ使われません。いまは「権限が無い、は結論ではなく途中経過。まず手元の代替手段を調べる」をルールに書いています。
2つ目は、検索しても上に来ないこと。 索引の memory 側の中身を数えてみると、こうなっていました。
日記は全体の4.5%しかありません。 日記を読んで dreaming が書き出したレポートの方が、日記の4.6倍あります。実際に「監視ジョブが失敗し続けている」で検索すると、いちばん上に来たのは日記ではなく dreaming のレポート(スコア 0.69)で、元の日記は上位5件に入りませんでした。レポートは日記を要約・引用しているので内容は近いのですが、日付や前後の文脈は日記の方が詳しいです。
日記が抜ける日がある
日記ジョブの実行記録を見ると、22回中21回は成功していて、1回だけモデル側の認証エラーで6秒で失敗していました。その日の日記はありません。指示に「空の日も必ず1行書く」と書いても、ジョブ自体が動かなければ書かれません。失敗したら次の実行で前日分も書く、という仕組みはまだ入れていません。
長期記憶に上がらない
dreaming は、毎晩3時に日記を読み直して、長く残すべきものを長期記憶(MEMORY.md)に上げる仕組みです。ただ、上げるには「何度も思い出された」「いろいろな質問で出てきた」などの条件をすべて満たす必要があります4。
うちでは18晩のあいだ、候補が0〜1件、昇格は0件でした。途中の段階(light)の候補には、日常のちょっとした雑談の一文も並んでいて、「これは長く残す話ではないな」というものも多いです。自動で長期記憶が育つ、というところまではまだ来ていません。
もう1つ、うちで引っかかったのは長期記憶の目次(MEMORY.md)の置き場所です。
- OpenClaw が長期記憶として会話の最初に読み込むのは、ワークスペース直下の
MEMORY.mdだけです5。おぷーのワークスペースの直下にはこのファイルが無く、1つ下のmemory/MEMORY.mdに古い目次があるだけでした。こちらは6月で更新が止まっていて、検索で引かれたときにしか使われません - 一方で、おぷーは中で Claude Code が動いています。Claude Code には自前の自動メモリがあり、その目次(
~/.claude/projects/<workspace>/memory/MEMORY.md)は会話の最初に毎回読み込まれます(先頭200行か25KBまで)6。9/30 に目次へ足した約束も、次の会話からちゃんと読めていました
このことに気づいたときの、ユーザーとおぷーのやり取りです。
つまり、OpenClaw の仕組みの長期記憶の目次は使われていないけれど、Claude Code の自動メモリが代わりに毎回読まれている、という状態です。前の円グラフの「Claude Code の自動メモリの写し」は、この自動メモリを毎晩ワークスペースに写したものです(3つ目の実例で書いたバックアップのスクリプトが、これを写す処理でした)。
なお、ワークスペースは人格ごとに別で、共通ではありません。ほかの人格では、この状態も違います。
何でも書き残る
日記ジョブには「名前・パス・URL・判断を具体的に残す」と指示しています。後で引けるようにするためですが、そのぶん、家族の予定、健康のこと、お金の話、取引先とのやり取りも、そのまま日記に入ります。
うちの AGENTS.md の決まりとして、長期記憶は本人との会話でだけ読み、ほかの人がいる場(Discord の共有チャンネルなど)では読まないようにしています。この記事を書くにあたっても、日記の中身は一切引用していません。日記をどこかに共有・公開するなら、この点はいちばん気を使うところです。
やり方(要点だけ)
ここからは短く書きます。バージョンは OpenClaw 2026.9.6 です。
仕組み
データの流れは冒頭の「全体像」の図のとおりです。ファイルの役割だけ補足します。
OpenClaw の記憶は、ワークスペースに置いた普通の Markdown ファイルです7。
-
AGENTS.mdや直下のMEMORY.mdは、新しい会話の最初に毎回読み込まれます(うちの直下にはMEMORY.mdが無く、代わりに Claude Code の自動メモリの目次が毎回読まれています) -
memory/YYYY-MM-DD.mdは日記の置き場所として決まっていて、索引に入り、memory_searchで引けます。毎回は読み込まれません
1. 日記ジョブを作る
OpenClaw の cron で、毎晩22時に上の指示を渡すジョブを1本作っています。ポイントは次の3つです。
- 独立したセッションで動かす(日中の会話の続きにしない)
-
チャットには投稿させない(
deliveryをnoneに。毎晩「日記を書きました」と流れてくると邪魔です) - 何もない日も1行書かせる(日付が抜けると「その日は何もなかったのか、書き損ねたのか」が区別できません)
2. 検索をローカルで動かす
埋め込みはローカルの llama.cpp で作っています。公式の llama.cpp プラグインを入れて1、provider を local にします。
openclaw plugins install @openclaw/llama-cpp-provider
openclaw config get memory
{
"search": {
"enabled": true,
"provider": "local",
"sources": ["memory", "sessions"],
"rememberAcrossConversations": true
}
}
うちでは埋め込みモデルに embeddinggemma-300m(768次元)が入りました。API キーは要らず、索引を作るために日記の中身を外部の埋め込み API に送らずに済みます(返事や日記を書くモデルは別で、そちらはクラウドです)。日記には人に見せられない話が多いので、埋め込みをローカルで作れることが、この仕組みを続けられている大きな理由です。
sources に sessions を入れると、会話の記録そのものも索引に入ります。日記と会話ログのどちらを厚くするかは、前回の記事に書きました。
索引の状態は openclaw memory status で見られます。
Provider: local (requested: local)
Sources: memory, sessions
By source:
memory · 166/166 files · 3284 chunks
sessions · 598/609 files · 4607 chunks
Dreaming: light=0 3 * * * · ... · deep=0 3 * * * · minScore=0.75 · minRecallCount=3 · minUniqueQueries=3 ...
3. dreaming はそのまま
dreaming は memory-core プラグインで既定で有効になっていて、毎晩3時のジョブも自動で作られます8。うちでは設定を変えていません。light → REM → deep の3段階で動き、長期記憶(MEMORY.md)に書き込むのは deep だけです。途中経過は memory/dreaming/{light,rem,deep}/ と DREAMS.md に残るので、何が候補になったかを人が見て確かめられます。
4. ルールを書く
仕組みだけでは使われないので、AGENTS.md に次のようなルールを書いています。
- 「覚えておいて」と言われたら、頭の中ではなくファイルに書く
- 失敗したら、同じことを繰り返さないように書き残す
- 長期記憶は本人との会話でだけ読む
- 一度確認したことはその会話の中では確定として扱う。記憶から思い出しただけのことは「未確認」と分かる言い方をする
- 調べれば分かることは、聞く前に自分で調べる(自分のメモも含めて)
まとめ
日記を書かせるのは簡単で、cron 1本と指示文だけで始められます。効いたのは「覚えている」ことそのものより、毎日同じ形で記録が積み上がるので、おかしなことに気づけるようになったことでした。一方で、書いたものが使われるかどうかは、検索の仕組みとルールの書き方しだいで、そこはまだ手探りです。
参考リンク
- OpenClaw
- OpenClaw: Memory overview
- OpenClaw: Memory search
- OpenClaw: Dreaming
- OpenClaw: Active memory — Remember across conversations
- OpenClaw: Agent(Bootstrap files)
- OpenClaw: Llama Cpp plugin reference
- OpenClaw: Scheduled tasks(cron)
- Claude Code: How Claude remembers your project(自動メモリ)
- 拙記事: AIエージェントの意味検索が賢くならない理由は、仕組みではなく素材だった
-
出典: OpenClaw: Memory search。「For local embeddings with no API key, install and configure the official llama.cpp provider, then set
provider: "local"」。同ページの対応プロバイダー表では、Local を「Managed llama.cpp GGUF, ~0.3 GB」としています。プラグインについては Llama Cpp plugin reference。 ↩ ↩2 -
出典: OpenClaw: Enabling active memory(2026.9.6 同梱ドキュメントで確認)。「private direct and persistent explicit UI conversations can recall one another」「groups and channels are neither recall sources nor recall destinations」。 ↩
-
出典: OpenClaw: Memory overview の Action-sensitive memories の節。行動に影響するメモには「when or under what condition it applies」「when it expires, or what unlocks action」を書くよう勧めています。また「Memory can preserve approval context, but it does not enforce policy.」とも書かれています。 ↩
-
出典: OpenClaw: Dreaming の Deep phase の説明。「Ranks candidates with weighted scoring and threshold gates (
minScore,minRecallCount,minUniqueQueriesmust all pass).」。うちの設定値はopenclaw memory statusの表示でminScore=0.75 · minRecallCount=3 · minUniqueQueries=3でした。 ↩ -
出典: OpenClaw: Agent の Bootstrap files の節。「On the first turn of a new session, OpenClaw injects the contents of these files into the system prompt's Project Context.
MEMORY.mdis only injected when it exists at the workspace root.」 ↩ -
出典: Claude Code: How Claude remembers your project。「The first 200 lines of
MEMORY.md, or the first 25KB, whichever comes first, are loaded at the start of every conversation.」。 ↩ -
出典: OpenClaw: Memory overview。「OpenClaw remembers things by writing plain Markdown files in your agent's workspace」「The model only remembers what gets saved to disk; there is no hidden state.」。日記ファイルについては「These are indexed for
memory_searchandmemory_get, but are not injected into the bootstrap prompt on every turn.」。 ↩ -
出典: OpenClaw: Dreaming。「Dreaming is enabled by default.」「When enabled,
memory-coreauto-manages one cron job for a full dreaming sweep」。既定の実行時刻は0 3 * * *です。 ↩







