LLMを使わないという選択(あるいはラリー回数最小化への志向)
概要
作業って大体以下みたいなフローを無限にイテレートするだけ
仮説(頭)→実装(頭・体)→検証(体)
LLMを用いた作業=マルチスレッド化するということ.
誰かと一緒に作業していると言っても良い
検証を待っている分には良い.ただ,仮説を作り出そうとしたり,実装をしてもらう分には,ストレスがかかる.
検証待ちのためにマルチスレッドになるということと,仮説立案・実装のためにマルチスレッドになることは違う
これは体と頭の問題
検証待ちは体の作業であり,頭は本質的にはマルチスレッド的にはならない
検証待ち=ユーザを待たせる処理のprintデバッグや機械学習モデルの学習.そういう否が応でも待たなければならないものの傍に,別の作業をすることは誰にでもあるはず
事象に対する検証と,他人の思考に関する検証は本質的に異なる作業
一方,仮説・実装は頭のマルチスレッド化に等しく,別のタスクを傍らにやっていても「LLM待ちが起こる」
LLMが一発で所望の出力をしてくれるわけではない
つまりLLMとの問答=ラリーが発生する
「いや,それはこの分野では計算量的にありえないだろ」とか「あ,それ筋悪いよ絶対」とか思う一方,出力はかなりの複雑さを有しているため,簡単にdisentangleできるものではない.
出力をdisentangleして自分で書いていくのも面倒なので,結局LLMとのラリーが増えて,時間が減っていく
結局,思考の外部化は,①中程度の時間的スパンかつ,②非会話的な構造でやるべき
考えたくない・考える時間がないから外部化しているのに,会話=思考のラリーが発生してしまっては元も子もない.
人間によく言う「1週間後までに考えといて」は,会話数が最小化されるからこそ良い
会話数が多ければ,それはもはや自分が考えているのに近しい.
だからdevinやcursorのようなエージェント型のほうが良いってわけ
非エージェント型AIは1から10まで言わないと望ましいものを出してくれない人間と一緒に作業しているのと同じ
人間は会話が増えるとストレスが貯まる
会話が発生しないようにするには,マネジメント(prompt tuning)か教育(暗黙知=1から9までを脳内NNに覚えておいてもらって,残りの10だけをやってもらう)が必要
ただ,LLMは我々のバックグラウンド(1から9まで)を知らない=人間がpromptにねじ込んでいかないといけないのが問題
どうすればいいのか?
何が嫌だったのか
ラリー回数が多い
コードベース全体の99%をLLMが書いていたら,メンタルモデルを構築しなければならない
当然,その99%が何度も更新されるとなると,その度に構築し直さなければならない
何が嬉しいのか
自分には難しい(面倒な)タスクを解いてくれる
ではどうするか?
$ e(t) := \mathbb{E}\left\lbrack\frac{d(t)}{r(t)\times c(t)}\right\rbrack
$ t: タスク
$ d(t): タスク$ tに対する大変度合い
$ r(t): ラリー回数
$ c(t): コード数 (文字数) ← メンタルモデルへの影響
$ e(t)が,経験則的に規定された,ある一定の閾値 $ \thetaを超えている($ e \ge \theta)なら,LLMを使ったほうが良い
逆に超えてないなら,それは自分で書いたほうが楽
自然言語による判定基準
難しすぎる?面倒くさすぎる?意図を伝えるの大変?それはLLMでしかできないものなの?
常にLLMによるメリットとラリー回数を天秤に掛けるべし.
例
自分ひとりでは全くもって出来るものではない
LLM
2回ラリーしてみたけど,ラリーが増えそうだ
自分
コードのこの部分だけ〇〇になるように直してほしい
$ c(t)が小さいからLLM
これの言い回しを変えてほしい
2回ラリーで収まるならLLM
英語に翻訳してほしい
非LLMで代替できるので自分(DeepL / google translate)
(DeepLの中でLLMが走っているかもしれないが,$ r(t) = 0なので関係ナシ)
論文の英語に翻訳してほしい
$ d(t)が大きいからLLM
拡散モデルのコードを書いてほしい
$ d(t)が大きくて$ c(t)もデカいから,自分
これのバグが取れない
$ d(t)が大きいが,$ r(t)が小さいからLLM
この文章について批判的にチェックして
岡目八目=$ d(t)がでかすぎるので,LLM
これについて解説してほしい
キャッチアップするのが大変だから$ d(t)が大きい → LLM