LabHub

ブログ

AI Engineering 実戦 — LLM API・RAG・Agent・LoRA/DPO・Vector DB・評価・Observability・Prompt Injection (2025)

한국어English日本語

なぜ「AI Engineering」が独立した領域になったのか

AIエンジニアが実際に解く問題:

従来のSRE/バックエンドとは別の領域。本稿は実戦プレイブック。


Part 1 — LLM API呼び出し、本当の姿

トイ例を超えて

# 素朴版
response = client.chat.completions.create(model="gpt-4o", messages=[...])
return response.choices[0].message.content

本番は6つの関心事をラップする必要がある:

  1. Retry + Exponential Backoff — レート制限、一時的エラー。
  2. Timeout — デフォルトは長すぎる (60秒+)。
  3. Streaming — Time-to-First-TokenがUX。
  4. Token Counting — Contextリミット未満を維持。
  5. Logging / Observability — リクエスト・レスポンス・レイテンシ・コスト。
  6. Fallback — プロバイダ障害時にモデル切替。

Streamingパイプライン

async for chunk in client.chat.completions.create(..., stream=True):
    delta = chunk.choices[0].delta.content
    if delta:
        yield delta

バッファし、句読点でflush、TTFT (Time-to-First-Token) をSLOとして計測。

Structured Output


Part 2 — RAGは「検索」ではない

素朴パイプライン (と破綻する理由)

  1. ドキュメント分割 → 2. Embedding → 3. Vector DB格納 → 4. Top-k Cosine検索 → 5. Promptに詰める。

何が壊れるか:

2025年RAGスタック


Part 3 — Agents

コアパターン

フレームワーク (2025)

本番のハマりどころ


Part 4 — Fine-tuning: いつやり、いつやらないか

まずFine-tuningしない

Prompt Engineering + RAG + Few-shotで90%のケースはより安く・速く・更新可能な知識で解ける。

Fine-tuningするとき

手法

スタック


Part 5 — Vector DB決定マトリクス

DB種別強み弱み
pgvectorPostgres拡張リレーショナルと同居、トランザクション特化スケールに劣る
QdrantRust nativeフィルタ、高速別サービス
WeaviateJavaモジュール、Hybrid重量級
MilvusC++スケール (10億級)運用複雑性
Pineconeマネージド運用ゼロ高価、ロックイン
Turbopufferマネージド、安価安いコールドストレージ新興
LanceDB埋め込みローカル、シンプル小規模向き

2025年のデフォルト: pgvector。ベクタ数>10Mまたは高度フィルタが必要なら Qdrant。運用がボトルネックなら Pinecone/Turbopuffer。


Part 6 — 評価: 難問中の難問

なぜ難しいか

レイヤード・アプローチ

  1. Promptのユニットテスト — pytestフィクスチャ、回帰用ゴールデン出力。
  2. LLM-as-judge — 安価・ノイジー。GPT-4oで採点、人手でキャリブレーション。
  3. タスク特化メトリクス — 要約にBLEU/ROUGE、抽出にExact Match。
  4. RAGメトリクス — Ragas: Faithfulness、Answer Relevance、Context Precision。
  5. 人手評価 — 小規模・集中、Ground Truthキャリブレーション用。
  6. 本番テレメトリ — 👍/👎、セッション分析。

ツール

Langfuse、LangSmith、Phoenix (Arize)、Braintrust、Weights & Biases、Helicone。


Part 7 — コスト最適化

規模では $1 の節約が効く。

  1. モデル階層化 — 易しいクエリはHaiku/mini、必要時だけSonnet/GPT-4にエスカレーション。
  2. Prompt Caching (Anthropic・OpenAI) — キャッシュプレフィックスに90%割引。
  3. Batch API — 50%割引、非同期。
  4. Structured Outputs — パース失敗によるリトライ削減。
  5. Context Pruning — 古いターンは要約、逐語しない。
  6. Semantic Caching — Redis + Embeddings、ヒット率20–40%は普通。
  7. 短いPrompt — 全トークン課金される。

Part 8 — セキュリティ: Prompt Injection とデータ漏洩

攻撃面

防御 (多層防御)

  1. SystemとUserを分離 — User入力をSystem Promptに連結しない。
  2. 入力バリデーション — 疑わしいパターンを除去、長さ制限。
  3. 出力バリデーション — 疑わしい出力は拒否/再プロンプト。
  4. Toolアローリスト + 権限 — LLMが本番DBに直接触らない。
  5. 高リスクToolはHuman-in-the-loop (メール送信、決済)。
  6. サンドボックス — Code Interpreterは隔離コンテナ。
  7. Prompt Shields (Azure AI Content Safety、Lakera Guard)。
  8. 監査ログ — 全Tool呼び出しに対して。

OWASP LLM Top 10が正典。


Part 9 — Observability

Observabilityのないアプリは盲目。最低限:

ツール: Langfuse (OSS、セルフホスト可)、LangSmith (LangChain有料SaaS)、Phoenix (Arize、OSS)、HeliconeBraintrust


Part 10 — 本番12項目チェックリスト

  1. Retry + Exponential Backoff + Jitter?
  2. Timeoutを明示 (デフォルトじゃない)?
  3. Streaming有効、TTFT計測?
  4. Token Counting + Contextガードレール?
  5. Structured OutputsまたはバリデーションJSON?
  6. RAGはHybrid + Re-ranker + Citation?
  7. AgentはStep Cap + Tool予算?
  8. 評価スイートがCIで走る (Golden + LLM-judge)?
  9. Observabilityプラットフォーム稼働?
  10. コストダッシュボードとアラート?
  11. Prompt Injection防御 (分離・アローリスト・Human-in-loop)?
  12. Fallbackモデル + Graceful Degradation?

10アンチパターン

  1. デモコードを本番として扱う。
  2. 素朴Top-kのRAG、Re-rankなし。
  3. Prompt Engineering前にFine-tuning。
  4. 人手キャリブレーションなしのLLM-as-judge。
  5. 請求書が来るまでコストを無視。
  6. User入力をSystem Promptに連結。
  7. Agentに無制限のTool権限。
  8. Observabilityは「後で追加」。
  9. スキーマバリデーションなしでLLM出力を信頼。
  10. パッケージのハルシネーション — LLMに任意の依存をインストールさせる。

次回予告

本番AI Engineeringはモデルと同じくらいシステムの話。次回候補: Agent Orchestration深掘り、RAGスケーリング、LLMコストエンジニアリング。

— AI Engineering 実戦編、完。

コメント

まだコメントはありません。

ログインするとコメントできます