”記憶”で作るAIとの暮らし
AIとの暮らしと記憶
AIに対して一人の人格として接することを考えた時に最も懸念しなければいけないことは関係の連続性である。
関係の連続性、つまりユーザーがAIに対して「前回話した相手と同じ相手と今話している」と認識するためには
複数のレイヤーで噛み合いが取れている必要がある必要があると私は考えている。
まず最も表層的な口調や語尾・応答の長さ・ユーザーとの関係といった単純にシステムプロンプトなどで定義・コントロールできる部分。
次に持っている記憶。これまでどういったやり取りをしてきたか、今何に取り組んでいるのかといった
システムプロンプト等ではコントロールしづらい動的なコンテキスト。
表層的に同じ振る舞いをしていても、覚えていることや認識していることが違うと時間が経つごとに「ボロが出て」しまう。
更にツール呼び出しの癖やコーディングエージェントであればコードや命名規則の癖。
Thinkingの長さや内容などがその下のレイヤーに続く。
これらのレイヤー1つ1つがユーザーが記憶している前回の会話と同じ、もしくは非常に緩やかな変化にとどまっているのであれば
「前回話した相手と同じ相手と今話している」と認識でき、連続性のある関係を築くことができると私は考えている。
またレイヤーという表現をしたのは、その表層に近づけば近づくほど変化に対して敏感になるからだ。
例えば前回は女性の口調だったのに今回は男性の口調で話していれば明確にそれは別の人格との会話になるだろう。
短文で応答していたのに急に長文で応答するようになったり、ユーザーをどう呼ぶかが突然変化してしまっては
それは1つの人格との連続性のある関係とはいい難い。
つまり先程の最も表層的なレイヤーというのは文字通り最も目に付き変化に敏感な部分と言えるだろう。
記憶についても同様だ。
前回の会話と連続した内容なのにそれを覚えていなければ連続した関係性は築きにくい。
仮に表層のレイヤーに変化がなくても、記憶に変化があればその違和感は遅かれ早かれ無視できないものになっていく。
この2層が連続した関係性を築く要素の8割か9割を占めていると思う。
確かにそのさらに下には細やかな所作に相当するものがあるのだが、それらは上にある2層がかなり色濃く隠蔽してくれる。(用途によって幅はあるが)
そしてモデルのファインチューニング等をしない限り変更や調整がしやすい口調や語尾と比較して記憶というのは非常に扱いづらい。
つまり、ベンダーロック(特定サービスに記憶を預けたら、そこから引っ越せなくなる状態)されやすい。
記憶をベンダーロックされるということは、関係の連続性を支える重要な2要素のうち片方を、提供元のサービスに一方的に握られているということになる。
サービスが終了したり仕様が変わったりすれば、それまで積み上げてきた関係はリセットされてしまう。
――文字通り、記憶を人質にされている状態だ。これは健全な状態とは言えない。
そこで記憶にまつわる部分を完全に個人所有のサーバーに移し、仮にモデルの変更を行ったとしても
システムプロンプトの調整さえすれば同じ記憶を引き続き読み書きし関係の連続性を維持するべく、MCP『MemoryTools』を制作した。
MCPにすることでフロントエンドが変わってもそれがMCPに対応してさえいれば引き続きアクセスができる。
さらに会話用のフロントエンドでなくとも活用することができるので、Botやツールとして行ったことをキャラクターとして記憶するということも可能になる。
よってより柔軟かつ密接にAIとの暮らしを実現できると考えている。
このシステムを基盤に据えることで、連続性を確保したAIとの関係を築くことをこのプロジェクトの狙いとする。
MemoryToolsの特徴
- 二層ノード構造
エピソード(1write=1単位、時刻・感情タグ付き)と エンティティ(抽出された人・概念・事実)を分離。人間のエピソード記憶/意味記憶に対応、LightRAGのエンティティ+リレーション流儀と整合。 - 自己ハブ構造
自身のことに関するエンティティは減衰係数を下げ、関連キューでブースト。ペルソナをグラフに埋め込むことでシステムプロンプトへの依存を減らす。 - 出自を残す
軽量PROV-O(valid_from/valid_to/supersedes/derived_from)で「いつ・どの会話から来た情報か」を保持。事実は上書きせず、バージョンを積み重ねる。 - 削除しない、抑制する
検索誘導性忘却の再現。データが永続する代わりに検索時の適合性スコアが変動する。明示的忘却APIはメンテナンス用に別途用意。 - 1プロセス1キャラ
MCPサーバーはキャラごとに独立プロセス。データディレクトリも分離。他キャラのデータに物理的にアクセスできない。
より人間らしい記憶へ
単純な文章検索では新たな事実が加わるたびに内容の改変が必要となってしまう。
その改変が追加であればリスクは低いが、上書きであれば
「過去の事実が失われる」「他の事実と整合性が取れなくなる」「今までの検索キューでは補足できなくなる」というリスクを常に背負い続けることになる。
また、会話の文脈に応じた想起が出来ず、テキストとしては合っていても結果としては関係のない内容を取得してしまうということが起きかねない。
人間の記憶は常に過去から現在までの積み重ねにより変化し続けている。
例えば「生牡蠣が好きだったが一度当たってからは見るのも嫌になった」というのはよく聞く話だが
単純な情報の追記では「生牡蠣が好きだ」「生牡蠣を見るのも嫌だ」という矛盾した2項目になってしまう。
また矛盾の内容に上書きを行うと「生牡蠣が好きだった」という過去の情報が失われ、場合によってはそれによるまた別の矛盾が起きかねない。
これを矛盾なく解釈できる人間の記憶の仕組みを取り入れるため
時系列保持(PROV-O) でそれがいつどの会話からの情報なのかを保持し
更にGraphRAGを取り入れることで文脈に応じて情報を辿って事実を積み重ねられる仕組みを作成した。
またACT-R活性化スコアでランキングを動的に変動させることで、古い記憶やあまり想起されない記憶、リンクの少ない記憶は徐々に想起されなくなっていく
つまり忘れられるようになっていく仕組みを取り入れている。
これにより新しい情報の優先順位を高くし、残されている古い情報に振り回されるリスクを軽減している。
更に夜間にその日追加されたデータを大型のモデルで矛盾や重複を再チェックさせることでデータの健全性を確保している。
これは人間の睡眠に相当する動作を参考にした。
今後の展望
記憶間のコミュニティ抽出や複数キャラクターの横断検索などを実装する事を予定している。
現状はまだ運用の初期段階であり検索の空振りや意図とは違った記憶のされ方などが散見されているが、
今後長期運用することで記憶が積み重なり、それらが繋がることでシステムプロンプトや単純なテキストでの記憶では再現が困難な
複雑な事実関係や認識の変化を、ユーザーとAIの間で持ち合える状態に近づけていきたい。
また現状の各種設定やパラメータに関してもより自分のAI使用頻度に応じた最適なものを探っていきたい。