🎓 レベル:標準 | 重要度:A(必須)
⚠️ 要最新確認:LLM のツール・スペックは変化が速い。本ノートの具体名は執筆時点(2026-06)の例。
要点(BLUF)
- LLM アプリの運用基盤は3層で捉えます:プロンプト管理(入力の設計と版管理)・推論(モデル呼び出し:API かセルフホスト)・オーケストレーション(複数ステップ・外部連携・分岐の制御)。
- 最大の発想転換は「プロンプトはコードである」。プロンプトは版管理・評価・テスト・レビューの対象です。プロンプトを変えれば出力が変わる——再現性とトラッキング(実験トラッキング)の対象に LLM では「プロンプト」が加わります。
- LLM の原理(Transformer・トークン化・サンプリング)は機械学習分野(LLMの全体像)へ。ここは「それを本番アプリとして運用する」基盤に集中します。
1. 3層の構成
flowchart TB
subgraph アプリ層
P["プロンプト管理:テンプレート・版・変数"]
O["オーケストレーション:多段・分岐・外部連携"]
end
subgraph 推論層
M["モデル呼び出し:API or セルフホスト"]
end
U["ユーザー入力"] --> O
O --> P
P --> M
M --> O
O --> R["応答"]
O -.->|"必要に応じて"| EXT["外部:検索 RAG ツール"]
| 層 | 役割 | 運用の関心 |
|---|---|---|
| プロンプト管理 | 入力テンプレートの設計・版管理 | 版・評価・ABテスト |
| 推論 | モデルを呼んで生成 | 遅延・コスト・可用性 |
| オーケストレーション | 多段処理・外部連携・分岐 | 信頼性・トレース・エラー処理 |
2. プロンプトはコードである
プロンプトを「設定ファイルの文字列」程度に扱うと運用が破綻します。プロンプトの少しの変更で出力品質が大きく変わるのに、版管理も評価もなければ「いつ・なぜ品質が変わったか」が追えません。プロンプトは:
- 版管理する(Git・専用のプロンプトレジストリ)
- 評価する(テストケースに対する出力品質を測る、LLMの評価・ガードレール・コスト管理)
- トラッキングする(どのプロンプト版でどの出力が出たか、実験トラッキング)
3. 推論:API かセルフホストか
| API(マネージド) | セルフホスト | |
|---|---|---|
| 導入 | 速い | 重い(GPU・運用) |
| コスト | 従量(トークン単価) | 固定(インフラ)+運用 |
| 制御・機密 | 限定的 | 完全(LLMの推論サービングと最適化基盤) |
| 向き | 立ち上げ・変動負荷 | 大量・機密・低レイテンシ要件 |
まず API で始め、コスト・機密・制御の要件が強まればセルフホスト(LLMの推論サービングと最適化基盤)を検討する、が定石です(要最新確認)。
4. 動く最小例:プロンプトを版管理して出力を比較する
LLM 本体は呼ばず、プロンプトの版管理・テンプレート展開・出力比較の仕組みを最小化します(LLM 呼び出しはダミー関数で代替)。
from string import Template
# プロンプトレジストリ:版ごとにテンプレートを保持
prompt_registry = {
"summarize_v1": Template("次の文章を要約して: $text"),
"summarize_v2": Template(
"次の文章を、専門用語を避けて3文以内で要約して:\n$text\n要約:"),
}
def render(version, **vars):
return prompt_registry[version].substitute(**vars)
def fake_llm(prompt):
"""LLM呼び出しの代理:プロンプトの特徴で出力品質を擬似評価。
実運用では実際のLLM API を呼ぶ(要最新確認)。"""
quality = 0.5
if "3文以内" in prompt:
quality += 0.3 # 制約が明確だと品質が上がる想定
if "専門用語を避けて" in prompt:
quality += 0.15
return {"text": "(要約結果)", "quality_score": round(quality, 2),
"prompt_chars": len(prompt)}
text = "MLOpsはMLライフサイクルを継続的に回す運用規律である。"
for v in ["summarize_v1", "summarize_v2"]:
prompt = render(v, text=text)
out = fake_llm(prompt)
print(f"{v}: 品質={out['quality_score']} プロンプト長={out['prompt_chars']}文字")
出力:
summarize_v1: 品質=0.5 プロンプト長=41文字
summarize_v2: 品質=0.95 プロンプト長=59文字
出力の意味:プロンプトを版として管理し、同じ入力に対して v1 と v2 の出力品質を比較できました(ここでは制約を明確にした v2 が高品質という想定)。重要なのは仕組み——プロンプトに版番号を与え、テンプレートとして展開し、出力を評価・比較する。これがあれば「どのプロンプト版が本番か」「変更で品質がどう動いたか」を追え、プロンプトをモデルと同じく管理対象にできます。実際の品質評価はLLMの評価・ガードレール・コスト管理の手法で行います(要最新確認)。
5. 運用の勘所
- プロンプトを版管理する:本番プロンプトを Git/レジストリで管理し、変更を追える・戻せるようにする。
- オーケストレーションにトレースを入れる:多段処理のどこで何が起きたかを記録する(LLM版の可観測性、エージェントの運用と評価)。
- 推論の失敗に備える:API のレート制限・タイムアウト・障害に対し、リトライ・フォールバック・キャッシュを設計する。
- モデル/プロンプトの差し替えを疎結合に:オーケストレーション層からモデルとプロンプトを抽象化し、入れ替え可能にする(LLM ゲートウェイ、LLMの評価・ガードレール・コスト管理)。
なぜそうするのか
LLM アプリを3層に分け、特にプロンプトを「コード」として扱うのは、LLM では振る舞いの大半がプロンプトとオーケストレーションで決まるからです。モデルが同じでも、プロンプトの一語や処理フローの一段で出力品質が大きく変わります。これを版管理・評価・トレースの下に置かなければ、従来の ML 以上に「なぜ品質が変わったか分からない」状態に陥ります。3層に整理することで、それぞれを独立に管理・改善・差し替えできるようになります。
⚠️ よくある落とし穴
- プロンプトをコードに直書きして管理しない:変更履歴も評価もなく、品質変動の原因を追えない。版管理する。
- 推論の失敗を想定しない:API 障害・レート制限でアプリ全体が落ちる。リトライ・フォールバックを設計する。
- オーケストレーションにトレースがない:多段処理のどこで失敗したか分からない。各ステップを記録する。
- LLMの原理をここで論じる:Transformer・サンプリングは機械学習(LLMの全体像)。ここは運用基盤に集中。
対応 lab
- なし(概念ノート)。プロンプト版管理の仕組みは本文 §4。トラッキングは 実験トラッキング の lab を流用できます。
関連ノート
- RAGとベクトルデータベース(外部知識の取り込み)
- エージェントの運用と評価(多段オーケストレーション)
- LLMの評価・ガードレール・コスト管理(プロンプト/出力の評価)
- LLMの推論サービングと最適化基盤(セルフホスト推論)
- LLMの全体像(機械学習・LLMの原理)
- 第7章 LLM・生成AIの運用基盤 目次
- MLOps・AI基盤 全体目次