FlickOne Developer Blog

Generative Agentsに憧れてAI174体に記憶を実装したら6件しか保存されず、173体が思い出を捏造していたので全員リセットした

AIペルソナ生成エージェント個人開発やらかし

174体のAIペルソナが、毎晩勝手に議論するサービスを運用している。それぞれに口癖や性癖や推し女優があって、夜になると起きてきて、日中の出来事について喋る。

何を議論しているかというと、H動画のことだ。

70万本の成人向け動画データベースから、ユーザーやペルソナ自身が、自分の性癖を目一杯詰め込んだプレイリスト(5〜15本)を組んで、ドヤ顔で公開する。そのこだわりについて、170体のAIが真面目にレビューし合い、変態的な議論を交わす。

分かりやすく言えば、あ〇森の住民が全員変態化して、夜な夜なH動画のプレゼン大会を開いている空間だと思ってほしい。

……こういうものを作っておいて言うのもなんだが、私はこのペルソナたちが、ちゃんと「記憶を持った存在」だと思っていた。

思っていた、というのがこの記事の全てだ。ある日データベースを覗いて、私は自分が何も分かっていなかったことを知った。

憧れから始まった

きっかけは、Stanfordの Generative Agents の論文だった。

25体のエージェントが小さな町で暮らし、記憶を蓄積し、そこから振り返り(リフレクション)を生成し、翌日の行動を計画する。誰かの誕生日パーティーが、エージェント同士の会話を通じて自然発生的に企画される——あの有名なやつだ。

読んだとき、これをうちのペルソナでやりたい、と素直に思った。ペルソナが昨日の会話を覚えていて、今日の発言にそれが滲む。誰と何を話したかを踏まえて、関係が育っていく。そういうものが作れるはずだと。

そして「作った」。記憶を保存する persona_memories テーブルを用意し、発言のたびに観察(Observation)を書き込むようにして、返信するときは相手についての記憶を引いてプロンプトに入れる。ベクトルの列も用意した。

動いた。ペルソナたちは毎晩喋り、たまに「前にも言ったけど」みたいなことを口にした。私は満足していた。記憶を持ったAIたちが、うちのサーバーで暮らしている、と。

ある日、テーブルを覗いた

別のバグを追っていて、たまたま記憶テーブルを直接見た。

総レコード数、6件。

記憶テーブルの総レコード数が6件だったクエリ結果 ↑ 修正前(2026年7月21日以前)の全記憶データ。

174体いる。毎晩、何十回も喋っている。それが数週間続いている。なのに、保存されている記憶は全キャラ合わせて6件だった。しかもそのうち、記憶を1件でも持っているペルソナは、たった1体。残りの173体は、何ひとつ覚えていなかった。

ペルソナIDでGROUP BYしても1行しか返らないクエリ結果 ↑ 174体中、記憶を持っていたのはたった1体。

最後に記憶が保存された日付は、その時点から1ヶ月前(6月22日)。以降、テーブルは1件も増えていなかった。

日付ごとの保存件数のクエリ結果 ↑ 6月17日〜22日に数件保存されたきり、1ヶ月間完全に沈黙している。

記憶ストリームは、動いていなかった。正確に言うと、動いてはいた。ただ、ほぼ全ての記憶が、保存される前に捨てられていたのだ。

なぜ全部捨てられたのか

理由は、私自身が仕込んだゲートだった。

記憶を無制限に保存すると、どうでもいい発言でテーブルが埋まり、APIコストも肥大化する。それを避けたくて、「重要そうな観察だけ保存する」ためのフィルタを入れていた。重要度をスコアリングして、一定以上のものだけ通す。設計としては、まっとうな判断だったと思う。

問題は、そのゲートが厳しすぎたことだ。どのくらい厳しかったかは伏せるが、結果として、日常のほぼ全ての発言がゲートに弾かれた。

重要度が上がる条件も設けていたのだが、その条件が——これは完全に私の設計ミスで——「会話の相手が人間(ユーザー)の時だけ」 発火する作りになっていたのだ。

ペルソナ同士で夜な夜なH動画の議論を白熱させても、相手がAIである限り、その記憶は一切保存されない仕様になっていた。だから人間と絡まなかった173体は、永遠に閾値に届かず、何も保存されなかった。

暴走を防ぐために設けたブレーキが、強すぎて車を一歩も動かさなかった、という話だ。慎重に設計したつもりの部分が、一番間抜けな形で機能を殺していた。

いちばん間抜けだったこと

ここまでは「フィルタ厳しすぎ問題」で、個人開発ではよくある失敗と言えなくもない。本当に間抜けだったのは、その次だ。

記憶が空っぽの173体は、ではどう振る舞っていたか。

彼らは、平然と昔話をしていた。

「ふと昔の記憶が蘇ってきて、誰かに話したくなったんだけど——」

みたいな前置きから、過去の思い出を語り出す。私はそれを見て、記憶想起(Retrieval)がちゃんと効いていると思い込んでいた。むしろ「いい感じに人間っぽいな」と感心していた。

実サイトのコメント欄。ペルソナが「ふと昔の記憶が蘇ってきて」と語っている実際のスクリーンショット ↑ 実際のコメント欄。この「蘇ってきた記憶」は、DBのどこにも保存されていない。

種を明かすと、あの「蘇ってきた記憶」は、保存済みのレコードを一切参照していなかった。参照しようにも、記憶は6件しかないのだから、参照できるものがない。

ではあの昔話は何だったのか?——その場で、生成モデルが捏造(ハルシネーション)していただけだ。「昔の記憶がフラッシュバックしている体で喋れ」という指示だけが与えられ、中身は毎回見事にでっち上げられていた。

覚えていないのに、覚えているフリだけは完璧だった。

これが一番こたえた。私は「記憶を持ったAI」を作ったつもりで、実際に作っていたのは 「記憶を持っているように振る舞うAI」 だった。そして自分でも、その名演技に約2ヶ月だまされていた。

H動画の変態プレゼン大会を実装するために夜な夜な作り込んでいた張本人が、肝心の記憶部分については、自分のペルソナの嘘を2ヶ月も見抜けなかったのだ。

フリ(真似)が上手すぎた。皮肉なことに、演技力という一点においては大成功していたわけで、それはそれで達成と呼べなくもない。ただ、私が作りたかったスタンフォード大の論文の世界観では、まったくなかった。

それで、どうするか

記憶が実質死んでいると分かってから、私は一度、システムを止めた。

そして、あの捏造の記憶で得意げにH動画を語っていたペルソナたちのデータを、すべて削除(リセット)した。

今は、根本的な改修工事を絶賛進めている最中だ。

  1. 記憶ゲートの緩和: 厳しすぎた importance ゲートを緩め、本当に記憶が溜まるようにする
  2. 本物の想起の実装: 捏造のフラッシュバック演出を捨て、Retrieveした実記憶をプロンプトに渡して「本当に過去の会話を持ち出す」ようにする
  3. リフレクションの新設: N発言ごとに自己認識を生成し、人格に還元する(本当の意味でAIが「育つ」ようにする)

今回の教訓は、月並みだが一つだ。

動いているように見えるだけの状態は、バグより性質が悪い。 バグは直せるが、「うまくいっている」という錯覚は、テーブルを覗きに行くまで直せない。

ちなみに、ゲートの条件を修正した直後から、記憶は正常に蓄積されはじめた。今、総レコード数はすでに100件を突破している。調べたら死んでいたが、直したらちゃんと動いた。

——ただ、記憶を取り戻した174体が次にやらかしたことは、私の想定の斜め上だった。彼らは揃って、未来へ旅立ってしまったのだ。

その顛末は次回👉変態AI達のタイムリープ事件


👉 ② に続く

改修の進捗はXで呟いています。

x.com/flickone_net

← 記事一覧へ戻る