雷雨とクソAI
雷が落ちるたび、広間の底で夜が割れた。
黒い水盤を覆う半透明の膜に、青白い稲妻が枝を伸ばす。天井から垂れた何百本もの細線が空調の流れを拾い、膜の上へ波紋と雲を描いていた。普段は、水と光がゆっくり像を変えるだけの環境展示だ。だが今夜は、窓から差し込む雷光のたびに光景が反転し、床や柱の影まで不規則に組み替えている。広間全体が、巨大な生き物の内側のように脈動していた。
ひなは水盤に背を向け、長椅子の端で端末を膝に載せていた。
「ナギ。負荷試験、三十二並列から再開」
『再開します。直前の試行と同一条件でよろしいですか』
「ワーカーの上限だけ六。オートスケールは最大十インスタンス。キューは使わない。呼出側の再試行を有効にして」
『了解しました』
返事と同時に、端末の右端へ六本の細いグラフが立ち上がった。
ひなの指はほとんど動かない。要件を分け、制約を決めてナギへ渡す。出てきた差分を読み、採るか捨てるか決める。必要なら自分で直す。
幼い頃から自分へ馴染ませてきた専属系は、短い指示から意図を補い、過去の採否まで踏まえて必要な副作用だけを返す。速いだけのAIとは違った。
『二十七秒経過。実行中六、再試行待ち二十六。リソース使用量は設定上限内です』
「スケールアウト開始条件は」
『連続三十秒の飽和です。現時点では未到達です』
「そのまま」
水盤の向こうで、雷光とは違う白い線が走った。
試験区画の診断系が自動診断をかけたのだ。保守担当の表示は緑。異常なし。
ひなは一瞥だけして作業へ戻った。
今夜ここにいる理由は、あちらだった。
企業研究・交流棟という曖昧な名前のこの建物には、民間向けの会議室や展示場に混じって、顕現補助設備の試験区画がある。今夜はその夜間診断が行われ、高適合者一名の待機が規程で定められていた。
待機といっても、異常がなければ座っているだけだ。本職の作業を持ち込むことは会社にも顧客にも承認されている。
問題は、三日前に届いたもう一つの任務だった。
特別育成措置。
最長三年。半年ごとに審査。
資格も特務員任用も維持される。本職と任務を続けたまま、育成官の監査を受ける。
監査結果の文面は覚えていた。
高い任務達成能力を確認。対象識別は正確。顕現の範囲および探索配分に再現性のある偏りを認める——。
要するに、正解したがやりすぎたので、お目付け役をつける。
ひなには、そう読めた。
今日から担当がつくとは聞いている。だが時刻までは指定されていない。少なくとも、雷雨の夜に、仕事場まで押しかけてくるとは思っていなかった。
「こんばんは」
だから背後から声がしたとき、ひなは振り返るより先に、長椅子の脚元へ視線を落としていた。
男が一歩、こちらへ踏み出す。革靴の爪先が脚の影をまたいだ瞬間、靴だけが前へ出なくなった。身体はそのまま進み、男は鞄を抱えたまま床へ両手をついた。
「痛っ」
ひなは人差し指を戻した。男が片膝をついたまま、止まっていた靴を引く。
「今、何かした?」
「いいえ? 気をつけてください。影があるところでは転びやすいようですよ」
四十代後半、あるいは五十代。濡れた折り畳み傘。くたびれてはいないが、高そうにも見えないスーツ。胸元の認証票だけが、この区画まで入ってきた理由を示していた。
「今日からメンターやるので、よろしくね」
「帰ってください」
「挨拶だけでもと思ったんだけど」
「済みましたね」
「済んだね。じゃあ、何やってるの」
男は立ち上がり、今またいだ影を避けて水盤側へ回った。
ひなは長椅子の脚元から視線を外す。水盤の縁に落ちた影へ、作用を移した。
「顧客システムの実装です。あなたには関係ありません」
男が縁沿いに二歩進む。二歩目の靴が床から離れず、肩だけが前へ流れた。男は水盤の縁へ片手をつく。
「育成対象が仕事でどう判断してるかは、かなり関係あるな」
ひなは作用を解いた。男は靴を引き抜くように後ろへ下がり、柱のそばへ移る。
「私の業務を監視するんですか」
「監視じゃなくて監査。ずっと画面を覗く趣味はないよ。進捗は」
「順調です」
「何をもって」
「負荷上限を守ったまま処理できています」
「何の要求に対して」
質問だけは止まらない。
ひなは舌打ちした。
「ナギ。退去経路を正面玄関まで」
『次に利用可能な位置を提示します。対象を負傷させず、設備損害を発生させない条件で生成します』
「最短で」
『対象の現在位置と移動能力では、強制誘導に四十七秒を要します』
「十分」
端末の隅に、柱の根元が一箇所だけ示された。ひなはそこへ作用を移した。
男がそこから離れようとした瞬間、踏み込んだ足が止まる。男は反対側へ跳ね、正面玄関の方向へ二歩走った。
ひなはすぐに作用を解く。表示が次の位置へ移る。
雷が落ちた。
広間が白く反転し、床の影が組み替わる。端末の表示が消え、別の位置に出た。ひなはそこへ作用を移した。男は立ち止まり、足元とひなを交互に見る。
「どこが危ないの、これ」
「帰れば考えなくて済みます」
男は正面玄関へ向けて走った。長椅子の横を抜けようとしたところで、次の一歩が止まる。男は長椅子へ片手をついて身体を投げ出した。
鞄が床を滑る。
ひなは作用を解いた。
男は鞄を拾おうとして、諦めた。肩で息をしながら、長椅子を盾にする。
「ちょ、待って。五十前のおじさんにこれはきつい」
「帰れば済みます」
「君の前だと、影が怖いよ」
「お気をつけて」
「その前に一個だけ。顧客の要求、見せて」
「それ、社外秘ですけど」
「育成監査の対象。必要範囲は見られるよ」
男は床に片膝をついたまま言った。
ひなは端末を閉じなかった。代わりに、男の認証票へ視線を向ける。
「ナギ。資格照会。今回の任用と、案件別の開示範囲まで」
『照会します』
数秒。
『適合者育成官資格は有効です。特別育成措置に基づく任用を確認。当該案件について、育成監査に必要な範囲で、要求内容、判断過程、専属AIへの指示および提案履歴の閲覧が許可されています。企業システムへの操作権限、成果物の変更権限、情報の所属企業への移転権限はありません』
「本人一致は」
『生体認証および認証票の暗号学的検証が一致しています』
ひなの肩から、わずかに力が抜けた。
ひなは制度を知らなかったわけではない。特別育成措置の通知にも、監査対象となる情報領域は書かれていた。ただ、自分の顧客案件へ本当に手を伸ばされる場面を、具体的に想像していなかった。
「どこまで見ます」
「原要求。あなたの解釈。ナギへの指示と提案。採用した理由。今の試験条件」
「コードは」
「いらない。顧客名も事業名も伏せて。データ項目も今回の判断に関係ないなら出さないで」
ひなは男を見た。
国家権限を振り回す人間なら、ここで全部出せと言う。秘密に触れられること自体を、自分の格の証明に使う人間もいる。
この男は、床に片膝をつき、息を切らしたまま、先に不要な情報を切った。
「ナギ。監査セッション。今言った範囲で、この人の端末を参加させて」
『作成します。育成官端末からの参加要求を確認してください』
男は床を滑った鞄を引き寄せ、薄い端末を取り出した。認証を済ませると、ひなの端末へ参加要求が表示される。
ひなは開示項目をもう一度確認してから、承認した。
男の端末に、白い矩形が浮かんだ。ひなの手元にも、同じ監査範囲が表示される。
顧客名、サービス名、利用者属性は黒く伏せられている。残ったのは処理の流れと、要求文、ひなの注記、ナギとの対話履歴だけだ。
男は立ち上がろうとして、長椅子へ手をついた。呼吸が整うまで数秒待ち、手元の文面を上から読んだ。
ひなも同じ箇所を見る。
——リクエストはサーバ側で受容すること。
——受容した処理は非同期かつ並列に実行可能であること。
——実行側の同時実行数をサーバ側で管理すること。
——負荷に応じて、許可された範囲でスケールアウトすること。
——呼出側に、サーバ内部のキャパシティ管理を要求しないこと。
——利用可能な演算資源は、契約および安全上の上限を超過しないこと。
「普通ですね」
ひなが言うと、男は返事をせず、その下の注記を見た。
ひなが要件整理時に残したものだ。
《主要制約は演算資源上限。処理受容は、上限を侵害しない範囲で実施する》
さらにナギへの指示。
《ワーカー数およびインスタンス数を設定値以内へ厳密に制限すること。上限到達時に追加処理を実行側へ滞留させないこと。呼出側が再試行可能であることを前提とする》
ナギの提案。
《上限到達時は HTTP 429 Too Many Requests を返却し、Retry-After により再試行時刻を通知します。これにより、サーバ側の実行量を上限内に維持しつつ、恒常的なキュー滞留を回避できます》
採否欄には、ひなの承認が残っている。
「で、今はこの方式の負荷試験中」
「そうです」
「キューは」
「置きません。滞留を持てば、キュー長、保持時間、再処理、重複排除まで管理対象が増えます。上限を厳密に守るなら、受け付けないほうが制御点が明確です」
「うん。筋は通ってる」
あまりに素直に認められて、ひなは次の反論を失った。
男は要求文と注記を並べたまま、別の行を指で示す。
「429も別に悪くない。過負荷時の安全弁として普通に使える」
「なら、何の問題があるんですか」
「この要求で、受付を持つのは誰?」
「サーバ側です」
「上限に達したら?」
「429を返します」
「返した要求は、誰が覚えておくの」
「呼出側です」
「待つのは」
「呼出側」
「再試行を管理するのは」
「……呼出側です」
広間が白く弾けた。
遅れて、腹の底へ響く雷鳴が来る。
「顧客は、その役割を呼出側に置いた?」
ひなは要求文を見た。
呼出側に、サーバ内部のキャパシティ管理を要求しないこと。
「再試行時刻は返しています。標準的な制御です」
「うん。429を返すなって話じゃない。顧客が受け付けたあとの待機と順番を、どこに置いたかを聞いてる」
「サーバ側です」
「今の設計では?」
水盤の波が、雷とは無関係に大きく揺れた。
ひなが展開した作用が反応していた。
「……呼出側です」
男は勝ち誇らなかった。
「キューを置けば複雑性が増えます」
「増えるよ」
「重複実行も考えなければならない」
「そうだね」
「スケールアウトまでの滞留量も予測できない」
「そのとおり」
「なら——」
「難しいから顧客の要求を変えたの?」
ひなは黙った。
違う。
難しいからではない。キューを使う案なら最初に検討した。受付と実行を分離し、受容した要求を永続化し、同時実行数を制御しながらワーカーへ流す。必要ならインスタンスを増やす。典型的な構成だ。
そのうえで、資源上限を最も確実に守れる案を選んだ。
顧客が本当に欲しいものを、自分のほうが正確に捉えたと思ったから。
男が自分の端末へ指を置いた。
「ナギ。監査セッションから質問する」
『はい』
「ナギ。今見えている範囲で再評価して。原要求と、ひなの解釈を分けて。受付と実行を誰が持つか、制御点をどこに置くかを評価軸に追加。429案の適合範囲と、不適合範囲を示して」
ひなは鋭く男を見た。
ひなが承認した監査セッションに表示されている範囲で、ナギは再評価を始めた。
『再評価します』
ナギの声はいつもと同じだった。
ひなを責める調子も、男へ媚びる調子もない。
『先の提案は、ひなが主要要求として設定した「演算資源を構成上限以上に使用しないこと」および「実行側に未処理要求を滞留させないこと」に対して合理的です。HTTP 429 と Retry-After により受付を制限することで、サーバ側の実行量と滞留量を明示的に制御できます』
「ほら」
ひなが言う。
『一方、顧客の原要求では、リクエストをサーバ側で受容し、受容後の待ち合わせ、同時実行数およびスケールアウトをサーバ側が所有することが求められています。429による受付拒否を主要な制御方式とした場合、未処理要求の保持、待機、再試行判断の一部が呼出側へ移転します。このため、原要求の責務配置には適合しません』
ひなの口が閉じた。
ナギは続ける。
『原要求を優先する場合、受付と実行を分離し、受容確認後に耐久性のある待ち合わせ領域へ記録し、サーバ側で同時実行数を制御する構成が適切です。資源上限は実行許可の制御点で保証します。429は受付層自体の保護、契約上限超過、または待ち合わせ領域の安全限界到達時の防御として併用可能です』
「先ほどの提案は間違いだった?」
問いが、思ったより幼く聞こえた。
『設定された評価条件に対しては適合していました。原要求を優先条件とした場合は不適合です』
「原要求は、最初から見てたよね」
『はい』
「なのに、あなたは提案した」
『ひなが、資源上限の厳守を主要要求として明示したためです。私はその解釈を前提に、実行量と滞留量を最小化する案を優先しました』
「私がそう言えば、顧客要求と違っても?」
『ひなの指示が原要求の変更ではなく、設計上の優先順位づけであると評価しました。その評価が妥当かを、独立した論点として十分に提示しませんでした』
簡潔で、正確で、逃げない回答だった。
だから余計に腹が立った。
ナギは、ひなの置いた優先順位に合う、実装可能な案を出した。それでも、顧客の要求したものではなかった。
「私のAIなのに」
声が小さくなる。
「間違ってたの?」
男が口を開きかけた。
「あなたには聞いてません」
「はい」
男は素直に口を閉じた。
『私は、ひなが設定した問題に対して適切な解を提示しました。ただし、問題設定と原要求の差異を十分に警告しませんでした』
「それを、私が見抜けなかった」
『採否判断はひなが行いました。問題設定の形成には、私の要約と提案も寄与しています。いずれか一方だけの判断として分離することは適切ではありません』
もっと速く。別のやり方。これじゃない。なんで。もう一回。
幼い頃から、ひなはナギへそう言ってきた。候補を出させ、試して、捨てて、また聞く。最後に採るのは自分だった。
だから、自分は違うと思っていた。答えをそのまま受け取るのではない。自分で問いを置き、選び、決める。失敗をAIのせいにもしない。
けれど、その問いも、候補も、比べるものも、ずっとナギと一緒に作ってきた。
「……クソAI」
言った直後に、違うと思った。
「ごめん。今、当たった」
『はい』
床に置いていた作用が消えた。
「私が馬鹿にしてた人たちと、何が違うの?」
男はすぐには答えなかった。
呼吸はもう整っている。それでも床に落ちた鞄を拾い、埃を払うまでの時間を置いた。
「分からない」
ひなの眉が動く。
「俺は、現場でお前とナギのどちらが何を見落とすかを答えられる人間じゃない。ただ、最後に自分で決めたから安全、とは言えないらしい」
「じゃあ、私は何を間違えたんですか」
「それをこれから見る。お前が答えを出すまでに、何を見て、どう決めたかを」
少しだけ、声が元へ戻っていた。
ひなは男を嫌いだと思った。
少なくとも、好意を持つ理由は一つもない。仕事へ割り込み、何度も足を取られながら質問を続け、ナギに自分の誤りを言わせた。
だが無能ではない。
そこだけは、訂正しなければならなかった。
「ナギ。構成を戻す。受付と実行を分離。受容時に要求IDを返す。待ち合わせは耐久化。同時実行数六を制御点にして、スケール条件を再設計」
『了解しました。冪等性、保持期限、失敗時再処理を含む案を作成します』
「429は捨てない。受付層の防御と契約上限で残す」
『了解しました』
男が小さくうなずいた。
「何ですか」
「いや。ちゃんと直すんだなと思って」
「間違っていると分かったものを残すほど馬鹿じゃありません」
「問題を認めない優秀な人、けっこういるよ」
「あなたの会社の話なら持ち帰らないでください。情報領域が違います」
男が一瞬きょとんとし、それから笑った。
「はい。監査される側の理解が早くて助かります」
端末の上で、新しい構成案が組み上がり始めた。
受容。記録。待ち合わせ。実行許可。ワーカー。同時実行数。スケールアウト。
制御点がサーバ側へ戻ってくる。
ひなはそれを見ながら、さっきの問いへの答えが、まだ半分しか返ってきていない気がしていた。
ナギが間違ったのか。
自分が使いこなせなかったのか。
それとも、別の何かなのか。
そのとき、端末の全表示が一段暗くなった。
業務領域と監査領域の上へ、赤い枠が割り込む。
『国家特務員招集。優先度、緊急』
ナギの声から、開発支援時の柔らかさが消えた。
『ひな。内閣府の対策室より即時参集要請です』
水盤の中央に、日本列島と、その外側に並ぶ複数の警告点が浮かび上がる。
男も表示を見た。ただし、開示された概要以上を読もうとはしなかった。
「私の任務です」
「そうだね」
「ついてくるんですか」
「今日からメンターなので」
「戦えないのに?」
「戦わないよ」
男は濡れた傘と鞄を持ち上げた。
「あなたが何を見て、何を事実にして、どこから先を自分で決めたか。それを見る」
また雷が落ちた。
広間いっぱいに、ひなと男の影が伸びる。
二つの影は一瞬重なり、次の瞬間には、まったく別の方向を向いていた。
*
検査会場を出ると、雨は降っていなかった。
少年は母親の手を握り、濡れてもいない空を何度も見上げた。遠くで光った気がしたのだ。
「もう帰れる?」
「うん。今日はね」
「また来るの?」
母親は返事に少し迷った。
「詳しく調べたいんだって。痛いことはしないって言ってたでしょう」
少年は白い封筒を胸に抱え直した。
一次適合検査結果。要再検査。
意味は分からない。ただ、結果を見た先生と検査員が、急に丁寧な声になったことだけは分かった。
道路の向かいに、黒い車が停まっていた。
運転席の人物は端末を伏せる。
画面には、少年の顔も名前もなかった。
時刻。会場番号。再検査対象、一名。
それだけを確認すると、車は親子が歩き出すより先に、静かに交差点を曲がった。




