この記事は、居酒屋の会話劇を通してLLM内部挙動や、効率的なプロンプトの書き方を、リラックスして理解することを目指した技術ポエムです
~ 休憩用にどうぞ。 LLMが愚痴をこぼしてます ~
- 🇯🇵 JA: この記事は、擬人化したLLM内部の担当が居酒屋でエンジニアと酒を飲み、愚痴り合いながら問題を解決するエンタメ学習物語です。
- 🇺🇸 EN: A tech comedy where personified LLM internals and engineers drink at a pub, vent, and solve system problems together. Enjoy learning via browser translation!
- 🇨🇳 ZH: 一篇技术喜剧小说:拟人化的LLM组件与工程师在居酒屋喝酒、倾诉并共同解决系统问题。请使用浏览器翻译阅读!
居酒屋にてAIの心臓部であるコンポーネントたちと
朝まで飲み放題を予約した昔ながらの座敷で、4人のテンションが上がる
彼らは某サービスの裏側を支えるAIシステム開発チームの面々。
若手エンジニアの ( かい ) を中心に、
LLMの推論パイプラインを擬人化した
「ルータ」
「RAG」
「アテンション」
である。
今日の愚痴はどんでもない方向へ広がっていった
かい: 「……とりあえず、お疲れ。乾杯(たいもんや!)」
カチン、とジョッキが鈍くぶつかる。かいはスマホをテーブルに置き、本日のログを開いた。
RAGとアテンションが愚痴りあう!反省会スタート
RAG・アテンション・ルータ: 「「「かいちゃん、今日もお疲れッス……」」」
かい(エンジニア):
「……はぁ。またカスタマーサポートからクレームのログが回ってきたよ。」
かい: 「今回のユーザーからのプロンプトはこれだ。」
常夏の星「ラグーナ」に3泊で旅行に行きたい。最高のプランを作って。
アテンション: 「出たよ、Zero-shot(事前情報なし)のクソデカ抽象プロンプト。
で、俺たちが出力した回答は?」
人気のラグーナですね
1日目:エメラルドビーチで、虹色の砂浜を観光
2日目:星の神殿、幻想的な5次元を体験
3日目:ラグーナ市場、名物、光る魚の踊り食い
楽しんできて下さい
かい: 「……この簡素すぎる出力のせいでユーザーがブチギレてる。『WEBサイトなら料金や交通手段やホテルが全部出るのになんだこの案内は! 旅行会社の方がマシだ!』ってな」
責任はRAGが検索しなかった事か?
最初に口を開いたのは、ルータ(Function Calling 担当): だった。
ルータ: 「俺のせいじゃないですよ!」
かいちゃん、言っとくけど俺は完璧に仕事したからな!
プロンプトを受け取った瞬間、俺のIntent Classification(意図分類)は『旅行プラン立案』を100%の確度でスコアリングした。即座にtool_callを発火させて、旅行データベースのAPIを叩いたんだ。
{"action": "search_tour", "params": {"destination": "ラグーナ", "nights": 3}}
このJSON、1文字の狂いもない美しいルーティングだぜ!?」
ルータがRAGをビシッと指差す。
RAG(検索拡張生成 担当):
RAG: 「待ってくださいよ。 ルータからパラメータ受け取った俺だって、ベクトルDB(Vector Database)の奥底からホテルの空き状況、星間クルーザーの運賃、価格比較サイトの最新情報まで全部RAG(検索拡張生成)で引っ張ってきたんですよ!」
「Top-Kを贅沢に100にして、合計50,000トークンもの分厚いコンテキスト(Context)をシステムプロンプトの末尾にぶち込んでやったんですからね!」
RAG: 「問題はそこから先でしょ? なんで俺が渡した『交通費』や『ホテル代』の豊富なコンテキストが、出力結果では箇条書きの観光地3つに圧縮されてるんっすか?」
RAGはジョッキをドンと置き、アテンションを横目で睨んだ。
アテンションが吠える。MHA、FFN総動員した
アテンションは唐揚げにレモンをかけると、不貞腐れたように焼酎のグラスを飲み干した。
アテンション: 「俺を睨むな!あのな? 俺のAttentionスコアのせいじゃない!!」
「まずユーザーに言いたい。 『最高のプラン』 ってなんだよ! 彼女とのハネムーンか? 貧乏学生の一人旅か? 予算も同伴者も不明な状態(Under-specified)で『最高』なんて抽象的なベクトルを出されたら、俺のMulti-Head Attentionのどのヘッドも重み(Weight)をつけられないんだよ!
だから安全牌として、誰にでも当てはまる『有名な観光地』のトークンにAttentionが収束しただけだ!」
かい: 「(頭を抱えて)……ユーザーからすれば、『AIなんだから過去の検索履歴や一般的な相場を考慮して、詳しく提案してくれるだろう』って過度な期待を持ってるんだよ。俺たちにとっての『文脈不足』は、ユーザーにとっては『気の利かないAI』にしかならない……」
アテンション: 「でも、かいちゃん。俺が文句を言いたいのはそこだけじゃないんだ。いくら情報不足とはいえ、あそこまで出力が切り詰められたのには 別の理由 がある。」
アテンションが声を潜めると、ルータとRAGも身を乗り出した。
真犯人がみつかる・・
アテンション: 「俺が推論を回してた時のモデルの重み、なんかいつもと違ったんだ。……あれ、現役クラスの重厚なパラメータじゃなかっただろ? 明らかに8B(80億パラメータ)クラスまで量子化されたINT4、超軽量モデルだったぞ!」
その言葉に、かい はギクッとして目を逸らした。
ルータ: 「おい、かいちゃん! まさか……」
かい: 「……ごめん。親会社がいま、完全に 火の車 なんだ。他に払うAPIの推論コストと、自社で立ててるGPUクラスタの維持費が高騰しすぎて、上の連中がブチギレたんだよ。」
かいは残っていたホッピーを一気に飲み干した。
かい: 「先週から、無料プランのユーザーが抽象的なクエリを投げてきた場合、API代をケチるために、裏側で勝手に 『軽量のオープンソースモデル』 に動的ルーティング(Dynamic Routing)させる仕様に変更されたんだ……」
RAG: 「(絶叫して)ふざけんなぁ!! 俺がせっかく高価な外部データ(Context)を持ってきたのに!
パラメータの少ないスモールモデルに長文を食わせたら、真ん中の情報が綺麗さっぱり忘れ去られる『Lost in the Middle(中間情報の喪失)』現象が起きるに決まってんだろうが!! そりゃホテル代も交通費も全部吹き飛ぶわ!!」
アテンション: 「さらにタチが悪いのは、インフラ側の予算設定だ! APIのmax_tokens(最大生成トークン数)の制限値が、無料ユーザー向けに 『256』 に絞られてたんだよ!
推論(デコード)の途中で強制終了される恐怖と戦いながら、俺がどれだけ苦労して『箇条書き』でまとめ上げたか!」
ルータ: 「俺たちがどんなに正確に関数を叩いて、精度の高い検索(RAG)をしても、推論するデコーダ(Decoder)の頭脳自体がダウングレードされてたら、出力される日本語は薄っぺらくなるに決まってるだろ!! 経営層の奴ら、モデルのコスト構造しか見てないのか!」
エンジニアも経営層も辛い・・
全員の怒りが、見えない「経営陣」へと向かった。
技術的に完璧な前処理をしても、インフラのコストカットの前には為す術がないという、AIエンジニアリングのリアルな地獄がそこにはあった。
怒りを吐き出しきり、少し落ち着いたテーブル。
ルータ: 「で、かいちゃん。どうするんだ? クレーム来たからって、無料ユーザー全員にフルの巨大モデルを回してたら、来月には会社が飛ぶぞ」
かい: 「……分かってる。親会社の台所事情は変えられないし、リソースの制約も事実だ。だからこそ、ソフトウェア側の設計(UX)でカバーしなきゃいけないんだ。」
RAG: 「かいちゃん……。これに対応しようと思ったら、『5万トークン爆食いRAG』の食い合わせが最悪すぎた。
「入り口はクソデカいのに、出口がストローの穴くらい狭い」
「TOP-Kとトークンはもっと節約しよう」
かいはおしぼりで顔を拭い、エンジニアとしての顔に戻った。
かい: 「ユーザーが『最高のプラン作って』とだけ言ってきた時に、無理に1ターンのやり取り(One-shot)で不完全な出力を作らせるのが間違いだったんだ。」
アテンション: 「じゃあどうするんだ?」
アイデアで進むしかない
テーブルの上に、奇妙な一体感が生まれていた。
かい: 「スロットフィリング(Slot Filling)の仕組みを、ルータの前の段に挟む。
プロンプト内に必須項目(出発日、予算、人数、旅行の目的)が不足している場合、RAGに検索させる前に、AI側から『誰と行かれますか? 予算はどれくらいを想定していますか?』と逆質問を投げるフローを作るんだ。」
RAG: 「なるほど。事前に情報を引き出して(Prompt Refinement)条件を絞り込めば、俺が取得するコンテキストも軽量化できる。軽量化できれば、8Bクラスの小さいモデルでも処理落ちせずに的確な回答ができるってわけか」
かい: 「ああ。ユーザーに『一度の魔法の質問』で答えを求めるのではなく、チャットUXを通じて対話的に情報を補完させる(Human-in-the-loop)設計にする。そうすれば、少ない計算リソースでも『旅行会社のような丁寧なヒアリング』を体験させることができるはずだ」
ルータ: 「良いんじゃないか? ルーティングの定義ファイルに『要件ヒアリング用モデル(最軽量・高速)』を追加しとくぜ」
アテンション: 「よし、そうと決まればさっさとシステムプロンプトの改修に取り掛かろうぜ。かいちゃん、今日は奢りな!」
かい: 「お前ら……俺の今月の予算もすでに量子化されてるんだが……」
全員: 「うわぁ、だから飲み放題の店しか連れてってくれないんですね」
そして団結へ
一段落し、殻になったグラスがたまっていく。。
RAG: 「俺も、もっと検索の精度上げときます。……すいません、店員さん! ここ、モンスターエナジーサワーのおかわりと、ソーセージ盛り合わせ一つ!」
かい: 「……お前ら、データ上の存在のくせに、いっちょ前に気遣い(アテンション)はできるんだな」
アテンション: 「当然っスよ。俺たち、かいちゃんに対する 『 ご機嫌 』 の重み付けは、常に最大(MAX)ですから!」
かい: 「……おいおい。そういうのはプロンプトの中でやれ」
「よし、今月中にプロンプトの改修テスト回すから、ユーザに対応しながら並行で会議するぞ!」
ルータ・RAG・アテンション: 「「「お任せを(200 OK)!!」」」
かい: 「みんな、ありがとう……俺だけじゃない、エンジニアは、みんな理想と現実を振り分けて頑張っているんだ! よし!」
お互いの役割と苦労を理解し合った4人は、もう一度勢いよくグラスを合わせた。
かいは笑みを浮かべ、ゆっくり深呼吸した・・・ 失敗にビビるな、やってみよう!
かいちゃんのポエム
1.入力データはLLMに渡す前にDB側で絞り込むとしよう
2.コンテキスト窓の広さとモデルの知能は別ものだね
3.出力枠256なら最初から数件に厳選してみよう
4.経営コスト制限を設計の初期に組み込めてたらなぁ
5.スロットフィリングで対話を重ねて必要な推論だけにしたい
最後に
最後までお付き合い頂きありがとうございます。
エンタメ寄り、学習が嫌にならないポエム風のジャンルとしてお楽しみ下さい。
エンジニアさん達の、息抜きになったら幸いです。
本編の会話劇は、執筆プラットフォームの note からQiita向けにアレンジし再構成したものです。


