UKA-GYRE 開発記 ― 技術深掘り編 第3回
前回の記事:
この記事は「UKA-GYRE 開発記」 技術深掘り編 第3回 です。
同じ情報でも「どこに」「どう」渡すかで出力が180度変わる。この不安定さをどう飼い慣らしたかを解説します。
1. 冒頭の事件 ―― 「ISTJなのにポエム」
ある日、ISTJタイプのクライアントに対して生成されたコメントが、データと数字ではなく感情たっぷりの詩的な文体だった。
「数値に基づいた分析を重視し、具体的な行動提案を行うこと」と明記してあるのに、だ。
原因は 指示の内容ではなく「配置」 だった。
MBTIスタイルの指示をプロンプトの中盤に配置していたところ、終盤のRAG事例(温かく共感的な文体)にAIが引っ張られ、ルールより具体例を優先してしまった。
この事件から、UKA-GYREのプロンプト設計が始まった。
2. 7層プロンプトの配置哲学 ―― 配置は内容と同じくらい重要
7層プロンプトの「各層に何を書くか」は読み物編第4回で紹介した。
この記事では、 「なぜその順番なのか」 という設計判断に踏み込む。
2.1. Primacy Effect ―― AIは「先に聞いた話」を重視する
LLMは「最初に提示された指示」を最も忠実に守る傾向がある。
プロンプトの先頭近くに書いた指示ほど遵守率が高く、後半に書いた指示ほど「忘れられやすい」。
これはLLMの認知バイアスであり、会議や授業と同じだ。
最初に聞いた話が一番印象に残り、中盤は薄れやすい。
この性質を設計に活用した。
| 位置 | 配置する情報 | 設計意図 |
|---|---|---|
| 先頭(第1〜2層) | 役割定義 + MBTIスタイル | 「何者としてどう話すか」を最初に刷り込む |
| 中盤(第3〜5層) | 方針 + 数値 + 生データ | 判断材料を提供。事実ベースの領域 |
| 後半(第6層) | RAG事例 | 参考資料。先入観のフィルター越しに読ませる |
| 末尾(第7層) | 強制命令 | 最後の念押し。遵守率を底上げ |
2.2. MBTIスタイルを第2層に置いた理由
MBTIスタイルの指示は、ISTJのポエム事件を受けて中盤から第2層(最上位近く)に引き上げた。
引き上げた結果、スタイルの遵守率は劇的に改善した。
AIの「先入観」にスタイルを刷り込み、その後のすべての情報をスタイルのフィルター越しに処理させる。
この順番が鍵だった。
2.3. RAGコンテキストをあえて後半に置く理由
RAGコンテキストを第6層(後半)に置いたのも意図がある。
参考事例は有用だが、AIは事例の文言をそのままコピーしがちだ。
先にMBTIスタイルと戦略を「先入観」として植え付け、事例はあくまで「参考」として後から渡す。
これにより、「事例を参考にしつつも、このクライアントのスタイルで書く」行動を誘導している。
2.4. 「2回伝える」サンドイッチ構造
第2層で「どう話すか」を先頭近くで刷り込み、第7層で「何を参考にするか」を末尾で念押しする。
最初と最後に最重要ルールを配置するサンドイッチ構造だ。
なぜ同じことを2回書くのか。
2025年12月、Google Researchが興味深い研究結果を報告している(Prompt Repetition Improves Non-Reasoning LLMs)。
プロンプトをそのまま2回繰り返すだけで、LLMの正答率が有意に向上する。
70件の評価対象のうち47件で改善し、正答率が低下したケースはゼロだったという。
実際にこの構造を導入して以降、重要ルールの遵守率が明確に向上した。
3. Lost in the Middle問題とRAG4層防御
7層のプロンプトが長くなるにつれて、新しい問題が浮上した。 RAGの知識をAIがガン無視する。
苦労してナレッジベースを構築し、的確な過去事例を検索し、プロンプトに注入した。
なのにAIが「それっぽいが中身の薄い」汎用コメントを書いてくる。
原因は「Lost in the Middle」問題だ。
プロンプトが長くなるほど、AIは前半と末尾の情報に注意を集中し、 中間部の情報を軽視する 傾向がある。
7層プロンプトの中でRAGは第6層。
長いプロンプトの後半に位置するため、せっかくの知識がプロンプトの海に沈んでしまうのだ。
3.1. 4つの仕掛けで多層防御する
この問題を、4つの仕掛けを重ねた多層防御で解決した。
仕掛け1:構造的な分離。
RAGの参考事例を、他の情報と視覚的に分離した。
XMLライクなタグ(HTMLに似た開始・終了の目印)で<参考事例>と</参考事例>で囲み、プロンプトの中で「ここは特別なセクションである」とAIに認識させる。
📘 なぜXMLタグが効くのか
LLMは学習データの中でXML/HTMLタグを大量に見ているため、<タグ名>...</タグ名>という構造を「1つのまとまり」と認識しやすい。タグで参考事例を囲むと、AIが「ここから先は別の種類の情報だ」と判断し、地の文との混同を防げる。
地の文と参考事例の境界を曖昧にしない。
仕掛け2:前後挟み技法のRAGへの応用。
RAGセクションの 直前 に「以下の参考事例を必ず参照すること」、 直後 に「上記の参考事例を踏まえた上でコメントを生成すること」と、挟み撃ちにする。
AIが参考事例を読み飛ばそうとしても、その前後で二度念を押される構造だ。
仕掛け3:引用義務。
「参考事例の中から、今回の状況に最も近い事例を少なくとも1つ特定し、その要素をコメントに反映すること」と指示した。
漠然と「参考にしろ」ではなく、「どの事例をどう使ったか」を特定させることで、AIが事例を実際に読む動機を作る。
仕掛け4:ペナルティ宣言。
最後の層として、 「参考事例を無視した独自判断のみのコメントは不合格とする」 と明記した。
「参考にしてね」という穏やかな依頼より、「無視したら不合格」というペナルティの方がAIにはるかに効く。
この4つを重ねた結果、RAGの知識無視率はほぼゼロになった。
1つの対策では足りない。
構造・位置・義務・ペナルティの4層で防御して、ようやくAIは「過去の知恵」をきちんと活用するようになった。
4. temperature=1.0の冒険 ―― 制約が自由を生む逆説
推論パラメータの中で、最も意外な設定がtemperatureかもしれない。
UKA-GYREでは temperature=1.0 (創造性最高値)で運用している。
📘 temperatureとは
temperature(温度)はAIの出力の「ランダムさ」を制御するパラメータだ。0に近いほど毎回同じ安定した出力になり、1.0に近いほど多様で創造的になるがハルシネーションの危険性も増す。多くのプロダクションシステムでは0.3〜0.7に下げる。
最初は0.6で運用していた。安全だと思った。
しかし、2〜3週間運用するうちに異変に気づいた。
コメントが似たり寄ったりになる。
同じクライアントに同じような状況が続くと、AIは毎回ほぼ同じ表現を返してくる。
「今日もカロリーは少し控えめでしたね。タンパク質はしっかり摂れています」。
トレーナーから「AIっぽい」「テンプレート感がある」というフィードバックが増え始めた。
思い切って1.0に上げた瞬間、世界が変わった。
同じ「カロリーやや不足、タンパク質十分」の状況でも、ある日は食材の選び方に触れ、別の日はトレーニングとの関連に言及し、また別の日は週全体の流れから語りかける。
マンネリ化が消えた。
これは普通なら危険な設定だ。temperature=1.0は「暴走」と隣り合わせのはずだ。
UKA-GYREで1.0が成立する理由は、 7層プロンプトという「制約」が、自由を安全にしているから だ。
- MBTIスタイルが最上位で「どう話すか」を縛る。
- 内部ラベルが「何について話すか」を縛る。
- RAGの参考事例が「どのレベルで話すか」の基準を示す。
- RAG4層防御が「参考資料を無視する」暴走を封じる。
これだけの制約に囲まれていれば、temperatureを上げても出力は 「制約の中で」 揺らぐだけだ。
制約があるから自由にできる。制約がなければ、自由は暴走になる。
これは直感に反する逆説だが、UKA-GYREのプロンプト設計の核心はここにある。
5. S3ベースの動的設定管理 ―― 実験サイクルの速さが品質を決める
プロンプトのチューニングで最も重要なのは、 実験サイクルの速さ だ。
「この一文を加えたらどうなるか」。
答えは実験しないとわからない。
実験に30分かかるか30秒かかるかで、1日に回せる実験の回数が桁違いに変わる。
UKA-GYREでは、プロンプトに関する全ての設定をS3上のファイルで管理している。
プロンプトの文言、MBTIの定義、ラベルの説明文、推論パラメータ、RAG設定。
設定を書き換えれば、5分以内に反映される。
Lambda再デプロイは不要だ。
さらに、 カスタム版とデフォルト版の2段フォールバック構造 を持たせている。
実験的な設定はカスタム版としてアップロードし、問題があればカスタム版を削除するだけでデフォルトに戻せる。
ロールバックに要する時間はゼロだ。
プロンプトのハードコードは論外として、環境変数による管理でも「変更 → ビルド → デプロイ → 反映」のサイクルを回す必要がある。
S3ベースの動的ロードは、このサイクルから「ビルド」と「デプロイ」を完全に除去する。
6. プロンプト制御の設計哲学
プロンプトエンジニアリングに正解の方程式はない。だからこそ、変更可能性を最大化する。
7層の配置設計も、RAG4層防御も、temperature=1.0の冒険も、全て数十回の試行錯誤から生まれた。
MBTIスタイルの指示を中盤から第2層に移動しただけでISTJのポエム問題が消えたように、正解は理論からではなく実験から見つかる。
この試行錯誤を支えたのが、S3ベースの動的設定管理だ。
プロンプトの文言、MBTIの定義、推論パラメータ。全てがS3上のファイルとして管理され、Lambda再デプロイなしに反映される。
「この一文を加えたらどうなるか」を数十秒で検証できる。
変えるコストが低ければ実験の回数が増え、実験の回数が増えれば正解に近づける。
プロンプト制御の品質を決定づけたのは、プロンプトの巧みさではなく、実験サイクルの速さだった。
次回は、この制御エンジンと対をなす「学習エンジン」の話だ。
昇華バッチが「経験」を「知恵」に変える仕組みと、それを支えるCDKインフラの設計判断を語る。
コラム:嘘をつくAIと、詩を書くAIは同じ仕組みで動いている
AIが存在しない論文を引用したり、架空の事実をもっともらしく語る「ハルシネーション」。
多くの人がこれをバグだと思っている。しかし実はこれ、AIの「創造性の源泉」そのものだ。AIの内部には「事実のデータベース」と「空想のデータベース」が分かれているわけではない。
常に「次に来る確率が高い単語」を紡いでいるだけだ。
気の利いた比喩を生み出すメカニズムと、もっともらしい嘘を生み出すメカニズムは、全く同じだ。もしハルシネーションを完全に排除したら、AIはただの検索エンジンに戻ってしまう。
だからこそ、夢想家には夢を見させたまま、百科事典を持たせる。
RAG+7層プロンプトは、まさにその「創造性を殺さずに囲い込む」設計だ。
次回の記事:
「UKA-GYRE」開発記 シリーズ目次
読み物編 --- エンジニアでなくても楽しめる!
- プロローグ ― UKA-GYRE 開発記
- 読み物 第1回 ― ISTJには数字を、ENFPには共感を ― AIに「性格」を与えた日
- 読み物 第2回 ― 深夜3時はAIの経験値稼ぎタイム ― 「昇華」のメカニズム
- 読み物 第3回 ― カロリーの数字の裏にある物語 ― AIが「今日のあなた」を理解するまで
- 読み物 第4回 ― 「何を書くか」より「どう伝えるか」 ― AIを使った大人の実験科学
- 読み物 第5回 ― 「AIが書いた」ではなく「AIと一緒に書いた」 ― Human-in-the-Loopという思想(完結)
- 読み物 番外 ― 自分が作ったAIに食べ過ぎを怒られ続けた話 ― 開発者の裏側
技術深掘り編 --- 設計判断と実装の詳細
- 技術 第1回 ― RAG設計とベクトル化戦略 ― AIに数値の解釈をさせてはいけない
- 技術 第2回 ― ベクトル検索の品質最適化 ― 100%の検索精度は存在しない
- 技術 第3回 ― 7層プロンプトエンジニアリング ― たった1行がAIの人格を決める(この記事)
- 技術 第4回 ― 自己改善ループとサーバーレス基盤 ― 「勝手に賢くなるAI」は存在しない
- 技術 第5回 ― システムアーキテクチャ総覧(完結)
