Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話

Avatar for azukiazusa azukiazusa
January 21, 2026

AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話

サーバー監視ツール Mackerel の障害対応を効率化するために開発した AI インシデントコマンダーについて紹介します。Mastra フレームワークを活用し、アラート発生時のログ分析やメトリクス確認などの初動調査を、複数の専門 AI エージェントが協調して自動で実行する仕組みを構築しました。最後に AI エージェントを構築した上で得られた品質を保証する実装についても触れたいと思います。

Avatar for azukiazusa

azukiazusa

January 21, 2026
Tweet

More Decks by azukiazusa

Other Decks in Programming

Transcript

  1. 本日のアジェンダ 1. 導入(3分) AI インシデントコマンダーとは AI インシデントコマンダーを作った理由 2. システム設計(7分) アーキテクチャ

    Mastra によるワークフロー構築 3. AI エージェントを試作したうえでの今後の展望(5分) 評価の重要性 オブザーバビリティ
  2. 本日のアジェンダ 1. 導入(3分) AI インシデントコマンダーとは AI インシデントコマンダーを作った理由 2. システム設計(7分) アーキテクチャ

    Mastra によるワークフロー構築 3. AI エージェントを試作したうえでの今後の展望(5分) 評価の重要性 オブザーバビリティ
  3. AI インシデントコマンダーを作った理由 障害対応でAIエージェントを使う検証を定常的に行いたい サーバー監視ツール Mackerel を開発しているので、障害対応の効率化は重要なテ ーマ 解決したい課題 障害対応は属人化しがち →

    経験のあるメンバーがいない場合でも調査を開始できるようにしたい 障害対応の初動部分を自動化したい → ログ確認、メトリクス確認、過去事例の検索... → 意外と初動はルーティン的な作業が多い
  4. 本日のアジェンダ 1. 導入(3分) AI インシデントコマンダーとは AI インシデントコマンダーを作った理由 2. システム設計(7分) アーキテクチャ

    Mastra によるワークフロー構築 3. AI エージェントを試作したうえでの今後の展望(5分) 評価の重要性 オブザーバビリティ
  5. Mastra を採用した理由 1. スキルセットの適合 主流の AI エージェントフレームワークは Python/TypeScript が多い 普段は

    Web アプリケーションを開発しているので、チームメンバーが TypeScript に慣れていた 2. 豊富な活用事例 ドキュメントやサンプルが充実 Gatsby の開発チームが作成しているので、実績がある
  6. Mastra のワークフロー構造 1. createStep でステップを定義 ステップはワークフローの基本的な単位 2. createWorkflow でステップを組み合わせ .then()

    でステップをチェーン .parallel() (並列実行) .branch() (分岐処理) dowhile() (ルー プ処理)などもサポート 3. ワークフローを実行 Mastra Client SDK( @mastra/client-js )から Web API 経由でワークフ ローを実行
  7. ステップの定義例 const bootstrapAlertInvestigation = createStep({ id: "bootstrap-alert-investigation", // zod スキーマで型安全性を確保

    inputSchema: z.object({ alertId: z.string(), }), outputSchema: z.object({ alert: alertSchema, }), execute: async ({ inputData }) => { const mackerelClient = createMackerelClient(); const alert = await mackerelClient.getAlert(inputData.alertId); return { alert }; }, });
  8. ワークフロー実装例 const alertInvestigationWorkflow = createWorkflow({ id: "alert-investigation-workflow", inputSchema: alertInputSchema, //

    ワークフローへの入力 outputSchema: analysisOutputSchema, // ワークフローの出力 }) .then(bootstrapAlertInvestigation) // アラート情報取得 .then(makeInvestigationDecision) // 調査判定 .then(alertInvestigationConditionWorkflow) // ネストされたワークフロー .commit(); // ワークフローを確定 .then() でステップをチェーン → 各ステップの出力が次の入力に .commit() で確定 → ワークフローを実行可能な状態に
  9. .foreach で並列実行 前のステップが配列を返す場合、各要素に対してステップを並列実行 Step1: findLogGroups ↓ 出力 [group1, group2, group3,

    ..., group10] ↓ .foreach(analyzeLog, { concurrency: 5 }) ↓ 並列実行(最大5つ同時) ├─ analyzeLog(group1) → result1 ├─ analyzeLog(group2) → result2 ├─ analyzeLog(group3) → result3 ... ↓ 結果を集約 [result1, result2, result3, ..., result10]
  10. .foreach の実装例 // ステップ1: ロググループを検索(配列を返す) const findLogGroups = createStep({ execute:

    async ({ inputData, mastra }) => { const agent = mastra?.getAgent("searchLogGroupAgent"); const response = await agent.generate([...]); return response.object.groups.map((group) => ({ group, alert: inputData.alert, userInput: inputData.userInput, })); }, }); // ワークフロー: 各ロググループを並列分析 const logAnalysisWorkflow = createWorkflow({...}) .then(findLogGroups) .foreach(analyzeLog, { concurrency: 5 }) .commit();
  11. 本日のアジェンダ 1. 導入(3分) AI インシデントコマンダーとは AI インシデントコマンダーを作った理由 2. システム設計(7分) アーキテクチャ

    Mastra によるワークフロー構築 3. AI エージェントを試作したうえでの今後の展望(5分) 評価の重要性 オブザーバビリティ
  12. AI エージェントを試作して:評価の重要性 AI システムの評価があるかどうかが「動く」レベルのプロトタイプと、実際に運用できる システムの大きな違いになるだろう 評価の重要性は『AI エンジニアリング』全体を通じてのテーマ 評価が難しいゆえに、多くの人は伝聞(例:誰かが「モデル X は良

    い」と言っていた)や、結果を目視で確認するといった安易な方法 に頼りがちです。これはさらなるリスクを孕み、アプリケーション の改善サイクルを遅らせる原因となります。結果の信頼性を高める ためには、体系的な評価に注力する必要があります。 Chip Huyen 著『AI エンジニアリング』 (オライリー・ジャパン)
  13. AI as a Judge(LLM as a Judge) AI 自身に評価させる手法 →

    人間の評価と比較して高速かつ使いやすく、比較的安価。柔軟性が高く自動評価の手段 となりうる Mastra には Scorers と呼ばれる評価モジュールがある https://mastra.ai/docs/scorers/overview CI/CD(GitHub Actions)で評価を実行 本番環境で非同期で評価を実行することも可能(Live evaluations) ビルドインの scorers のほか、 createScorer でカスタム scorers を作成
  14. Scorers の実装例 export const summarizeStepScorer = createScorer({ id: "summarize-step-quality-scorer", type:

    { input: incidentAnalysisOutputSchema, output: z.object({ summary: z.string() }), }, // 定量化された指標(0-1スコア)で評価 judge: { model: gemini25pro, instructions: ` あなたは調査サマリーの品質を評価する専門家です。 【評価観点(各0-1で評価)】 1. 問題特定精度: 解決すべき問題を正確に特定できているか 2. 根本原因分析: 問題の根本原因を適切に分析しているか 3. 解決策提案: 具体的で実行可能な解決策を提示しているか 4. Runbook優先活用: Runbookの情報を優先的に活用しているか 5. 出力構造準拠: 構造に従っているか `, } });
  15. CIで実行するテストを書く(1/2) テストデータの準備 [ { "id": "test-001", "minScore": 0.7, "input": {

    "alert": { ... }, "metricsNote": "...", "log-analysis-workflow": [ ... ], "find-runbook": { ... } } }, ]
  16. CIで実行するテストを書く(2/2) import { runEvals } from "@mastra/core/evals"; describe("Alert Investigation Workflow

    Evals", () => { it("should evaluate the workflow using Summarize Step Scorer", async () => { const result = await runEvals({ target: workflow, // 評価対象のワークフロー data: testCases, // テストデータ配列 scorers: { steps: { summarize: [summarizeStepScorer] // Scorer適用 } }, }); expect(result.scores["summarize-step-quality-scorer"]).toBeGreaterThanOrEqual(0.7); }); });
  17. 本番環境でのリアルタイム評価 const summarizeStep = createStep({ id: "summarize", // ... 通常のステップ定義

    ... scorers: { qualityCheck: { scorer: summarizeStepScorer, sampling: { type: "ratio", rate: 0.5 }, // 50%をサンプリング } }, }); 非同期実行でレスポンスをブロックしない 結果は mastra_scorers テーブルに保存