0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CloudWatchアラートにAI考察を付けた。でもAIは信じていない

0
Last updated at Posted at 2026-06-11

※この記事は社内のSRE運用基盤の設計思想を、固有名を伏せて一般化したものです。サービス名・アカウント・チャネル名は「サービスA」みたいにぼかしてます。

先に結論

AIに考察はさせる。でも出力は信じない。モデルを賢くするより、グラウンディングと検証の“仕組み”で精度を担保する——という話です。

  • CloudWatchの全アラートにAI(Amazon Bedrock)が一次考察を付ける基盤を作ってます
  • ただ、運用にAIを出す以上、ハルシネーション(=的外れな原因断定)は普通に事故になる

その“仕組み”が3本柱👇

  1. マルチモデルで相互チェック
  2. runbook(対応手順書)で出力をグラウンディング
  3. 過去の対応事例(ナレッジ)を参照させる

1. なぜ作るのか

SREやってると、アラートの一次切り分けで毎回そこそこ時間が溶けるんですよね。

  • アラートは飛んでくる。でも「で、これ何が起きてんの?」の判断は結局人がやる
  • 経験者は速い。けどそれって裏を返せば属人化してるだけ
  • 数が増えたら普通に詰む

「じゃあAIに一次考察(=たぶん何が原因か、まず何を見るべきか)を書かせればよくない?」——ここまでは誰でも思いつくし、実際Bedrockに投げればそれっぽい文章は返ってきます。

問題はこの“それっぽさ”なんですよ。

運用の現場でAIが「たぶんDBのコネクション枯渇です」とか断定して、それが嘘だったら、対応する人は普通にミスリードされます。AIの考察を人間が信じて動く前提に立つと、ハルシネーションは「精度がちょっと悪い」じゃ済まなくて、インシデントの増幅器になる。

なので最初からテーマはこれ一本でした。

AIの考察を、人間が安心して読める品質まで“仕組み”で引き上げる


2. ハルシネーションを抑え込む3層

ここが本題です。「モデルを賢くする」方向じゃなくて、そもそも嘘をつきにくい構造を3層で作ってます。

層① マルチモデルで相互チェック

単一モデルの出力って、本人(?)がどんなに自信満々でも、合ってるかは分からんのですよね。だから複数モデルに考察させて突き合わせます。

主考察は Claude(Anthropic / Bedrock経由)。具体的には本番考察 Lambda が Claude Opus 4.6、一部のパイプラインが Claude Sonnet 4.6 です。これとは毛色の違う別系統のモデル——具体的には Amazon の Nova Proでクロスチェック(Judge)する構成にしてます。同じ系統(例: Claude を2個)並べても、だいたい同じところで同じように間違えるので、あえてベンダーごと変えるのがポイントでした。

  • 単一モデルがやりがちな「もっともらしい誤り」を、別系統のモデルが拾う
  • モデル同士で結論が割れたら、それ自体が「断定すんな、人間が見ろ」のサイン
  • リージョンやレイテンシの都合で inference profile(東京の jp.* / us-east-1 の us.* など)を使い分けて、安定して呼べるやつを主軸に置く

実際にいくつかの組み合わせを試して、最終的にこの構成へ落ち着きました。

構成 主考察 クロスチェック(Judge) 判定
ベースライン Claude Opus 4.6 単体 自信過剰な誤断定が残る
★採用 Claude Opus 4.6 Amazon Nova Pro 別系統がもっともらしい誤りを拾う
補欠 Claude Opus 4.6 DeepSeek R1 Nova Pro と同等精度。ただしレイテンシ +2秒
不採用 Claude Opus 4.6 Llama 3.3 70B Judge としての判定能力が不足

図にするとこんな動き。2モデルの結論が揃えば自信を持って出す、割れたら“人間を呼ぶ”。

突き合わせるときは、だいたいこの軸で見てます。結論が一致してるか / 根拠(参照したメトリクスやログ)が一致してるか / 重大度の見立てが一致してるか。ここが割れたら無理にどっちかへ寄せず、「要人間確認」フラグを立てる。AIに「1個の正解」を選ばせるんじゃなくて、「揃ってる/揃ってない」を見てるイメージです。

🛡 防いでるもの: 単一モデルの自信過剰な誤断定

層② runbookでグラウンディングする

個人的に一番「効いた」のがこれ。

最初、Bedrockに「このアラート考察して」とだけ投げてた頃は、出力がとにかく generic(ふわっとした一般論)だったんですよ。「ネットワークやリソースの問題が考えられます」みたいな、読んでも何も判断できないやつ。

そこでアラートごとに runbook(対応手順書)を参照させて、しかも冒頭に「クイック判定表」を置いた。

## クイック判定表
| アラート | 一次判定 | 既知パターン | 詳細手順 |
|---|---|---|---|
| XxxConnections高騰 | まずReader台数を確認 | 特定時間帯の外部データ連携による正常パターン | step-3 |
| 5xx増加 | 上流API応答を確認 | 基幹API側タイムアウトの可能性 | step-7 |

これを食わせた瞬間、出力が 「一般論」から「この環境の既知パターンの具体引用」へ 変わりました。実際のビフォーアフターがこれ(DBの長時間 idle in transaction アラートを考察させた例):

Before(runbookなし / generic):

データベースで長時間の idle in transaction が検出されています。コネクションリークやアプリケーション側のトランザクション管理に問題がある可能性があります。該当クエリを確認し、必要に応じて接続をクローズしてください。

——間違ってはいない。けどどの環境でも通用する一般論なので、これ読んでも対応者は結局イチから調べ直しです。

After(runbookグラウンディングあり):

検出された長時間 idle は 特定の時間帯に集中しています。runbookのクイック判定表より、この時間帯は 外部データ連携(日次バッチ)に伴う既知の正常パターンに該当します。秒オーダーの idle は誤検知扱いのため、対応不要の可能性が高いです。判定対象は分〜時間オーダーの長時間 idle のみで、今回はそれに該当しないため経過観察を推奨します。

同じアラート・同じモデルでも、「何を根拠に喋っていいか」を渡すだけでここまで変わる。夜中に誤検知で叩き起こされる回数が減る、って意味でもコスパは一番良かったです。

これ、一発ものじゃないです。たとえば5xxが増えたときも同じでした。

Before(runbookなし / generic):

5xxエラーが増加しています。アプリケーションのバグやサーバーリソースの逼迫が考えられます。エラーログを確認し、必要に応じてスケールアウトやロールバックをご検討ください。

After(runbookグラウンディングあり):

5xxの増加はクイック判定表の既知パターンに該当。まず見るべきは自分たちのアプリじゃなく上流(基幹API)側の応答で、基幹API側のタイムアウトに連鎖して5xxが出るパターンとして手順書に載っています(step-7)。いきなりアプリのコードを疑うより、先に上流の状態を確認するのが筋、という判断に寄ります。

アラートの種類が変わっても、同じように「この環境の既知パターン」へ寄せてくれる。この再現性がデカいんですよね。

要は精度を上げにいくんじゃなく、runbookで「喋っていい範囲」を縛る。賢いモデルを探すより、こっちの方がよっぽど効きました。

🛡 防いでるもの: 環境固有の文脈を知らずに的外れな考察をする

層③ 過去の対応事例ナレッジを参照させる

runbookは「手順」だけど、現場には手順化されてない経験知があるんですよね。「このエラー、前も出たけど原因はアレだった」みたいなやつ。

これをナレッジとして貯めて、考察時に参照させます。似た事例があればAIはそれを根拠に引ける。

🛡 防いでるもの: 解決済みの事象を毎回ゼロから誤推論する

3層をまとめると

防ぐ失敗
① マルチモデル 単一モデルの自信過剰な誤断定
② runbookグラウンディング 環境を知らない的外れな一般論
③ 過去事例ナレッジ 既知事象のゼロからの誤推論

イメージとしては、生のアラートを3枚のフィルタに通して“嘘”を削ぎ落としていく感じ。

結局、モデル単体の賢さじゃなくて「何を根拠に喋らせるか」で精度が決まる——これが作ってて一番強く感じたことです。


3. 全体像

ここまでが考え方。実装としてはシンプルで、CloudWatchのアラームをトリガーに、考察用のLambdaがBedrockを叩いて、結果をSlackに流す。それだけです。


4. なぜいきなり自動対応にしないのか

「考察できるなら自動対応までやればよくない?」ってよく言われます。やりません。理由は単純で、まだAIの誤答率を知らないから

なので、いきなり完成形を目指さずに3段階に分けて入れてます。

Phase 内容 投稿先 自動対応
Phase 1 全アラートをAI考察してテスト用チャネルに投稿(観察) プライベート なし
Phase 2 既存アラートにスレッド返信で考察を付ける 本番 なし
Phase 3 AIによる自動対応(低リスクなものから) 本番 あり

ミソは、Phase 1は「AIが当たってるか人間が黙って見てるだけ」の期間ってこと。いきなり本番チャネルには出さない。誤答がどんだけ出るかを測ってから次に行きます。

「測ってから」と言っても感覚じゃなくて、次のフェーズに上げる条件をだいたい決めてます。具体的な閾値は環境によって変わるのでここでは伏せますが、見てる軸はこんな感じ。

  • 誤答率(明らかに的外れな断定の割合)が一定以下
  • 人間レビューで「これは役に立った」と判定された割合
  • runbook一致率(既知パターンをちゃんと既知と言えてるか)
  • 危険な断定(=そのまま動いたら事故るやつ)の件数

大事なのは、「賢そうだから自動化」じゃなくて「データで誤答率が許容範囲だと確認できたから自動化」っていう順番。Phase 1のテストチャネルは、その計測のための“安全な観察箱”として置いてます。


5. 開発プロセスもAIを信じない — 多レビュア体制

ハルシネーション対策って、ランタイムだけの話じゃないんですよね。この基盤、開発プロセス自体も「AIの成果物をAIで検証する」体制にしてます。

  • 実装はAIエージェント(Claude Code)が書く
  • それを別のAIが独立レビューする(AWSのネイティブ仕様と矛盾してないかを厳しく見る)
  • 結論が割れたら、さらに別のAIにセカンドオピニオンを求める

特に効いてるのが、PR作ったら自動でレビューサイクルが回る仕組み。

面白いのが、同じPRでもレビューの角度を変えると毎ラウンド指摘が出てくること。1回「OKです」って言われても鵜呑みにしない。複数ラウンド・複数視点で潰す。実装するAIと検証するAIを分けて、どっちにも rubber-stamp(無条件OK)させないのがコツでした。

念のため書いておくと、このAIレビューは最終判断じゃないです。マージするかを決めるのは人間で、AIレビューは「人間が見落としがちな箇所を炙り出す追加レイヤー」として置いてるだけ。「AIがOKって言ったから通す」ではない。ここを混同すると、それこそ「結局AI信じてるじゃん」になっちゃうので。

ランタイムでも開発でも、思想は一貫して「単一AIの出力を信じない」です。


6. まとめ

AIにアラート考察させる、ってアイデア自体はもう珍しくないです。差が出るのはその先、運用に出していい品質をどう担保するか

作ってみて得た結論は3つ。

  1. 精度はモデル性能より「グラウンディングと検証の仕組み」で決まる。 runbookと過去事例で“何を根拠に喋るか”を縛るのが一番効く。
  2. 単一AIの出力は、ランタイムでも開発でも信じない。 マルチモデルと多レビュア体制で断定の偏りを潰す。
  3. 自動化は「賢いから」じゃなく「誤答率データが許容範囲だから」進める。 段階導入と観察期間は、遠回りに見えて近道。

全部に共通してるのは一つで、AIの出力を「正解」として扱わない。あくまで根拠付きの仮説として受け取って、最終的な判断は人間がやる。この一線さえ守れば、AIはかなり戦力になります。

次は観察データを使って、自動対応(Phase 3)を低リスクなやつから解禁していく予定。進捗あったらまた書きます。


同じく「AIをどこまで運用に出していいんだ……」で悩んでるSRE / インフラの人の参考になれば。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?