Articles
生成AIとマルコフ連鎖
AIに歴史はない
LLMを使い込んでいる人なら、体で知っている事実がある。モデルの重みは会話の途中で変わらず、昨日どれだけ深い議論をしてもモデル自体は何も学習していない。変わっているのは、毎回モデルへ渡されるコンテキストの側だ。
確率論にはマルコフ連鎖という古典的なモデルがあり、次の状態は現在の状態だけで決まって、そこへ至った経路は影響しないという性質を持つ。すごろくで言えば、次にどこへ進めるかは今いるマスだけで決まり、どの道順でそこへ来たかは関係ない。
生成AIの推論はこれとよく似た構造を持っていて、次の出力を条件づけるのは、いま渡されている状態——プロンプト、会話履歴、リポジトリ、検索結果——だけであり、その状態がどんな経緯でできたかをAIは知らない。経緯を知らないから、半年前に廃止された規程も今朝更新された規程も同じ顔で権威に見える。AIに歴史はなく、現在だけがある。
状態が変わると何が変わるのか。出力の確率が変わる。LLMの出力は、渡された状態を条件とする確率分布——以前の記事で回答空間と呼んだもの——からのサンプリングとして書ける。同じ質問でも隣に置かれた文書が変われば、出やすい答えの分布ごと変わる。回答空間の記事では、この分布をpromptやreviewやSkillでどう動かすかを書いた。本稿はそこへ時間軸を足す。回答空間の形は現在の状態だけから決まり、出力は状態へ積まれて、次の回答空間を形づくる。
先に断っておくと、本稿の数式はすべて実務のためのメタファーであり、生成AIが数学的な意味で厳密にマルコフ連鎖だと主張するものではない。それでもこのレンズで見ると、チャットの劣化、リポジトリの汚染、導入後の幻滅がひとつの機構として繋がる。
会話は状態遷移である
チャットの1ターンを状態遷移として見ると、状態はこれまでの会話全体であり、そこから次の応答が確率的に生成され、応答の積まれた会話が次の状態になる。
問題は、この状態が追記でしか変化しないことで、撤回した前提も訂正される前の誤答も状態の中に残り続ける。人間は「あれは撤回済みだ」と経路を覚えているが、AIには現在の状態しか見えず、残っているものは撤回済みという経緯が正しく割り引かれる保証のないまま、次の生成を条件づける。入力が長くなるだけで性能が落ちるという計測があることは、前稿で触れた。実際に使える状態の範囲は、名目のコンテキストウィンドウよりずっと狭い。
それでも、同じ部屋の中にいる限りは救いがある。誤りと、それを誤りと判定できる文脈が同じ場所に同居しているから、指摘一つで安く訂正できるのだ。バイブコーディングが小さな仕事で成立するのは、この同居のおかげである。問題は境界を越えるときで、要約や引き継ぎを経ると、誤りは成果物として残るのに、それを誤りと見抜くための意図は残らない。誤りは残り、意図は残らない。境界の本当のコストは、この非対称性にある。
しかも状態は無限には伸ばせない。コンテキストウィンドウという有限の枠があり、会話がそこへ近づくと、古い部分を切り捨てるか、要約して圧縮するかしかなくなる。コーディングエージェントがcompactionと呼ぶのはこの要約圧縮のことで、状態の非可逆な再符号化である。何が失われたかは、要約の側からは分からない。境界とはコンテキストウィンドウの端のことではなく、この非可逆な再符号化が起きる場所すべてを指すと考えたほうがいい。要約、別セッションへの引き継ぎ、そしてリポジトリへの固定。どれも状態が書き換わる遷移である。
開発ループを式で置く
AIコーディングを同じレンズで書くと、こうなる。
Aₜ ~ π(A | Sₜ, Tₜ)
Sₜ₊₁ = Transition(Sₜ, Aₜ, Vₜ)
Sₜは現在のリポジトリ状態、Tₜは今回のタスクと仕様、AₜはAIが生成する候補の差分、Vₜはテスト・レビュー・人間による検証だ。AIは現在のリポジトリと依頼だけを条件に候補を出し、検証を通ったものが次のリポジトリ状態になり、それが次のタスクの入力になる。
ただし、これは単純なマルコフ連鎖ではなく、差分は3つある。第一に、毎回Tₜという外部入力が入る。第二に、遷移を確率に任せず、検証Vₜが選別する。第三に——ここが最も重要だが——状態Sₜの中に検証そのもの、つまりテストや仕様が含まれていて、遷移は将来の審判を書き換えることができる。AIが自分の通るテストを書き、都合の悪いassertionを緩めるという現象はこの構造から出てくる。呼ぶなら、制御付きの確率的状態遷移である。
審判が状態の中にあることの帰結は、3通りに分けられる。AIが審判そのものを書き換えて緩める、内生的な破損。審判は固定のまま、その字面だけを満たして意図を外す最適化。そして環境が変わって審判自体が古くなる、外生的な失効である。対策もそれぞれ違い、1つ目は実装と審判の変更を同じ手に持たせないこと、2つ目は審判に人間の判断を残すこと、3つ目は審判を定期的に引き直すことになる。
増幅の式
このループで誤りがどう蓄積するかも、ひとつの式に畳める。
Eₜ₊₁ = α(1−c)Eₜ + (1−d)(Lₜ + Nₜ)
Eₜはすでに状態へ固定された誤り、αは増幅係数で、AIが既存の形を前例として再利用・展開する強さだ。前例は再利用のたびに複数の箇所へ複製されるから、生成が続く環境ではαは1を上回りやすい。cは掃除率で、失効した記述や旧経路が実際に削除される割合。Lₜは要約による情報の損失、Nₜは推測や補完によるノイズ、dは境界の検証でそれらが検出される割合だ。係数はどれも測定済みの実勢値ではなく、構造を見るための概念装置である。
それでも、この式は2つのことを言う。ひとつ。掃除がなければ、つまりc = 0なら、式の中に誤りを減らす経路が存在せず、αが1を上回る環境では誤りは増幅されながら積もっていく。導入直後のAIが賢く見えて数ヶ月後に馬鹿に見えるのは、モデルが劣化したのではなく、Eₜが育ったのだ。ふたつ。既存の誤りが増幅で育たない条件はα(1−c) < 1、増幅の速度を掃除の速度が抑え込んでいるときだけだ。反復のたびに同程度の損失とノイズが入るとすれば、生成の回数を増やすほど、同じ時間軸で必要な掃除も増えていく。AIの導入を生成を増やすことだとだけ理解して掃除に投資しなければ、この不等式はどこかで破れるはずだ。
係数は概念装置だと書いたが、測る取っ掛かりはある。αは、あるworkaroundを直すときに同じ形が何箇所へ複製されていたかに現れる。cは、解除条件付きで残した例外が実際に消されるまでの時間で測れる。審判の破損は、実装の変更と同時にassertionが弱められた回数に現れる。そして状態全体の健全性は、履歴を持たない新しいセッションが現在の正本だけで仕事を完了できるかという、コールドスタートの成功率で測れる。
歴史を現在に書き換え続ける
マルコフ性のレンズから出てくる実務の帰結は、ひとつに集約できる。AIの活用とは、モデルの選定でも指示の上手さでもなく、次の生成を条件づける現在状態を設計し、手入れし続けることである。何を状態に残すか。何を消すか。検証と掃除をどこに組み込むか。
この見方は特殊ではなく、実務の語彙も同じ場所へ収束し始めている。prompt、context、harness、loopと増え続けるエンジニアリングの流行語を作業単位で層別した整理では、context engineeringの作業単位は「ウィンドウに残るもの」とされ、良いキュレーションの大半は詰め込むことではなく捨てるものを知ることだ、と述べられている。呼び名が何であれ、仕事の中心は選別と削除へ移っている。
目的だけ与えてAIを自走させる流れも、この帰結を強める側に働く。自走するAIは毎回、会話履歴を持たずに現在状態から立ち上がる、いわば永久コールドスタートだからだ。どこまで自走を任せられるかは、モデルの能力と同じくらい、現在状態の手入れで決まる。
冒頭で、マルコフ性とは経路が関係ない性質だと書いた。だとすれば、経路——つまり歴史——を大事にしたい者が取れる手はひとつしかなく、歴史のうち今も有効なものを選び、現在の状態へ書き換え続けることだ。AIの時代に歴史を残す唯一の方法は、歴史を現在形に翻訳し続けることだと考えている。