Home LaunchDarkly公式解説: AI ConfigsによるLLMプロンプトの段階的ロールアウトとランタイム制御
投稿
キャンセル

✍️ LaunchDarkly公式解説: AI ConfigsによるLLMプロンプトの段階的ロールアウトとランタイム制御

ブログ概要(Summary)

LaunchDarkly AI Configsは、LLMアプリケーションにおけるモデル設定・プロンプト・ツール定義をランタイムに制御するための機能である。コードデプロイなしでモデル切り替え・プロンプト更新・段階的ロールアウト(5%→25%→100%)を実現し、ユーザーセグメント別のターゲティング・メトリクスベースの実験を可能にする。Completion Mode(単一ステップ補完)とAgent Mode(マルチステップワークフロー)の2つの動作モードを提供する。

この記事は Zenn記事: LLMプロンプト管理CI/CD:Langfuse×LaunchDarklyでA/Bテストと安全ロールアウト の深掘りです。

情報源

技術的背景(Technical Background)

LLMアプリケーションの本番運用では、以下の課題が顕在化している:

  1. モデルバージョン管理: GPT-4o → GPT-4o-mini への切り替えをコードデプロイなしで行いたい
  2. プロンプト変更の影響範囲制御: プロンプト変更を全ユーザーに一括適用するリスクを避けたい
  3. ユーザーセグメント別最適化: 無料/有料ユーザーで異なるモデル・プロンプトを使いたい
  4. コスト制御: トラフィック量に応じてモデルを動的に切り替えたい(ピーク時はGPT-4o-mini、通常時はGPT-4o)

LaunchDarkly AI Configsは、これらの課題をFeature Flag基盤の上に解決する。Zenn記事ではLaunchDarklyのランタイム切替の概要を紹介したが、本記事では公式ドキュメントベースでCompletion Mode / Agent Modeの技術的詳細と実装パターンを深掘りする。

実装アーキテクチャ(Architecture)

AI Configsのデータモデル

AI Configsは単一のリソースとして、以下のコンポーネントで構成される:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
AI Config
├── variations: [                 # バリエーション(複数定義可能)
│   ├── Variation A: {
│   │   model: { name: "gpt-4o", temperature: 0.3 },
│   │   messages: [
│   │     { role: "system", content: "..." },
│   │     { role: "user", content: "" }
│   │   ]
│   │ }
│   └── Variation B: {
│       model: { name: "gpt-4o-mini", temperature: 0.5 },
│       messages: [
│         { role: "system", content: "..." },
│         { role: "user", content: "" }
│       ]
│     }
│ ]
├── targeting_rules: [            # ターゲティングルール
│   ├── Rule 1: "premium users" → Variation A
│   └── Rule 2: "free users" → Variation B
│ ]
├── rollout: {                    # 段階的ロールアウト設定
│   percentage: 25,               # Variation Aを25%のトラフィックに適用
│   fallback: "Variation B"
│ }
└── metrics: {                    # 自動トラッキング
    generation_count,
    token_usage,
    satisfaction_rate
  }

Completion Mode vs Agent Mode

Completion Mode: 単一ステップの補完に使用。メッセージとロールでプロンプトを構成する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Completion Mode の実装例
const aiConfig = await aiClient.completionConfig(
  "article-summarizer",           // AI Config名
  { kind: "user", key: userId },  // ユーザーコンテキスト
  { enabled: false },             // デフォルト値(フォールバック)
  { article: articleText }        // テンプレート変数
);

if (!aiConfig.enabled) {
  return fallbackSummarize(articleText);
}

const completion = await aiConfig.tracker.trackOpenAIMetrics(
  async () => openai.chat.completions.create({
    messages: aiConfig.messages ?? [],
    model: aiConfig.model?.name ?? "gpt-4o",
  })
);

Agent Mode: マルチステップのワークフローに使用。命令文とオプショナルなツール定義で構成する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Agent Mode の実装例(マルチエージェント)
const agentConfig = await aiClient.agentConfig(
  "research-agent",
  { kind: "user", key: userId },
  { enabled: false },
  { query: userQuery }
);

// 命令文とツール定義をランタイムで取得
const instructions = agentConfig.instructions;
const tools = agentConfig.tools;

// LangGraphやOpenAI Agents SDKとの統合
const agent = new Agent({
  instructions: instructions,
  tools: tools,
  model: agentConfig.model?.name
});

Agent Modeでは、ツールの追加・削除・パラメータ変更もコードデプロイなしで実行可能。

SDK統合(5言語対応)

LaunchDarkly AI SDKは以下の言語をサポート:

言語パッケージ備考
Node.js@launchdarkly/server-sdk-aiサーバーサイド用
Pythonlaunchdarkly-server-sdk-aiFastAPI/Django統合
.NETLaunchDarkly.ServerSdk.AiASP.NET Core対応
Gogithub.com/launchdarkly/go-server-sdk-ai高パフォーマンス用
Rubylaunchdarkly-server-sdk-aiRails統合

Node.js実装の完全例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { init } from "@launchdarkly/node-server-sdk";
import { initAi } from "@launchdarkly/server-sdk-ai";
import OpenAI from "openai";

// LaunchDarklyクライアント初期化
const ldClient = init(process.env.LAUNCHDARKLY_SDK_KEY!);
await ldClient.waitForInitialization();
const aiClient = initAi(ldClient);

export async function summarize(
  userId: string,
  text: string
): Promise<string> {
  // AI Configから設定を取得
  const aiConfig = await aiClient.completionConfig(
    "article-summarizer",
    { kind: "user", key: userId },
    { enabled: false },
    { article: text }
  );

  // フォールバック(Feature Flagが無効の場合)
  if (!aiConfig.enabled) {
    return fallbackSummarize(text);
  }

  // メトリクス自動トラッキング付きのOpenAI呼び出し
  const completion = await aiConfig.tracker.trackOpenAIMetrics(
    async () => new OpenAI().chat.completions.create({
      messages: aiConfig.messages ?? [],
      model: aiConfig.model?.name ?? "gpt-4o",
    })
  );

  return completion.choices[0].message.content ?? "";
}

パフォーマンス最適化(Performance)

段階的ロールアウト戦略

Zenn記事で紹介した段階的ロールアウト(5%→25%→100%)の技術的実装:

flowchart TD
    A["新プロンプト / モデル変更の準備\nVariation B を AI Config に追加"] --> B["LLM Playground\nデプロイ前に動作確認"]
    B --> C["ステージ1: カナリアリリース 5%\nCanary Group のみ Variation B を適用\nメトリクスを監視"]
    C --> D{品質・レイテンシ\nSLA 内か?}
    D -->|"問題あり"| E["即座にロールバック\nFeature Flag を OFF に\nミリ秒単位で全インスタンスに伝播"]
    D -->|"問題なし"| F["ステージ2: 段階拡大 25%\nrollout percentage=25\nbucket_by=user_id で一貫した割り当て"]
    F --> G{統計的有意差\nあり?}
    G -->|"有意差なし"| H["追加サンプル収集\n500リクエスト/バリアント以上"]
    H --> G
    G -->|"Variation B 優位"| I["ステージ3: フルロールアウト 100%\ndefault_variation=Variation B\nターゲティング OFF"]
    I --> J["Langfuse で本番監視\nメトリクスを継続収集"]
    J --> K["次回最適化サイクル\nDSPy / OPRO の訓練データとして還元"]

ステージ1: カナリアリリース(5%)

1
2
3
4
5
ターゲティングルール:
  IF user.id IN canary_group THEN
    → Variation B (新プロンプト)
  ELSE
    → Variation A (現行プロンプト)

ステージ2: 段階拡大(25%)

1
2
3
ロールアウト設定:
  percentage: 25
  bucket_by: "user_id"  # ユーザー単位で一貫したバリアント割り当て

ステージ3: フルロールアウト(100%)

1
2
targeting: OFF
default_variation: Variation B

メトリクスダッシュボード

AI Configsは以下のメトリクスを自動収集する:

メトリクス説明判定基準例
Generation Count各バリエーションの呼び出し回数統計的有意性の確認
Token Usage入力/出力トークン数コスト比較
Latency応答時間(p50, p95, p99)SLA遵守
Satisfactionユーザー満足度スコア品質ゲート

LLM Playground

AI Configsに統合されたLLM Playgroundで、デプロイ前にプロンプトの動作確認が可能:

  1. LaunchDarkly UIでプロンプトを編集
  2. Playgroundでテスト入力に対する応答を確認
  3. 問題なければバリエーションとして保存
  4. ターゲティングルールを設定してロールアウト

運用での学び(Production Lessons)

Langfuseとの使い分け

機能LangfuseLaunchDarkly AI Configs
プロンプトバージョニング○(線形バージョン)○(バリエーション)
A/Bテスト○(ランダム選択)○(ターゲティング対応)
段階的ロールアウト△(手動)○(%指定で自動)
ユーザーセグメント別△(アプリ側実装)○(ターゲティングルール)
オブザーバビリティ○(詳細トレーシング)△(メトリクスのみ)
コスト無料(OSS版)有料(エンタープライズ)
セルフホスト×

推奨アーキテクチャ: LangfuseとLaunchDarklyは競合ではなく補完関係。Langfuseは詳細トレーシング・評価・プロンプト開発に、LaunchDarklyは段階ロールアウト・ターゲティング・緊急ロールバックに使う。

緊急ロールバック

1
2
3
4
// 緊急時: Feature Flagを無効化して全トラフィックをフォールバックに
// LaunchDarkly UIから1クリック、またはAPI:
await ldClient.variation("article-summarizer", user, { enabled: false });
// → 全ユーザーがfallbackSummarize()を使用

ロールバック完了までミリ秒単位。LaunchDarkly SDKのストリーミング接続により、フラグ変更はリアルタイムに全インスタンスへ伝播する。

RAG構成管理への応用

AI Configsの高度な応用として、RAG(検索拡張生成)の構成要素もランタイム制御できる:

  • 検索戦略: どのベクトルインデックスを使用するか
  • チャンキング戦略: チャンクサイズ・オーバーラップの設定
  • プロンプト構成: 検索結果の注入方法
1
2
3
4
5
6
7
8
9
10
const ragConfig = await aiClient.completionConfig(
  "rag-pipeline",
  { kind: "user", key: userId },
  { enabled: false },
  {
    query: userQuery,
    retrieval_source: "pinecone-v2",  // LaunchDarklyで切替可能
    chunk_size: 512                    // LaunchDarklyで調整可能
  }
);

学術研究との関連(Academic Connection)

Feature Flagの学術的位置づけ

Feature Flagは元来、ソフトウェアエンジニアリングのデプロイ手法として研究されてきた。LLMアプリケーションへの応用は、以下の学術的文脈に位置づけられる:

  • MLOps (Symeonidis et al., 2022): 機械学習の運用ライフサイクル全体の管理
  • Continuous Experimentation: A/Bテストと段階的ロールアウトの体系的実施
  • Safety-Critical ML Deployment: 医療・金融など高リスクドメインでの段階的導入

LaunchDarkly AI Configsは、これらの学術的知見を製品化したものと位置づけられる。特にOPRO(arXiv: 2309.03409)やDSPy(arXiv: 2310.11511)で最適化されたプロンプトを安全にデプロイする出口としてのFeature Flag基盤の役割が重要。

Langfuseフィードバックループとの統合

  1. DSPy/OPROで最適化 → 候補プロンプト生成
  2. Promptfooで品質ゲート → CI/CDで自動評価
  3. LaunchDarkly AI Configsで段階ロールアウト → 5%→25%→100%
  4. Langfuseで本番監視 → メトリクス収集
  5. フィードバック → 次回DSPy/OPRO最適化の入力

まとめと実践への示唆

LaunchDarkly AI Configsは、LLMアプリケーションの「デプロイの最後の一マイル」を安全にする。Zenn記事の3層防御アーキテクチャにおけるLayer 2(Feature Flag段階的ロールアウト)の実装基盤として、プロンプト変更による本番障害ゼロの実現に寄与する。

月間10万リクエスト以上のプロダクションでは、LaunchDarklyのターゲティング・段階ロールアウト・リアルタイムメトリクスのROIが特に高い。10万リクエスト未満の場合は、Langfuseのラベル機能によるシンプルなA/Bテストで十分にスタートできる。

参考文献

この投稿は CC BY 4.0 でライセンスされています。

Langfuse公式解説: OSSプロンプト管理基盤とA/Bテスト実装の技術詳細

論文解説: TextGrad — テキスト自動微分によるLLMパイプライン最適化フレームワーク