Agentic OS 技術スタックを下から読む 第12回:エージェントの記憶 ―― 保存ではなく「なぜそうしたか」を残す
前回は、エージェントに手を動かさせるための実行環境を見た。
手を動かす環境の次にあるもの
前回は、エージェントに手を動かさせるための実行環境を見た。
外の世界に触れる以上、何でも自由に実行させるわけにはいかない。だから、実行できる場所を区切り、権限を絞り、壊れても戻せるようにする。運行時の一つ目の柱は、この隔離だった。
しかし、運行時にはもう一つの柱がある。
状態を持つことである。言い換えれば、記憶である。
エージェントは、一回の応答で終わるとは限らない。長く走る。途中で道具を使う。失敗する。やり直す。昨日の判断を、今日の判断に活かす。
記憶がなければ、毎回ゼロから始めることになる。前に試して失敗した方法を、また試す。前に効いた工夫を、思い出せない。見た目は落ち着いていても、内側では毎日記憶を失っている。
今回見るのは、この記憶である。
ただし、記憶を単なる保存場所として扱うと、すぐに行き詰まる。重要なのは、情報を多く残すことではない。あとから「なぜそうしたか」をたどれる形で残すことだ。
短期の記憶と長期の記憶
まず、記憶には大きく二種類ある。
一つは短期の記憶である。これは、いまの文脈の中にある記憶だ。直近のやり取り、途中で得た結果、いま解こうとしている問題の条件。こうしたものを、手元に置いたまま次の判断に使う。
これは、人間で言えば作業机の上に近い。いま必要な紙を広げておく。見ながら考える。すぐ使える。
だが、机の上は無限ではない。
会話が長くなる。道具の実行結果が増える。調査対象が広がる。すると、古い情報から押し出されていく。最初の前提や、途中で失敗した理由が、いまの文脈から消える。
そこで、長期の記憶が必要になる。
長期の記憶は、いまの文脈の外に置いておく記憶である。必要なときに取り出して、現在の判断に戻す。過去の作業、ユーザーの好み、うまくいった手順、避けるべき失敗。そうしたものを、あとから使えるようにしておく。
短期の記憶は、いま考えるためにある。
長期の記憶は、次に同じような場面へ来たとき、ゼロから考え直さないためにある。
ここまでは分かりやすい。問題は、その長期記憶をどう作るかである。
保存箱としての記憶
長期記憶のよくある作り方は、保存箱に近い。
出来事を記録する。文章を小さな単位に分ける。それぞれを、意味の近さを比べられる数値の形に変える。そして、あとで必要になったときに「いまの状況に似たもの」を探す。
一見、合理的に見える。
過去の情報を全部捨てるよりはよい。検索できる形で残しておけば、必要なものを取り出せそうに思える。実際、この方法で助かる場面も多い。
だが、これだけでは記憶として弱い。
理由は単純で、これは物置だからだ。
とりあえず放り込む。あとで探す。似たラベルの箱を開ける。運がよければ、必要なものが出てくる。運が悪ければ、少し似ているが本質的には違うものが出てくる。
しかも厄介なのは、失敗が静かに起きることだ。
検索が何も返さなければ、まだ分かりやすい。足りないと気づける。しかし、少しだけ関係のある情報が返ってきたとき、エージェントはそれを信じて先へ進むことがある。
古い判断。別の条件でだけ成り立つ手順。似ているが原因の違う失敗例。
そうしたものが混ざっても、エージェント自身はそれを「劣化した記憶」だと気づけないことがある。すると、記憶は助けになるどころか、判断を少しずつ曲げる。
ここで、記憶の難しさが見えてくる。
本当に難しいのは、検索の細部ではない。どう探すかより前に、何を、どんな形で書き込むかが難しい。
難しいのは検索ではなく記録である
記憶を考えるとき、つい取り出し方に目が向く。
どう探せばよいか。どの情報を上に出せばよいか。似ているものをどう測ればよいか。もちろん、それらも大事である。
しかし、エージェントの記憶でより根が深いのは、記録のほうだ。
なぜなら、因果は後からしか見えないことが多いからである。
ある作業が失敗したとする。記録には「時間切れで失敗した」と残る。数日後、別の場面で、手順を変えたら同じ種類の作業が成功したとする。そこには「やり方を変えて成功した」と残る。
この二つは、本来つながっている。
前の失敗があり、そこで限界が見えた。後の成功では、その限界を避ける方法が見つかった。つまり、失敗と成功は同じ因果の鎖の前半と後半である。
だが、失敗した瞬間には、まだ後半が存在しない。
その時点では、どの未来の出来事と結びつくのか分からない。あとから効く学びなのか、ただの一回限りの失敗なのかも分からない。
さらに、この二つは言葉として似ていない。
「時間切れで失敗した」と「手順を変えて成功した」は、表面だけ見れば別物である。似たもの検索では、互いを引き当てにくい。
しかし、人間が振り返れば分かる。これは関係がある。失敗の原因と、後の解決策が対応している。
つまり、つながりは見た目の類似ではなく、時間と構造の中にある。
ここが、記録の難しさの核心である。
記憶は、出来事の倉庫では足りない。出来事同士の関係を、あとからたどれるようにしなければならない。特に残すべきなのは、結果そのものではなく、なぜその行動を選んだのかという因果の手がかりである。
結果ではなく意図を残す
では、どうすればよいのか。
一つ目の手当ては、行動の瞬間に意図を残すことである。
道具を呼ぶ。検索する。ファイルを読む。コードを直す。外部の処理を実行する。その瞬間には、必ず何かを期待している。
何を確かめようとしたのか。どの仮説を検証しようとしたのか。どの状態から、どの状態へ進めようとしたのか。
これを残す。
単に「失敗した」と書いても、あとから使いにくい。失敗という結果だけでは、どの判断が外れたのか分からない。
一方で、「この手順なら制約を避けられると考えて試した」と残っていれば、後で意味が出る。成功しても失敗しても、その判断の根をたどれる。
結果は後から分かる。
しかし、意図はその場にしかない。
時間がたつと、なぜその操作をしたのかは薄れる。ログには実行結果が残っていても、そのときの狙いは残らない。だから、意図は行動の近くで捕まえる必要がある。
二つ目の手当ては、あとから振り返る工程を別に持つことである。
すべてをその場で正しく結びつけようとしても無理がある。先ほど見たように、因果の後半は未来にあるからだ。
だから、少し時間を置いてから見る。
失敗があった。状態が変わった。解決策が見つかった。こうした節目で、過去の記録を見直す。そして、表面上は似ていないが、構造として補い合っている出来事を結ぶ。
「前に失敗した理由」と「今回うまくいった理由」をつなぐ。
「避けた判断」と「避けるべきだと分かった根拠」をつなぐ。
「ユーザーが嫌がった出力」と「その後に通った書き方」をつなぐ。
このつながりは、毎回検索に賭けるべきではない。一度見つけたなら、明示的な印として固定しておくほうがよい。
そうすれば、次からは似ているかどうかに頼らなくてよい。因果の線を、そのままたどれる。
記録が重すぎると、振る舞いが変わる
ただし、ここには別の制約がある。
記録を厚くしすぎると、エージェントの振る舞いそのものが変わってしまう。
一手ごとに重い記録を挟む。毎回、細かな理由を書かせる。すべての判断を長く説明させる。すると、エージェントは遅くなる。判断の間が変わる。探索の仕方も変わる。
その状態で得た記録は、本当に普段のエージェントの記録なのか。
そうとは限らない。
観察の仕組みに引きずられて、別の動きをしている可能性がある。記録するために動きが鈍り、鈍った動きをまた記録する。これでは、本来知りたかった運行時の姿からずれてしまう。
だから、目指すべきは最大限の記録ではない。
因果をたどるのに足りるだけの、ぎりぎり軽い記録である。
普段は軽く残す。行動の意図、重要な状態、結果の要点だけを押さえる。そして、失敗、状態の大きな変化、解決といった節目で、重い振り返りを動かす。
常時ではなく、必要なときに深く見る。
もう一つ、忘れる設計も必要になる。
すべてを等しく覚えるのは賢くない。重要でないものまで強く残ると、後の判断を濁らせる。古い例外、もう使わない制約、一度だけ起きた偶然が、いつまでも顔を出す。
人間の記憶も、すべてを同じ強さでは残さない。重要なものは残り、そうでないものは薄れる。だから、何を強く残し、何を弱め、何を忘れるかも、記憶の設計に含まれる。
記憶とは、保存量の勝負ではない。
次の判断に効く形で、過去を整えることである。
Agentic OS における記憶の意味
Agentic OS の中で見ると、記憶は単独の部品ではない。
記憶が貧しいエージェントは、毎日記憶を失う実習生に近い。態度は安定している。返事もそれらしい。しかし、昨日と同じ失敗を今日も繰り返す。前に避けると決めた道を、また選ぶ。前に効いた工夫を、また最初から探す。
逆に、因果を残せるエージェントは、長く一緒に働ける同僚に近づく。
前回なぜその方法を避けたのか。何が効いたのか。どの制約で失敗したのか。どの判断が、後の成功につながったのか。
それを次に活かせる。
ここで言う記憶は、単に「過去の文章を探せること」ではない。過去の行動と現在の判断を、因果でつなぐ土台である。
この話は、連載の前半で見た検索ともつながる。必要な情報を取り出すには、外部の知識だけでなく、自分自身の過去も対象になる。
これから見る計画の層ともつながる。計画は、過去の失敗や成功を踏まえなければ、同じ道を何度も選ぶ。
さらに、後に扱う評価の層ともつながる。失敗から学ぶには、失敗がただの結果としてではなく、次に使える因果として残っていなければならない。
これで、運行時の層を一通り見た。
一つ目の柱は、隔離だった。エージェントに手を動かさせるために、実行環境を区切る。
二つ目の柱は、記憶だった。エージェントが長く走るために、状態を持たせる。
ただし、その記憶は保存箱では足りない。大事なのは、「何があったか」だけではなく、「なぜそうしたか」を残すことである。
次回からは、運行時を出る。
一体のエージェントをどう安全に走らせるかではなく、複数のエージェントをどう束ね、どう協調させるか。Agentic OS の次の層、編成の話へ進む。
← 一覧へ