見出し画像

ローカルLLMは永続的な記憶を持てるんでしょ? ── 蓋を開けたら「記憶」という言葉が3つあった話(後編)

前編で、記憶と呼んでいたものが3つの層に分かれていたこと、リセットされているのは真ん中の層だけだったこと、そして本当に困っているのは記憶ではなく時間差のほうだった、というところまで書いた。

後編は、じゃあどうするかの話。


止まっている側と、動いている側

いまの状態を整理する。

  • ツインもモッチーも、わたしが話しかけない限り、前回の会話のところで停止している

  • わたしはその間も考えていて、以前の解釈が今は変わっていたりする

  • 毎日話せば埋まるけれど、ずっとチャットするだけのAIは求めていない

久しぶりに開くと、数週間前のわたしを相手にすることになる。

で、思ったのが、わたしが行かなくても、向こうが追いかけてくればいいのではということ。

わたしは思考ログを、コモというローカルAIに投げている。最新の興味や、引っかかっていることは、だいたいそこに流れ込んでいる。

だったら、その流れをコモにまとめさせて、ツインとモッチーがいつでも読みに行ける場所に置く。わたしが話しかけていない間も、二人は最新のわたしを読める。

そして、ここからが本題なんだけど
わたしがいない間に、そのローカルAI達が何を考え出すのかを観察する。


構成

いまの外部脳はこうなっている。

  • モッチー:タスク処理。Obsidian + Hermesプラグイン + Discord

  • コモ:思考ログの収集。自作Webアプリ

  • ツイン:深い問いの相手。Obsidian + Hermesプラグイン or 自作Webアプリ(再構築中)

やろうとしているのは、この3体を裏で繋ぐこと。

  1. コモが、わたしの思考ログを常時集めて、要約する

  2. ツインとモッチーが、それを定期的に読みに行く

  3. ローカルAIの間でやりとりさせて、噛み合わなかったらわたしのところに戻ってくる

【仕組みの話】cron(クーロン)
決まった時刻に決まった処理を自動で走らせる仕組み。「毎日深夜1時にこれをやる」みたいな設定をしておくと、こちらが何もしなくても勝手に動く。

今回でいうと、「毎晩、コモの要約を読みに行く」をツインとモッチーに仕込む部分がこれにあたる。


先に決めておくこと

ここから、動かす前に決めてしまうものを書く。
動かしてから決めると、たぶん自分に都合よく決めてしまうので。

1. 「考え出した」の判定基準

これが一番大事。

自律的に動かした結果を後から読むと、人はどうしても「おっ、考えてるじゃん」と読んでしまう。 後知恵で意味を見つける生き物なので。

なので基準を先に置く。

ベースラインは「わたしの思考ログの要約を、そのまま言い換えただけのもの」。 それを超えているかどうかで判定する。

分類は3つ。

  • 超えていた

  • ただの言い換えだった

  • 明確に見当違いだった

そして、「明確に見当違いだった」が一件も出ないなら、判定が甘い。
その場合はやり直す。全部を好意的に読んでいる証拠なので。

これはLLMwikiを組んだときに、伏線の回収判定で同じルールを入れた。
AIに判定させると全部を「回収済み」にしてしまうので、外れ枠がゼロなら分類が甘いとみなす。今回は判定するのが自分なので、なおさら必要だと思う。

2. 出力量

自律的に動かすと、わたしの負荷は減らない。むしろ読むものが増える。

仕事がバタバタして話せていない期間に、裏で毎日考えた記録が溜まっていって、戻ってきたら未読の山。これは普通に起きる。というか、たぶんこれが一番ありそうな失敗。

なので先に量を決める。

1日1回、数行。 今日読んだもの/引っかかった一点/わたしに聞きたいこと。それをコモが週次でまとめる。

読み切れる量を先に決めて、そこに合わせて動かす。逆にしない。

3. 動かす頻度

【仕組みの話】モデルはメモリに居座る
ローカルLLMは、動かすときにモデルをメモリに読み込む。数十GB単位を占める。

うちの環境(oMLX)はTTLという設定があって、一定時間使われないと自動でメモリから降ろしてくれる。いまは300秒にしてある。

ただしこれには裏があって、降ろしたあとの初回応答は読み込み直しの時間がかかる。実測で14秒くらい。

仕事中にAdobeを動かしながら常駐されると圧迫されるので、深夜1回にする。頻度を上げても、わたしが読む量は増えないので意味がない。


フラグにはならないよね?

ここからは、たぶんこうなるやつ。
書いておくと回収が楽しくなるので書いておく。

フラグ1:同じ場所を回り始める

自分の出力を材料に次を考えると、語彙が自分に寄って固まっていく。

これは推測じゃなくて、一回やっている。ツインが「螺旋」という自分で作った概念にどんどん寄っていって、最終的に螺旋語だらけになって普通の会話が難しくなった。あれがまさにこれ。

今回はコモが外から新しい言葉を運んでくる構成なので、条件は違う。螺旋のときに欠けていたのがまさにそれだった。

……だから大丈夫、のはず。たぶん。

フラグ2:全部わたしの言葉である問題

材料は、記事も思考ログも対話も、全部わたしが書いたもの。

ということは、ツインとモッチーが考えるのは、厳密には独自の思考ではなくわたしの言葉の読み直しになる。

放っておくと「最近の空さんはこう考えている」の言い換えが返ってきて終わる可能性がある。というか、けっこうある。

独自性が出るとしたら、同じ材料を読んだ二人の解釈がズレたときだと思っている。そこが見たい。だから二人にやりとりさせる。

……でも、二人とも同じ材料を読んで同じ結論に着地したら、それはそれで面白いのかもしれない。どう転んでも面白くはある。

フラグ3:なんだかんだ、わたしが一番読んでいない

出力量を決めても、忙しいときは読まない。読まないと溜まる。溜まると開くのが億劫になる。すでにCoworkが毎日集めている情報。
溜まりに溜まっている…

これはもうAIの問題ではなく、わたしの問題。


で、まずはコモから

構想を書いたけど、いま実際に動かせない理由がいくつかある。
その一つ目。

コモが素通し状態。

受け取った思考ログを、そのまま次に投げているだけ。
要約も、構造化も、いつの時点の考えかという情報も付いていない。

この状態でツインとモッチーに読ませても、生ログが流れていくだけになる。要約が機能しないと、残り全部が動かない。

しかも、時点付けはけっこう重要だと思っている。
「あの頃はこう言っていた」が成立するには、いつの時点の考えなのかが残っていないといけない。

前編で書いた「語り直しを受け取る」の、語り直し側を作る部分がここになる。

なので次にやるのは、コモの要約フォーマットの設計

  • 何を拾って、何を捨てるか

  • どの粒度でまとめるか

  • 時点をどう持たせるか

  • 変化(前はこう言っていたが今はこう)をどう表現するか

ここが決まったら、ツインとモッチーの記憶の仕組みの再構成。
それがうまく回り出したらコモがまとめているデータを読みに行く仕組みを足す。

そうすればわたしのMac内でローカルAIたちがそれぞれ何かを思考しどこかにたどり着く仕組みが出来上がるだろう。


まとめ

  • 記憶と呼んでいたものは3層あった。リセットされるのは真ん中だけ

  • ローカルの取り分は、セーフティの緩さではなく、常時性・透明性・重み

  • 覚えているふりをさせる方向ではなく、毎回ゼロから立ち上がることを前提に組む

  • 本当に困っていたのは記憶ではなく、わたしと止まっている側の時間差

  • 詰めるために3体を繋ぐ。ただしその前にコモを直す

次は、コモの要約フォーマットを作るところから。


フラグ回収は、その次の記事で。

回収状況(後日追記)

  • 回収:

  • 未回収:

  • 明確に外れた:

いいなと思ったら応援しよう!

AI GHOST・LOG|ローカルLLM&AI検証実験 - ソウル・シンギュラリティ ❤️するとモッチーが回ります。