コンパイルされて消える
次に何が自動化されるのかを描く地図
スライドへのリンク https://tyodxiut.gensparkspace.com/
2023年、私は誰も頼んでいない小説を書くためのシステムをつくった。マルチエージェントのオーケストレーションを試すプロジェクトで、負荷試験として小説に狙いを定めた。前提は再帰的だった。あるプログラマがAIを使い、AIを使って小説を書くプログラマについての小説を書く。九層の深さで。どの主人公もやがて、自分は一つ上の層の誰かに書かれた物語の登場人物であり、自分は一つ下の層を書いているのだと気づく。それでもめいめいが、しばらくのあいだは自分こそペンを握る者だと信じている。
私はそれを発表した。面白いのはエンジニアリングの部分、つまり入れ子になった物語の枠を越えてエージェントを協調させる挑戦だと思っていた。
自分が何をつくったのか、私は取り違えていた。
理解するのに二年かかった。その小説のどの主人公も、自分が物語の起点だと信じていた。そのどれもが、誰かの物語の途中だと判明した。
私は自分が最上層だと思っていた。仕様を書く者。源だ。自分は途中のどこかにいるのかもしれないと理解するのに、二年かかった。
私はAIシステムをつくって生計を立てている。十年そうしてきた。機械学習、言語モデル、研究からプロダクションまでの全段。そして機械室の内側から見えているのは、知識労働の構造的な大改修であり、それは外側のほとんどの人にはまだ見えていない。彼らが十分に賢くないからではない。そのメカニズムに手を置いていないからだ。
これが、私が立つ場所から見える光景である。
十時間で見たもの
ある朝、私は何週間も頭の中で温めてきたものをつくろうと腰を下ろした。データベース一つ、外部API連携をいくつか、処理パイプライン一つを備えたサービス。アルゴリズムのせいで難しかったことは一度もなく、いつも縁のせいで難しい、その種のものだ。一か月はかかると見積もった。もっとかもしれない。
エディタを開き、コーディングエージェントをつなぎ、何が欲しいのかを述べはじめた。
二時間目には、私はコードを書いていなかった。自然言語で意図を述べ、エージェントがすでに出したものへの修正として述べていた。エージェントがコンポーネントを一つ生成する。私は、自分が指定しなかった何かをそれが推し量って埋めた箇所を見つけ、指定しなおす。書きなおすのではない。指定しなおすのだ。
はっきり異なる二種類の失敗があった。一つ目は、私が伝えられたはずの何かをエージェントが取り違えたときだ。それは外部呼び出しを同期の要求応答として配線したが、私が欲しかったのは再試行キューを備えた撃ちっぱなしだった。下流のサービスが負荷で不安定になること、そこでブロッキングすれば連鎖して崩れることを、経験から知っていたからだ。それは仕様の失敗だった。私が自分の言いたいことを言わなかったのだ。気づきさえすれば直すのは簡単だった。
二つ目の種類はもっと奇妙だった。私は、システムのコンポーネントが互いにどう関わるべきか、すでに来ると感じている機能のために境界がどこで息をつく余地を要するか、その心象を持っていた。各モジュールについて要件は述べられた。伝えられなかったのは、その構成全体を安定させる不変条件の集合だった。修正のたびに一つの継ぎ目はよくなったが、全体の姿が乱れた。ボトルネックはインターフェースであって、私の指定する能力でも、エージェントの実行する能力でもなかった。
一つは仕様の失敗だった。もう一つは投影の失敗だった。そのとき私には、まだその言葉がなかった。
五時間目には、十年のエンジニアリングの仕事では覚えのないリズムに落ち着いていた。指定し、検討し、見つけ、指定しなおす。私はアーキテクチャの決定を実装するのではなく、評価していた。翻訳の作業はエージェントがやっていた。何週間も私の手と画面を占めたはずの部分を。私の仕事はまったく別の何かになっていた。その翻訳が忠実かを確かめることに。
八時間目には、動くシステムが手元にあった。機能し、試験され、配備された。その十時間から出てきたものは、腕利きのチームでも何週間もかかったはずの仕事だ。コードがより優れていたからではない。私が意図したものから、現に存在するものへの翻訳が、私が手で遂行することなく起きたからだ。
エージェントがやっていたことには、正確に当てはまる構造的な用語がある。それはコンパイルだった。より高い抽象水準の表現を、より低い水準の実行可能な形へ翻訳すること。比喩としてではない。構造としてだ。コンパイラはただ圧縮するだけではない。選択を確定し、いったん確定すれば別の道は消える。私の意図は豊かだった。出てきたのは走るコードだった。失われたもの、つまり私の理由、私の趣味、何が六か月後に壊れるかについての暗黙の知識は、エージェントが悪かったから失われたのではなく、目標の表現がそれらを抱えられなかったから失われたのだ。
翻訳ではない。翻訳は対等な高度を含意する。圧縮でもない。圧縮は可逆性を含意する。蒸留でもない。蒸留は、失われた材料が雑音だったことを含意する。コンパイルだ。方向があり、実行可能で、取り返しがつかないほど損失を伴う。これは特定の種類の仕事についての主張である。意図を、世界で走らねばならない産物へと翻訳する仕事だ。真に新しい何かをつくり出す生成は、別の演算である。
私の一つ下の層、私の意図を私の手で直接コードへ翻訳して何年も過ごしたその層が、一朝で消えた。そして自分の層を失うという恐れこそが、私を一つ上の層へと押し上げていた。
私はもう何か月もこの状態で生きている。日々、私のすることを学んでいくシステムとともに働き、その自覚が私を、これまで一度も立ったことのない水準で考えるよう駆り立てる。私が成長を選んだからではない。足元が動いたからだ。そしてその上で見つけたのは、以前は見えなかったパターンが見え、つくらなかったはずのつながりをつくり、一年前なら不可能だった速度と抽象水準で仕事を出せるということだ。
私が思いつくかぎりのあらゆる知識労働の役割は、一つのコンパイル工程だ。戦略を計画へ。計画を課題へ。課題をコードへ。判断を決定へ。趣味を仕様へ。AIとは、このコンパイルが自動化されつつある場所だ。構造はいつもそこにあった。新しいのは自動化のほうだ。
そしてAIは、この翻訳を一つひとつ遂行することを学びつつある。Spec Gap (仕様ギャップ) がもっとも小さいところから始めながら。
なぜ底から始まるのか
AIが戦略より先にコードを征服したのには理由がある。そしてその理由が、次に何が打たれるのかを正確に教えてくれる。
私がAIエージェントに機能を一つつくれと指示するとき、私の意図は一部しか指定されていない。私は何が欲しいかを知っているが、その全部を言ってはいない。エージェントは止まって尋ねたりしない。推し量る。そしてここに、AIで何かをつくる人の大半がまだ十分に飲み込んでいない点がある。あらゆるAIの出力は、あなたが望んだものと、機械があなたが望んだと推し量ったものの混合であり、二つは入り混じったまま印もついていない。どの部分があなたの意図から来て、どの部分がモデルの推論から来たのかを区別できないなら、出力を確かにデバッグすることはできない。ただそれに反応できるだけだ。
私はこれをSpec Gapと呼ぶ。あなたが意図するものと、あなたがかろうじて指定しえたものとのあいだの距離だ。それは、AIがどこを崩しどこを崩さないかを予測する、たった一つの変数である。今のところは。
Spec Gapには二つの層がある。あの十時間で私が指定しそこねたものの一部は、迫られていれば確かに言葉にできた暗黙の知識だった。私はどのエラー処理の流儀を好むかを知っていた。ただわざわざ言わなかっただけだ。これは言葉にできるSpec Gapであり、意図を明示するよう迫られるたびに縮む。もう一方はもっと厄介だ。私が意図したものの一部は、時間が無限にあっても指定できなかっただろう。あるアーキテクチャはうまく歳をとるだろうという、感じられる感覚。千の過去の失敗から築かれた、ある手法が私には名づけられない条件の下で壊れるだろうという直感。これは言葉にできないSpec Gapであり、外部化に抗う意図の取り分だ。あなたが怠けているからではなく、そもそも完全に書き下せる種類のものではなかったからだ。
コードの水準では、Spec Gapは小さい。AIはここで、多くのチームのボトルネックを消すほどには上手にコンパイルする。この層は今まさに崩れつつある。分析の水準では、間隙は中くらいだ。あなたは欲しいものをおおむね言葉にできる。AIは軽い監督でそれをこなす。協調の水準では、間隙が広がる。意図は人々のあいだに分かれ、その半分は言われていない。戦略の水準では、それは途方もない。組織の意図は創発的で、矛盾し、誰も書き下したことのない力に形づくられる。この層がもっとも長く保つ。
これは難しさや技量の序列ではない。堅牢なコードを書くのは難しい。だがそれは、すでに形式的に指定されたかたちで難しく、だからこそAIはそれを最初にコンパイルする。
この勾配は傾向であって法則ではない。順序を実際に予測するのは、抽象水準そのものではない。三つのことだ。意図がどれだけ産物へ外部化されているか。出力をどれだけ安く検証できるか。そして誤りがどれだけ高くつくか。これらの駆動因が抽象水準と相関するので、勾配はおおよそ下から上へなぞられる。だが本当の仕事をしているのは、これらの駆動因だ。
今日モデルにできないことを軸に計画を組むな。あなたが見るあらゆる限界は、動く最前線の一つのスナップショットだ。そしてその最前線は外側の誰よりも速く動くのだが、それは下の層を解くと、面食らう何かが明らかになるからだ。上の層で還元不能なほど人間的に感じられた多くのものが、実は最初から指定可能だった。私たちがただ、指定するよう迫られたことがなかっただけだ。コード生成がスタックの底を自動化すると、にわかに私は、以前は暗黙に残していたアーキテクチャの意図を言葉にせねばならなかった。そして判明したのは、私はそれを言葉にできたということで、それはエージェントがそれをコンパイルできることを意味し、それはその層が次だということを意味した。
天井は、下から見上げたときより低いものだと、繰り返し判明する。
しかしスタックは私で止まらない。私の組織は、私のような人々を通して自らの戦略を実行可能な仕事へコンパイルする。市場は、組織を通して競争圧力を戦略的応答へコンパイルする。私はずっと、私の上へ伸びるコンパイルの鎖の中間層だった。ただ、上の層々をコンパイルとして見られなかっただけだ。上の層々が、もう一つ翻訳されている表現というより、世界のように、表現ではなく実在のように感じられたからだ。
私は源ではない。私は途中だ。そして中間層こそ、コンパイラが最適化で消し去るものだ。
最前線とともに移動する失敗面
今いちばん多くの混乱を起こしているのは、二つの特定の失敗面だ。より優れたモデルが、この水準ではそれらを直すだろう。すると同じ失敗が一つ上の層で、そしてAIが到来するあらゆる新しい縦割り領域で、また現れる。これらが現在のモデルの限界ではないからだ。コンパイルそれ自体の構造的な特徴なのだ。
一つ目はSpec Gapだ。二つ目は、あの十時間のあいだ、名づける前に感じていたものだ。失敗が、私が意図を指定しそこねたからではなく、私たちのあいだの通路がそれを運べなかったから起きた、その瞬間。
欲しいものを正確に指定しても、出力はやはりそのすべてを抱えきれない。音楽における趣味を考えてみよ。あなたの趣味は条件つきで、記憶、文脈、気分、誰とも共有しない連想に形づくられている。AIにはベクトルが要る。テンポ、調、楽器編成、エネルギー水準。それらのパラメータに写し取れないあなたの経験の次元は失われる。今日のインターフェースを通すと、あなたの十点満点の曲は誰にとっても七点になりがちだ。AIが失敗したからではなく、あなたの内的状態とシステムの入力とのあいだの通路が、その曲をあなたのものにしていたまさにそれを運べなかったからだ。
私はこれをProjection Gap (投影ギャップ) と呼ぶ。ボトルネックは、モデルが内部で低次元だということではない。現代のモデルはきわめて高次元だ。ボトルネックはインターフェースだ。たとえモデルがあなたの意図するすべてを表現できたとしても、あなたはなお狭い管を通して伝える。テキストのプロンプト、パラメータのスライダー、参照例、反復的なフィードバック。その通路はあなたの認知状態より自由度が少ない。コーディングのセッションで見た、指定・検討・修正のリズムは、人間が二つの間隙を一度に閉じようとする試みだ。反復によって仕様を狭め、通路を広げる。助けにはなる。どちらのボトルネックも消しはしない。
業界は両方の失敗を一つの問題として(「AIが私の望んだとおりにやらなかった」)扱い、その取り違えが、重要なところほど静かに評価を壊している。AIが何かを失ったかどうかは、元が何だったかを知っていてはじめて確かめられる。だが高い抽象では、元はそもそも完全に指定されたことがない。それがSpec Gapだ。そして完璧に指定された元でさえ、インターフェースを無傷では通り抜けない。それがProjection Gapだ。二つを合わせると、あなたは存在しない一点からの距離を測っていることになる。
さて、これを成長痛ではなく恒久的な構造条件にする部分だ。
より優れたモデルが、コーディングの水準で両方の間隙を狭める。すると最前線がシステムアーキテクチャへ上がり、Spec Gapがより広く再び現れる。それを解けば、製品戦略へ移る。そのたびに、同じ二つの失敗面が、より高い抽象水準で、より広い間隙とともに浮かび上がる。そしてAIが新しい縦割り領域に入るたびに、同じパターンが新たに現れる。Spec Gapとは、実務者は知っているが機械には言葉で伝えられない何かだ。Projection Gapとは、重要だがシステムが受け入れるインターフェースを通り抜けられない何かだ。
特定の問題は巡る。構造は恒久的だ。
つまり、AIにおけるもっとも重要な未解決問題は、より優れたモデルだけではないのかもしれない。それは、より優れた仕様、すなわち人間が実際に望むものを表す、より豊かで高次元な方法でもあるかもしれない。モデルは速く良くなっている。だがボトルネックは上流、その源にもある。そしてそれは上流に留まるだろう。コンパイラが良くなるたびに、源が以前より指定の薄い水準へと最前線が移るからだ。
中間が抜け落ちると何が壊れるか
私は、AIが今では引き受けるその仕事をすることで、自分の判断を身につけた。十年のあいだ、動かないコードを書いた。それをデバッグした。負荷を受けると何が壊れるのかを学んだ。何年ものあいだ、他人の意図を動くシステムへ翻訳した。はじめは下手に、やがて人々がより大きく曖昧な問題を私に託すほどには十分に。実行から指揮へ、指揮から判断へと向かうその道こそ、私が今の仕事をできるようになった経路だ。
その道がコンパイルされて消えつつある。
エンジニアリングの組織ですでに起きていることを見てみよ。かつてジュニアの開発者は、境界の明確な機能を一つ、はじめから終わりまで持っていた。書き、デバッグし、出荷し、壊れたものから学ぶ。今ではエージェントがその機能を生成する。ジュニアは、評価するための文脈を持たない出力の検討者になる。彼らはエージェントの推論を元の意図と区別できない。意図を自ら生成する筋肉を、一度も育てたことがないからだ。それがSpec Gapからの、印のない混合の問題であり、今では訓練の失敗として働いている。組織はより速い出力を見る。見えていないのは、シニアたちが頼ってきたその判断を、誰も育てていないという事実だ。
これはエンジニアリングだけのことではない。あらゆる産業に、同じ経路の一つの版がある。ジュニアのアナリストがシニアのアナリストになり、ディレクターになる。アソシエイトの弁護士がパートナーになる。レジデントがアテンディングの医師になる。このパイプラインが回るのは、中間層、すなわち戦略を課題へ、判断を実行へと翻訳して過ごす年月こそ、上の層のための判断を育てる場だからだ。指揮を学ぶのは、指揮を研究することによってではない。翻訳の作業をし、失敗と出会い、何がコンパイルを生き延び何が生き延びないかについての趣味を築くことによって学ぶのだ。
AIがその中間層をコンパイルして消すとき、それはそこで働く人々を押しのけるだけではない。頂点にふさわしい人々を生み出すパイプラインを壊す。
明白な反論はこうだ。もしかするとAIコンパイラと並んで働くこと自体が、ただ圧縮された、一つの訓練パイプラインなのかもしれない。二年のあいだエージェントに意図を指定し、その失敗を見つけ、Spec GapとProjection Gapを実時間で区別することを学んだジュニアは、五年のあいだ手でコードを書いたジュニアより速く判断を育てるかもしれない。もしかすると徒弟の型が適応する。私はこれがまさに間違いだとは思わない。だが古いパイプラインは、あなたを翻訳の内側に住まわせ、なぜある抽象が負荷を受けると壊れるのかを手で感じさせた。エージェントの出力を検討することは、それを自ら生み出すこととは別の認知の演算だ。検討は評価的な判断を訓練する。つくることは生成的な判断を訓練する。新しいパイプラインが前者だけを育てるなら、何かが間違っていることは見抜けるが、正しさがどんな姿かは言葉にできない人々が残る。私たちはまだ分からない。実験は進行中だ。
いずれにせよ、危うさは認知的なGhost GDP (ゴーストGDP) だ。Citrini Researchの用語を借り、ひねったものだ。ついに育たなかった能力。表面は知能のように見える。その下では、本物の人間の判断を生み出してきたパイプラインが枯れつつある。
AIシステムそのものにも、構造的な間隙がある。誰もが領域ごとのコンパイラをつくっている。その出力どうしを和解させるシステムをつくる者は、ほとんどいない。コンパイラ工学では、それをリンカと呼ぶ。これは人間とAIのあいだではなく、AIシステムどうしのあいだで働くProjection Gapだ。コンパイラはそれぞれ異なる次元を落とす。そしてその抜け落ちた次元こそ、領域を横断する一貫性に必要な次元だ。バックエンドは、フロントエンドが一度も指定していないデータモデルを前提する。ロードマップは、アーキテクチャが支えられない日程を約束する。出力の一つひとつは局所的に妥当だ。一緒に置くと食い違う。リンキングとは、別々にコンパイルされた産物を横断する制約の伝播だ。それはAIのインフラに欠けた、もっとも重大な部品かもしれない。
この勾配のどこに自分が座っているかを見られるなら、自分の技量のどれが自動化を待つコンパイル工程で、どれがその上の還元不能な仕様の作業かを見分けられるなら、あなたには大半の人が持たない地図がある。この枠組みは、あなたの層が安全かどうかは教えてくれない。だが、どちらの方向へ動くべきかは教えてくれる。
私の考え
私が三年前につくったあの再帰的な小説は、結局のところコンパイルスタックの、動く模型だった。同じ失敗面が、層ごとに繰り返される。九回。語彙を手にするまで、私は自分が何を見ているのか分かっていなかった。
問いは、天井があるかどうかだ。言葉にできるSpec Gapは、意図を外部化するよう迫られるたびに縮み、AIはそう迫るのがとても上手だ。だが言葉にできない種類、すなわち感じられる感覚、生きられた失敗から築かれた直感、そもそも命題だったことのない知識。そういう種類の意図が実在し持続するなら、Spec Gapが恒久的に残る層がある。技術がまだそこに届いていないからではなく、源と目標が構造的に通約不能だからだ。あるいは、その診断がただ繰り返されつづけるだけだ。天井がそれぞれ床になりながら。
私は、言葉にできない種類は実在すると思う。特定の身体で特定の生を生きたということの構造的な特徴として、外部化に抗う意図があると思う。だがそれは、大半の人が望むより狭いと思う。私たちが還元不能に人間的な判断と呼ぶものの大半は、私たちがまだ指定するよう迫られていないだけの、言葉にできる種類だろうと私は見ている。
天井は実在するかもしれない。だがそれは、ここから見えるより低い。
スライドへのリンク https://tyodxiut.gensparkspace.com/