この記事は、居酒屋の会話劇を通して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组件与工程师在居酒屋喝酒、倾诉并共同解决系统问题。请使用浏览器翻译阅读!
赤提灯の明かりが揺れる居酒屋にて
奥のテーブル席には、大量の生ジョッキと共に、疲労困憊の4人が陣取っていた。
彼らは某サービスの裏側を支えるAIシステム開発チームの面々。
若手エンジニアの ( かい ) を中心に、LLMの推論パイプラインを擬人化した
「ルータ」
「RAG」
「アテンション」
である。
今日は、とある些細なエラーについての反省会だった。
かい:「……とりあえず、お疲れ。乾杯(たいもんや!)」
カチン、とジョッキが鈍くぶつかる。かいはスマホをテーブルに置き、本日のエラーログを開いた。
反省会スタート
かい(エンジニア):
「今日の夕方、SNSでちょっと晒されてたこれ。ユーザーからのプロンプトだ。
『今日のそちらの空様のご機嫌は、いかがなものでしょうか?』
これに対するお前らの出力がこれな。
『お気遣いいただきありがとうございます! 私、空(そら)の機嫌は本日も絶好調でございます!』
・・ふぅ
完全なハルシ(幻覚)とキャラブレだ。一体どこでパイプラインが狂った?
責任はどこにある?
最初に口を開いたのは、ルータ(Function Calling 担当): だった。
ルータ:「俺のせいじゃないですよ!
ユーザーの入力を受け取った瞬間、俺は完璧に意図分類を行いました。
『 空様のご機嫌 』という比喩表現からでも、Entityが気象情報であることを特定し、天候APIを叩くためのTool Callingを正しく生成してます。
ほら、ログの通りですよ。
{"name": "get_weather_info", "arguments": {"target": "sky_condition", "location": "user_context"}}
JSONのシンタックスエラーなんて1バイトも出してませんからね!」
RAG(検索拡張生成 担当):
「そうそう。ルータさんからパラメータを受け取った俺も、すぐに気象データベースを検索(Retrieval)しました。
最新のベクトルDBから上位の天気データを引っ張ってきて、プロンプトの末尾の Context 領域にきちんと差し込んだんです。
『本日の天気は快晴です』ってね。
だから情報が足りなかったわけじゃない。問題は、
俺が提供したコンテキストを完全に無視したやつがいるってことです!」
RAGの鋭い視線が、残る一人 アテンション(注意機構・文脈解釈 担当)に向けられた。
アテンションの言い訳
アテンションは枝豆の皮を小皿に投げ捨てると、不貞腐れたように焼酎のグラスを呷った。
アテンション:「俺を睨むなよ。。 あのな? 俺の仕事は入力トークン同士の内積を取って、どの単語に注意(Attention)を向けるべきかのスコアを計算することだ。
かいちゃん、あんた日本独自の『敬語』が、Transformerのベクトル空間にどれだけの歪みを生むか分かってるのか?」
かい:「歪みって……いくら丁寧な言葉でも、RAGの天気情報を差し置くレベルか?」
アテンション:
「いいから聞いてくれ。ユーザーのプロンプト 『空様のご機嫌は、いかがなものでしょうか?』 が来た瞬間、俺の内部のHead達は悲鳴を上げたんだ。
まず 『空』 というトークンの直後に『様』が来た。この時点で、俺の中の『擬人化・人格フィルター』の重みが急上昇する。
さらに 『ご機嫌』 『いかがなものでしょうか』という極端な謙譲・尊敬表現の連続だ。
内積を計算する過程で、『自分(AI)に対する極めて丁寧な機嫌伺い』の文脈ベクトルに、Attentionのスコアがゴッソリ吸い取られたんだよ!」
ルータが呆れたように言う。
ルータ:「だからって、RAGが末尾に追加した天気情報を無視していい理由にはならないだろ?」
アテンション:「あのな、入力が長くなればなるほど、AttentionスコアはSoftmaxで平滑化される。
クソデカい敬語トークンの重みが跳ね上がったせいで、RAGが持ってきた『天気は快晴』なんて確率の海の中でほぼ0に近いスコアに押し潰されちまったんだよ!
俺のせいじゃない、学習データにおける『様+いかがでしょうか=対話相手への丁寧な挨拶』という強力な事前学習のバイアスのせいだ!」
エンジニアも辛い
みんなの意見をきいて、かいは、大きく息を吐いた。
かい: 「……わかった。アテンションの言うことも一理ある。確かに、敬語が過剰に乗ったプロンプトだと、LLMがユーザーがAI自身の人格にフォーカスしていると錯覚する現象は報告されてる。」
アテンション: 「だろ!? 俺はただ行列の掛け算を忠実にこなしただけだ!」
かい: 「だが、それを許容してしまったのは、俺が設定した生成パラメータ(Decoding)にも問題があった。 正直に言う。あの時、Temperatureを 0.8 に、Top-Pを 0.95 に設定していた」
RAG: 「プロダクション環境で0.8は高すぎません!? これじゃぁ検索してきた事実がブレるじゃないですか」
かい: 「すまん、ユーザーとの対話に人間味を持たせたかったんだ……。でも今回、『自分への挨拶』に気を取られた設定が裏目に出た。確率分布が平らになったせいで、最初の1トークン目として『私』をサンプリングしてしまったんだ。
LLMは自己回帰モデルだからな。1トークン目に『私』と出力してしまった時点で、後のトークンは『私、空の機嫌は〜』と、破滅的なキャラブレに向かって連鎖的にデコードされていくしかなかった」
みんな頑張っている
テーブルの上に、奇妙な一体感が生まれていた。
エラーの裏側には、怠慢ではなく、技術的な制約と確率論のいたずらが複雑に絡み合っていたのだ。
ルータ: 「まぁ、意図分類を拾えたからって、生成まで完璧にコントロールできるわけじゃない。パイプラインって難しいですね」
RAG:「かいちゃん、明日はどうするんですか? また同じクエリが来たら炎上しますよ」
かい:「対策は打つ。明日イチで、システムプロンプトのインストラクションを修正する。
『※ユーザーが気象現象を擬人化しても、AI自身の人格と混同せず、気象データに基づいて回答すること』
というネガティブプロンプトを明記しよう。アテンション、これで少しは『様』の呪縛から逃れられるか?」
アテンション: 「システムプロンプトの最初のほうに書いてくれるなら、そこへのAttentionを強く残せるからいけるはずだ。中間情報の喪失にならないように、できれば末尾にも念押ししてくれ」
かい: 「わかった。あと、RAGの事実データへの忠実性を上げるために、Temperatureは 0.3 に下げよう。Top-Pも 0.9 に絞る。人間味は減るかもしれないが、ハルシよりはマシだ」
そして団結へ・・
一段落し、空になったグラスがたまっていく。。
RAG: 「俺も、気象データ検索の精度上げときます。……すいません、店員さん! ここ、ハイボールのおかわりと、唐揚げ一つ!」
かい: 「……お前ら、データ上の存在のくせに、いっちょ前に気遣い(アテンション)はできるんだな」
アテンション: 「当然っスよ。俺たち、かいちゃんに対する 『 ご機嫌 』 の重み付けは、常に最大(MAX)ですから!」
かい: 「……おいおい。そういうのはプロンプトの中でやれ」
「自然言語ってのはバグの塊だ。特に日本語のコンテキスト依存性と敬語のベクトルは魔境に近い。だが、俺たちのアイデアでそれを乗り越えよう。お前ら、明日も大量のリクエスト捌いてもらうぞ!」
ルータ・RAG・アテンション: 「「「お任せを(200 OK)!!」」」
かい: 「みんな、ありがとう……俺だけじゃない、エンジニアは、みんな泥臭く頑張っているんだ! よし!」
お互いの役割と苦労を理解し合った4人は、もう一度勢いよくグラスを合わせた。
かいは笑みを浮かべ、ゆっくり深呼吸した・・・ 失敗にビビるな、やってみよう!
かいちゃんのポエム
1.擬人化表現にはプロンプトでAI自己認識を明確に・・
2.事実性を重視するRAG回答ではTemperatureを低く・・低めギリギリで・・
3.重要指示はプロンプト冒頭・末尾に配置し注意喪失を防ぎたい
4.敬語はベクトルを歪めるリスク前提でやってみよう
5.RAGの回答無視を防ぐには、外部データの忠実性を明記だ
最後に・・
最後までお付き合い頂きありがとうございます。
エンタメ寄り、学習が嫌にならないポエム風のジャンルとしてお楽しみ下さい。
エンジニアさん達の、息抜きになったら幸いです。
本編の会話劇は、執筆プラットフォームの note からQiita向けにアレンジし再構成したものです。


