快手技術、複雑業務における RCA エージェントの探索実践を公開
本文の状態
日本語全文を表示中
詳細モードで約39分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
Kuaishou Engineering
快手は複雑な業務環境における AI 排障の課題を解決するため、大模型を活用した RCA Agent の実装と評価体系について詳述し、AI コーディング普及後の次なる生産性ボトルネックである排障領域への対応策を示した。
AI深層分析を開く2026年8月1日 04:30
AI深層分析
キーポイント
排障が次なるボトルネックとなる背景
AI コーディングツールの成熟によりコード生成は進んだものの、組織全体の効率化には限界があり、開発と排障に費やす時間は依然として最大であり、特に AI 生成コードの増加に伴い人手での理解が困難な排障が新たな課題となっている。
業務層故障の複雑性と非直観性
ビジネス層の故障はユーザー体験や収益に直接影響し、Redis 遅延や GC 問題など多様な要因が絡み合うが、特に推奨品質低下によるリクエスト増加のような逆説的な現象や、デバッグログが存在しないケースでは従来の監視手法が機能しない。
RCA Agent が直面する4つの核心課題
AI への業務理解の付与、75% に達しうる告警ノイズの除去、排障プロセスの不確実性の定量化、そして数値計算や傾向認識における大模型の幻觉(ハルシネーション)抑制という4つの難問が解決を要する。
分散システムにおける故障伝播の断点
入口サービスと依存先サービスの間で指標が正常に見えるケースや、部門を超えた連携が必要なケースにおいて、従来の Trace や Metrics だけでは根因特定ができず、人間による推測やコミュニケーションに依存せざるを得ない現状がある。
RCA Agent の金字塔構造と因果推論の階層
RCA Agent は原始信号から背景文脈、単点観測データ、多元融合証拠を経て最上層の直接因果推論へと階層的に構築される。この構造により、複雑なビジネスシナリオにおいて指標間の有向グラフやソースコードレベルの実証に基づいた確実な原因特定が可能になる。
重要な引用
「拿着旧地图,找不到新大陆。」
「AI Coding 带来的红利已经趋于稳定,那么排障就是下一个需要被攻克的生产力瓶颈。」
「当人不再能完整理解自己的系统时,就必须有一个同样由 AI 驱动的诊断体系作为对等的保障。」
如果想让 Agent 去做这件事,必须在技术指标之外理解业务,否则永远无法跨越这两个断点。
編集コメントを表示
編集コメント
本記事は、AI コーディングが普及した後の現実的な課題である「排障」に焦点を当てた貴重な実践報告である。特に、AI が生成したコード特有の複雑な故障伝播や、人間には理解不能な挙動に対する AI による自己診断の必要性を説いている点は、今後のシステム設計において重要な示唆を与える。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。
「古い地図を持っていても、新しい大陸は発見できない。」
AI コーディングツールの成熟が進む今日、コード生成の領域はほぼ制覇されたと言っても過言ではありません。しかし、ソフトウェアエンジニアリングにおける全体的な課題が解決されたわけではありません。
本稿は、快手(クァイショウ)のシニアサーバーサイドアーキテクトである郭勇良氏が、QCon 全球软件开发大会 2026 北京站 で行った基調講演「複雑なビジネスシーンにおける RCA Agent の探索実践」の内容を整理したものです。
郭氏は、大規模言語モデル(LLM)を活用した業務トラブルシューティングの仕組みについて詳しく解説しました。そこでは、AI に業務を理解させる方法、アラートノイズへの対処法、不確実性の定量化、そしてモデルの幻覚(ハルシネーション)を抑制する手法という 4 つの核心的な課題が取り上げられています。さらに、これらの課題に対応するために設計された Agent アーキテクチャや評価体系、そして継続的な進化の方向性についても言及されています。
背景と課題:なぜ RCA Agent が必要なのか
Claude Code の責任者である Boris Cherny 氏は、かつてあるポッドキャストで「コーディング作業は概ね AI によって制覇された」という見解を示しました。この発言は、より深い問いを投げかけます。「ソフトウェアエンジニアリングは本当に解決されたのか?」という問いです。
2 つの調査レポートから得られる答えは「いいえ」です。2025 年の DORA レポートでは、AI コーディングの導入後の生産性変化が統計されています。個人レベルでの効率向上は顕著でしたが、組織全体の生産性向上は限定的でした。また、マイクロソフト社内の調査でも同様の傾向が見られました。約 6,000 件の勤務日における時間配分のサンプルを分析した結果、会議やコミュニケーション、学習、事務作業を除くと、開発とトラブルシューティングがエンジニアの時間を最も多く占めていることが分かりました。
自然な帰結として、「AI コーディングによる恩恵が頭打ちになった今、次なる生産性のボトルネックはトラブルシューティングである」と言えます。
もう一つの現象もこの見解を裏付けています。OpenClaw は今年 3 月に大規模なバージョンリファクタリングを行いました。そのリリース後、多くのユーザーからプラグインの停止や機能不全に関する報告が殺到しました。注目すべき点は、OpenClaw のコードの大部分が AI コーディングによって生成されたものであるという事実です。
これは何を意味するのでしょうか?AI 時代において人間によるコードへのコントロールが低下するにつれ、AI によるトラブルシューティングは「選択肢」から「必須事項」へと進化していく可能性があります。人間が自らのシステムを完全に理解できなくなった時、対等な保障として AI ドライブ型の診断体系が必要不可欠となるのです。
技術システムは概ね3つの層に分類できます。
インフラストラクチャ層では、コンテナやノード、ネットワークの障害が対象です。ミドルウェア層にはキャッシュ(Cache)、データベース(DB)、メッセージキュー(MQ)の異常が含まれます。一方、私たちが注力しているのは業務層の故障です。これはコア指標の急落、警報の嵐、そして他システムへの連鎖的な影響を直接引き起こすものです。
業務層には3つの特徴があります。第一に、ユーザー体験と収益に直結する点です。第二に、コードの更新が非常に頻繁で、状態が変化しやすい点です。第三に、問題が発生した際の調査手順を事前に予測できない点です。
例えば、動画再生時間の低下という現象一つとっても、その原因は Redis のクエリ遅延かもしれませんし、サービス自体の GC(ガベージコレクション)によるものかもしれません。あるいは、下流の某サービスで導入されたバグが起因している可能性もあります。このように、調査の道筋が不確定であることが業務層でのトラブルシューティングにおける最大の難所です。
二、業務現場での実装における課題
実際の現場では、4 つの段階的な核心課題に直面しました。
第一は「AI に業務を理解させる」ことです。典型的な四象限図において、業務指標の変動を引き起こす要因には、内部要因と外部要因、能動的なものと受動的なものが混在しており、信号とノイズが高度に絡み合っています。例えば、新学期開始による自然なトラフィックの変化と、コード欠陥による異常な減少が混在し、巨大な状態空間を形成しています。
第二の課題は「ノイズとの戦い」です。警報のうちノイズが 75% を超えるシステムにおいて、AI エージェントが無効な信号に計算リソースを浪費しないようにどう制御するかという問題があります。
第三は「AI の不確実性を評価する」ことです。再現性があり、定量化可能な評価体系を構築する必要があります。
第四は、「大規模言語モデル(LLM)における数値計算やトレンド認識の誤り(ハルシネーション)」に直接対抗することです。
課題一:AI に業務を理解させるには?
具体例として、メインサイトで突然ユーザーのフィードストリームへのリクエスト数が急増し、警報閾値を超えたケースがあります。このフィードストリームを直接受け持つ入口サービス A の場合、そのすべての下流サービスの可用性は正常に示されていました。
しかし、サービス A の依存関係は極めて膨大で、数百のサービスと複数の部署にまたがっています。このような状況では、当直エンジニアの前に2 つの段階的な問題が立ちはだかります。
まず、「この指標異常自体が本当に問題なのか」という点です。内部故障によるものか、それとも外部の急な人気(ホットスポット)によって自然発生した現象なのかを判断する必要があります。
次に、仮にこれを問題として処理すると決めた場合でも、すべての下流サービスの担当者を一斉に呼び出して逐一調査するのは現実的ではありません。
実際の根本原因は「推薦品質の低下」でした。情報ストリームの質が落ちたことでユーザーが動画を繰り返し再生し、結果としてリクエスト数が異常に増加したのです。
故障の伝播経路は非常に複雑です。入口サービス A は下流の B を呼び出しますが、B 自体には異常が見られませんでした。これは B の内部にフォールバック(デグラデーション)ロジックが存在していたためです。しかし、B が依存する下流部署のサービス E では Core Dump が発生していました。
E で Core Dump が起きた理由は、E が呼び出した別のサービス F において「インターフェースフィールドの欠落」が発生したためです。最終的な原因は、F サービスの設定変更によって、以前実行されたことのないロジックパスが通ってしまっていたことにあります。
この事例にはいくつかの常識に反する点があります。一般的に推薦品質が低下すればユーザーのリクエスト数は減るはずですが、今回は逆にリクエスト数が増加しました。
異常な伝播経路は、A が B を呼び出すノードと、E が F を呼び出すノードの 2 つで断絶しています。指標上ではすべて正常に見え、依存関係を示すメトリクス(Metrics)からは一切関連付けができませんでした。さらに、部署を跨ぐ連携によって人為的な難易度も高まりました。メインサイトの担当者は、下流部署内部での設定変更イベントを把握していなかったのです。
この問題は最終的に膨大な人的リソースを消費し、トラブル対応グループには一時 100 名以上が参加することになりました。
従来の監視の「3 つの斧」である Trace(トレース)、Metrics(メトリクス)、Log(ログ)を用いた場合でも、この事例では少なくとも2つの明確な断点が存在しました。
最初の断点は A が B を呼び出す地点です。リクエストは正常に処理され、メトリクスからは関連付けられませんでした。そのため、業務上の経験則に頼り、メインサイトの担当者が部署 B の担当者へ人手で確認を取る必要がありました。
2 つ目の断点はより隠蔽性が高いものです。E が F を呼び出す際の故障は「インターフェースフィールドの欠落」が原因でしたが、リクエスト自体は正常でした。さらに、このロジックパスは過去に実行されたことがなかったため、ログが出力されていない可能性さえあります。
この断点の発見もまた、内部関係者による人手でのコミュニケーションに依存していました。
結論は明白です。Agent にこのタスクを任せるには、技術指標の理解だけでは不十分で、業務の本質を理解する必要があります。そうでなければ、必ず壁にぶつかることになります。
では、どうすればよいのでしょうか?従来の Trace(追跡)、Metrics(指標)、Log(ログ)、および変更イベントに加え、私たちは「業務コードの GIT」を導入しました。なぜなら、コードこそが唯一の真実なるドキュメントであり、すべてのシステムはコードの上に構築されているからです。
初期の実践は非常にシンプルでした。Coding Agent を導入してコードをリアルタイムで分析する手法です。当初は Claude Agent SDK を使用していましたが、一つのコードベースを分析するのに約 30 分かかりました。これは障害対応の現場では到底許容できない時間です。PI Coding Agent に切り替えたことで、単一リポジトリの分析時間を約 5 分まで短縮できました。しかし、それでも実際の運用場面ではボトルネックが残っていました。
業務の障害対応は通常、一つのサービスだけでなく、チェーン上に存在する複数のサービスをまたぐケースがほとんどです。さらに Java システムでは、SDK のような多くの基盤ライブラリの依存関係を整理する必要があり、同時に 3〜5 つのリポジトリを分析する必要があります。合計で 15〜25 分かかる計算になりますが、故障対応の現場においてこの時間は依然として長すぎます。
問題の根源は、コードが唯一の真実なるドキュメントである一方で、抽象度が極めて低い点にあります。抽象度が低ければ、当然ながら効率は低下します。
人間が障害対応を行う際、たとえサービスの担当者であっても、すべての行を暗記しているわけではありません。人間の脳内では業務コードに対して何らかの抽象化が行われています。AI に理解させるためには、この認知コストを下げる必要があります。
そこで私たちは、「ビジネス・アセット(業務資産)」と呼ばれるコードの抽象化レイヤーを構築しました。具体的には、エラーコードに業務上の意味付けを行い、Metrics の意味を業務文脈で記述し、指標間のトポロジー関係を定義します。例えばフィードストリームの例では、「下流の推薦サービスの可用性が低下すると、上流のサービスがフォールバック率を変化させ、最終的にフィード配信量に影響を与える」といった関係性をモデル化します。
また、業務ロジックに直接影響を与えるスイッチ設定についても、その影響範囲をマッピングしました。これらのアセット構築には二つのアプローチがあります。
一つはオフラインでの蓄積です。Coding Agent を用いてコアコードの関係記述を生成し、それをナレッジベースとして Markdown 形式で保存します。
もう一つはオンデマンドでの生成です。障害対応の過程で特定のタスクを分析した際、その知見を「スキル」として即時に生成し、ナレッジベースに登録します。
この二つの手法によって、業務アセットは回転し始めます。
要解决“让 AI 理解业务”这一挑战,本质在于消除人与 AI 之间的上下文代差。AI 获取传统监控数据相对容易,但研发人员脑中同时运转着大量隐性信息——代码逻辑、指标间的关联、业务常识(例如主播开播后可能引发送礼请求激增),以及外部事件的影响。这些信息与代码逻辑同等重要,若想让 AI 进行排查,就必须将这些背景全部提供给它。
挑战二:如何对抗噪声
在实际执行中,告警噪声是让人倍感疲惫的难题。统计数据显示,系统中大部分告警并无实际价值,噪声占比往往超过 75%,真正需要关注的不足四分之一。
告警噪声带来的危害是实实在在的。我们曾复盘过一个 P2 级以上的故障:故障发生后约十分钟,某指标已发生波动并触发告警,但当时的值班人员直接将其静默。此后该指标在十五分钟内迅速恶化至严重程度,却无人察觉。原因正是该告警在七天内触发了超过 15 次,导致值班人员产生了严重的“告警疲劳”,基本不再查看详情便直接忽略。
但如果让 AI 全量处理所有告警,又会引发新问题。内部试验表明,Agent 在 ReAct 循环中完成一次完整推理的 Token 消耗大约在 60 万到 100 多万之间。快手主站每月的告警事件总量约为两三万起,若由 AI 处理全部告警,每月 Token 消耗将接近百亿,年化成本高达数百万人民币。除了高昂的成本问题,ReAct 循环的交互次数不可控,延迟也无法保证。
我们的解决方案是分两层架构。第一层引入一个极轻量的“告警置信度评估 Agent”或 Workflow。它的任务是提取告警的“画像”,包括周期性规律、触发后的阈值偏离程度、恢复时间、服务分布以及曲线聚集情况等统计特征。以偏离分析为例:某可用率告警通常维持在 98%(四个九),若某天突然跌至 60%,显然需要重点关注;若仍停留在 98% 附近,则可能无需干预。周期性同理:如果告警每天凌晨固定触发,其置信度相对较低;但若某天下午突然开始报警,这很可能是一个明显的异常信号。
经过置信度评估筛除部分噪声后,下一步是对保留下来的问题进行排障推理。然而即便经过初步过滤,推理阶段仍存在大量噪声干扰。系统中充斥着各类技术指标的波动,例如服务恰好发生了 GC(垃圾回收),但并未引起核心业务指标变化,这类情况极易导致 Agent 误判。另一个典型的噪声来源是变更事件:在发布高峰期,一条核心服务的关联链路上可能在单小时内关联出 500 多个变更。这些变更绝大多数不会导致故障,但当故障真正发生时,Agent 必然会拉取如此庞大的变更列表。如何判断它们与告警之间是否存在真实关联?这些都是潜在的误判信号。
私たちの対応策は、証拠医学で用いられる「エビデンス・ピラミッド(証拠の金字塔)」を参考にしたものです。このアプローチは医療現場に由来します。医師は毎日多数の症例を扱いますが、その多くは不安から受診した患者であり、実際の疾患がないケースも少なくありません。そのためまずノイズをフィルタリングし、本当に病気を抱える患者に対してのみ、原因究明へと進む必要があります。医学はこの点で非常に厳密な科学体系を持っており、成熟したベストプラクティスが存在します。それをそのまま技術現場に適用できるのです。
このピラミッドの最下層は「生データ」です。その上には「背景文脈」が位置します。具体的には、外部のトレンドやホットなトピック、静的なサービス依存関係、エンジニアの経験知などが含まれます。さらに上位には「単一観測データ」があります。例えば、特定のメトリクスや単一サービスの指標異常などです。
これらの単一異常を、Trace(トレース)やシステムトポロジーによって関連付けると、「多様な証拠が融合した情報」となります。例えば、問題発生時に連鎖的に影響を受けた変更履歴や、過去の故障パターンとの一致などがこれに該当します。これがより確実性の高い層を形成します。
最上層は「直接的な因果関係の推定」です。指標間に明確な有向グラフのトポロジーが存在する場合、ソースコードレベルで事実が確定している場合、あるいは障害発生時に時間的に一致する直接の変更が行われていた場合などが該当します。これらはすべて、確実性の高い因果推論として扱われます。
課題3:不確実性をどう測るか
現在、本番環境向けAIシステムには共通認識があります。「Good Case(良いケース)」を動かすのは簡単で、デモを見せるのも容易ですが、「Bad Case(悪いケース)」を排除し、実際に本番投入するのは極めて困難だということです。そこには大量の「コーナーケース」や「サイレントエラー(目に見えないエラー)」が存在します。
あるAIスタートアップのCTOは、以前の記事でこう述べています。「デモでは正解へのパスさえ見つかればよいが、本番環境では9割のケースが悪条件である」と。なぜこのようなギャップが生じるのでしょうか?
それは、従来のプログラムでは「決定論的」だった要素が、AIにおいては「不確定的」なものに変化しているからです。同じ問題に対して複数回推論を行っても、経路や結論が異なる可能性があります。また、極めて大規模な業務システムでは影響要因が多岐にわたり、わずかな変数の変化が結果に大きな偏りをもたらすこともあります。これはまさに「バタフライ効果」と言える状況です。
実際に遭遇した事例があります。当初、Agent(エージェント)で「単点の揺らぎ」を検出しようとした際のことです。多くのRPC可用性アラートは、下流の特定のPodが瞬間的に不安定になることで生じる全体指標の変動によるものです。解決策としては、従来の異常検知アルゴリズムを導入し、さらに詳細な分析次元を追加してAgentに提供するというものでした。
しかし、このツールを追加した結果、単点問題は確かに検出されるようになったものの、全体のケース精度はむしろ低下しました。その理由は明白です。単点問題は極めて頻繁に発生する現象であり、数千のPodが稼働するクラスターでは決して珍しいことではありません。コア業務指標の変動時には、必ずといっていいほど単点問題も同時に発生します。
Agentが「アクセス数減少」を調査した際にも「検索数減少」を調査した際にも、単点問題を検出しました。そして、それらを誤って因果関係として結びつけてしまったのです。このケースの根本原因は明確です。従来のソフトウェアのように一つのケースを修正すれば解決するのではなく、あるBad Caseへの対策が別のBad Caseを生み出す可能性があるということです。
この課題に対する解決策についても、業界内で強いコンセンサスが得られつつあります。アンドレイ・カルパシ(Andrej Karpathy)は3月のツイートで、「現在のベンチマークこそが新たなメタ(基準)である」と指摘しています。また、昨年発表された影響力のある論文『Agent Design is Still Hard』も同様の見解を示しており、「評価とテストがいかに困難か」を強調し、一定の規模に達した段階では必ずベンチマークを導入すべきだと述べています。
当社のベンチマーク体系は、2 つのフェーズに分かれています。
最初のフェーズは「ケース収集」です。障害が発生すると、専門家による注釈付けを経て、インテリジェントな原因特定までを完了させた後、評価フェーズへと移行します。このプロセスで得られたケースは評価セットに追加され、その価値が判断されます。関連データは転送保存され、その後、評価エージェントを実行して効果を比較検証します。
評価セットの設計段階では、実際のビジネス問題空間を網羅することが目標です。すべてのケースは、オンライン上の実際の異常シーンから収集されたものです。一方、評価セットのデータ構築段階では、実際のトラブルシューティング環境を再現することが目標となります。そのため、スナップショット形式の監視データ転送アプローチを採用しました。
快手(Kuaishou)では毎日膨大な量の監視データが発生しますが、一部のデータには有効期限があります。そのため、障害発生期間中の監視データを可能な限り転送保存する必要があります。
なぜシミュレーション環境や混沌工学(チャオスエンジニアリング)の手法を採用しなかったのかといえば、解決すべきはビジネス固有の問題だからです。こうした問題は混沌工学で模擬することが非常に困難です。
例えば、「検索数が減少した」というケースを想定してください。実際に検索数の減少という障害を人為的に作り出すことは不可能です。リクエスト量が膨大になるため、シミュレーションコストが高すぎるのです。そのため、私たちは実際の異常から事例を収集し、障害現場の状況を保存することに注力しています。
評価フェーズでは、モデルの効果を測定することが目標となります。ここでは「ヒューリスティック(手がかり)の的中率」などの主要指標に焦点を当て、定量的なスコアリングを行い、期待される挙動と比較します。
課題 4:ハルシネーション(幻覚)への対抗
大モデルにおける「ハルシネーション(幻覚)」は避けて通れない話題です。昨年、Claude Opus 4 モデルで発見されたある典型的な事例があります。現在はバージョン 4.7 が登場してこの問題は解消されているかもしれませんが、その教訓は今なお有効です。
ある時、同僚から「時間をタイムスタンプに変換してほしい」という非常にシンプルなプロンプトをもらいました。これをそのまま Claude に投げたところ、変換がほとんどできず、毎回不正確な結果しか返ってきませんでした。その後、私はプロンプトを少し修正し、「Python スクリプトを実行して変換してほしい」と指示したところ、結果は劇的に精度が高まりました。
この小さな実験は、大モデルの本質を如実に示しています。大モデルは確率予測器に過ぎず、数値計算タスクには不得意なのです。
実際のビジネス現場で直面した最初の課題は、監視画像から単純なトレンド(例えば 8:00 から 8:20 の間に指標が上昇しているか下降しているか)を認識することでした。本来は非常に簡単なはずのことですが、大モデルで試みると明らかなハルシネーションが発生しました。
当初の解決策として、マルチモーダル技術を用いて監視スクリーンショットを直接大モデルに読み込ませる案がありました。しかし、この方法ではハルシネーションが深刻でした。画像には確かに 8:00 から 8:20 の間に下降傾向があるものの、時間点が不正確で、モデルは非常に曖昧な時間範囲しか提示できませんでした。
さらに悪いことに、大モデルが縦軸の解釈を誤るケースもあり、「8:30 に下降を確認した」といった明らかな事実と異なる発言をするさえありました。これは深刻なハルシネーションです。また、このアプローチはチャートのスタイルが安定していることに依存しており、フロントエンド担当者が色やレイアウトを少し変更しただけで、精度が即座に低下してしまいます。
2 つ目の解決策は、時系列データを用いて認識する方法でした。一定期間のすべてのデータポイント(「時間 - 値」のペア)を巨大な JSON リストとして構成し、大モデルに直接送信する手法です。しかし、これも計算ミスを免れることはできませんでした。
まず、トークン消費量が膨大になりすぎます。データシーケンスがあまりにも長いためです。さらに、モデルは依然として計算を実行する必要があります。「どの程度の割合で下降したか」を判断するなどですが、大モデルはこの種の処理も得意ではありません。
最終的にこの課題は、従来のアルゴリズムを用いるタスクへと転換されました。具体的には「孤立森林(Isolation Forest)アルゴリズム」に特定のルールを組み合わせることで判断を行っています。このアプローチを採用した結果、精度が大幅に向上し、トークン消費も不要となりました。何より、処理の確実性が根本的に強化されたのです。
ここから得られる重要な結論は、一定以上の「確実性」が求められる場合、工程化してツール(Tool)やスキル(Skill)として封装する方が、より優れた解決策となるということです。
ある判断能力を標準化された演算子(オペレーター)として封装すれば、それは標準的なインターフェースを獲得し、再利用が可能になります。また、パラメータの調整も柔軟に行えます。一度、標準化された演算子として定着すれば、徐々に蓄積して「演算子ライブラリ」を構築していくことができます。
AutoResearch や CodeAct のようなアプローチを参考に、確実性が高く反復的な問題をアルゴリズムとして定着させ、それらのアルゴリズムに対して一連の入出力ペアを用意します。本質的にはこれは「関数」の作成です。例えば、「入力 A なら出力 B」「入力 C なら出力 D」といったケース(Case)を準備し、繰り返し実行してアルゴリズムのスコアを向上させることを目指します。
このステップは非常に定量化しやすく、明確なフィードバックループを形成できます。これにより、継続的にアルゴリズムを磨き上げていくことが可能になります。
三、核心となるメカニズムとアーキテクチャ設計
全体としての進化のロードマップを振り返ると、AI が導入される前は純粋なルールベース(Rule-Based)の段階でした。AI が登場した当初は、いくつかの標準作業手順書(SOP)をプロンプトで編成する試みを行いました。その後、ワークフロー(Workflow)が登場すると、そのワークフローと MCP(Model Context Protocol)を組み合わせたアプローチも検討しました。
しかし昨年後半に入り、私たちはついに、エージェント(Agent)が大規模言語モデルの自律判断によって「いつ停止し、いつ調査を続けるか」を完全に決定する試みを本格化させました。
ここには、真剣に考えるべき問いがあります。「ワークフローからエージェントへ進化することは、必ずしもより優れた選択なのか?」という点です。
ワークフローの明確な利点は、処理が確実で制御しやすいことです。しかし、その限界もまた明白です。それは厳密に編成されたプロセスと固定されたフローに依存しており、非常に柔軟性に欠けます。一方、エージェントは柔軟性の問題を解決し、発散的な対応や汎化能力を備えています。ただし、その代償として「不確実性」が生まれます。
さらに、ワークフローからエージェントへ切り替えることで、レイテンシ(遅延)が増大するという問題も生じます。ReAct パターンにおけるループ処理が多輪にわたれば必然的に遅延は大幅に増加し、トークン消費量も爆発的に膨らみます。これに対し、ワークフローにはこれらの欠点がありません。遅延が低く、トークン消費も少なく、何より確実性が強いのです。
つまり、エージェントがワークフローを完全に置き換える関係にあるわけではありません。エージェントは「より賢い」ものの代名詞ではなく、「より柔軟な」進化の形と言えます。特定のシナリオにおいては、むしろワークフローの方が効果的な場合もあるのです。
では、なぜ私たちはエージェントを採用するのか?それは、複雑な業務上のトラブルシューティング(排障)現場には、静的な SOP ではカバーしきれない「極めて不確実な問題」が数多く存在するからです。これが、エージェントを導入する核心的な価値です。
全体としてのアラートガバナンスのアーキテクチャは、階層構造で設計されています。
最下層では、従来のアラートガバナンスや一般的な戦略、そしてインテリジェント(AI)によるアラートの導入を通じて、ノイズを削減します。
その上の2つのレイヤーが AI によって処理される領域です。第一層では、いくつかのワークフローを用いて「システム思考(ファストシンキング)」を実行し、比較的固定されたシステム系アラートに対応します。具体的には、SOP シナリオや Redis の排障、Java の例外発生などです。これらは非常に定型化された事象であり、「ファストシンキング」による単純な問題処理として扱えます。
最上層では、コアビジネス指標の急激な変化(突変)に対応します。ここではエージェントを導入して「スロウシンキング(遅い思考)」を行い、深い推論を行います。
「快思考」の段階では、告警イベントが発生すると、まず抑制ルールが適用されます。例えば、単一ポイントの問題と判断されれば、そのポイントを再起動するだけで対応でき、告警は即座に抑制できます。さらに特徴量の分析を加えることで、多くの告警を自動的にフィルタリングすることが可能です。
残った告警については、複雑度の簡易判定を行います。次元分析や影響範囲の簡単な評価を通じて、ワークフロー内で解決できると判断されたケースでは、直接原因を特定して同期処理で完了させます。一方、より複雑な問題に対しては、非同期の Agent による分析プロセスへ移行します。この場合、通常は 10 分以上を要する可能性があります。
ワークフロー側の処理は決定性が高く、比較的迅速に結論を出すことができます。
複雑な問題に対する「慢思考」の段階では、マルチエージェント(Multi-Agent)アーキテクチャを採用しています。告警イベントがトリガーされるとプラットフォームへ流入し、メイン Agent がループを開始します。ここでプランニングを行い、動的に複数のサブエージェントを呼び出します。
基盤となるのは業務資産とデータインフラストラクチャーです。最終的には、人間にも理解可能な形で解釈可能なレポートが出力されます。
このプロセスでは、以下の 3 つの重要な技術ポイントを活用しています。
第一に、「Sub-Agent のドメイン別カプセル化」です。利用可能なツールは合計 80 以上ありますが、これらをすべてメイン Agent に直接投げると、認知負荷とトークン消費量が膨大になってしまいます。そのため、類似した領域のツールをグループ化し、サブエージェントとしてカプセル化して管理しています。
第二に、「長期間タスクにおけるコード分析の非同期化」です。複雑なタスクでは依然としてコード分析が必要になる場合がありますが、これを非同期処理としてキュー(信箱)へ投下し、メイン Agent が順次消費する仕組みを採用しています。
第三に、「Agent 間通信チームの構築」です。Sub-Agent を用いた調査手法では、各エージェント間の情報が隔離されているため、特定のサブエージェントが無効なパスに陥るリスクがあります。例えば、あるエージェントがすでに重要な手がかりや変更イベントを発見した場合、他のエージェントが RPC の詳細な下層調査を続ける必要はなくなります。
これを解決するため、Agent 間通信チームを構成し、Sub-Agent 間で必要な情報を共有させることで、全体の調査パスを短縮しています。
エージェントの自己進化に関する私たちの考え方は、大モデルが抱える二つの極端な課題にあります。
一つは、過度に汎用的でケーススタディを与えないゼロショット推論モードです。これは思考が散漫になりがちです。もう一つは、SOP(標準作業手順)をプロンプト内で完全に固定化し、「まず何をして、次に何をする」と厳密に指示するアプローチです。これでは過学習のリスクが生じます。
そこで私たちは、Few-shot(少サンプル)モードを採用しました。類似した故障事例に対して、おおよその処理方針を示すのです。ただし、Few-shot の事例を一つずつ人間が構築するのはコストがかかります。この課題を解決するため、自動で事例セットを構築するシステムを設計しました。
事前にいくつかの質問と正解を用意し、エージェントに反復実行モードを開始させます。この際、モデルは軽量な小規模モデルに切り替え、温度パラメータ(Temperature)を高めに設定して多様な探索経路を生成します。最終的に正解に到達するまでこれを繰り返すのです。
評価モジュールが「正解にヒットした」と判断すると、その推論プロセス全体を抽出・要約し、ナレッジベースとして蓄積していきます。
エージェントの「記憶」機能については、トラブルシューティングには膨大な情報量の参照が必要です。例えば、アラート画像の統計データや、開発者の頭脳内に存在する業務知識などです。これらは推論開始時にコンテキスト(Context)やシステムプロンプトに初期化される必要があります。
推論中に行われるのは、動的な検索プロセスです。過去のオフライン業務資産、推論過程で蓄積された長期記憶、そして特定のシナリオに特化したスキル(SOP に近い性質のもの)を検索します。
これらの情報を統合・整理する作業については、人間が手動で行うのではなく、エージェント自身に任せるようにしています。これにより、人的リソースの消費を最小限に抑えています。
製品インタラクションの観点では、ずっと一つの疑問を抱いていました。昨年の Claude Code の登場から、今年 1 月の OpenClaw のリリースに至るまでです。
私の周囲にいる多くのエンジニアは OpenClaw に大きな熱狂を見せませんでしたが、社会全体からは大きな反響を呼びました。なぜ Claude Code は同様のインパクトを持たなかったのでしょうか?その決定的な違い(增量)は何だったのか。
観察の結果、OpenClaw にはいくつかの独自機能があることが分かりました。IM(インスタントメッセージング)への接続、デフォルトでの全権限付与、そしてタスク進行状況を感知するハートビート機構です。
要約すると、現在の同種製品に共通しているのは、AI をより「プロアクティブ(能動的)」にしていくという方向性です。
そのため、製品開発の方向性もこの流れに沿って進めています。
当初は、エンジニアが問題を投入すると Agent が推論を行い、その過程で重要な発見を提示し、リアルタイムにトポロジー図を描くという Chatbot 形式でした。しかし、将来的にはより AI ネイティブな自律型へと進化させる必要があります。Agent が自ら問題を検知し、必要な場合は自動的にチャットグループを作成して参加し、発見した重要情報を次々と投稿する形です。
最終的には「問題の検知」から「トラブルシューティング」「協働処理」、さらには「ナレッジの蓄積」までを完結させる完全なクローズドループを実現すること。これが目指すべき理想の姿です。
コア指標の運用においては、アラートや障害対応に対しては MTTR(平均修復時間)の短縮を最終目標とします。しかし実際には、故障が発生する頻度は低く、事例数も限られています。そのため、プロセス指標を導入しました。
最初の指標が「有効な手がかりの発見率」です。なぜ「手がかり」という概念が必要なのかというと、Agent の推論には時間がかかるためです。一つのタスクに 10 分以上かかることも珍しくありません。10 分待ってから結論を伝えるわけにはいきません。その過程で共有すべき重要な手がかりが見つかったら、即座に提示する必要があります。したがって、この「手がかり」の精度が重要な評価基準となります。また、原因特定(アトリビューション)の精度や所要時間も継続的に運用していく必要があります。
現在、全体の精度は 80% を超えていますが、これは多くのアラートノイズを含んだ数字です。実際の推論レベルでの精度はこれほど高くありません。推論面では主に「有効な手がかり」の精度を重視しており、最終的に根因を正確に特定するのは非常に困難ですが、過程で有効な手がかりを見つけられれば、すでにビジネスに実質的な価値をもたらしています。
実践の過程では数多くの課題にも直面しました。例えば、大規模言語モデル(LLM)層での頻発する失敗や、API インターフェースの不整合、異なるベンダー間の LLM API 仕様の大きな違いなどです。これらは本質的にソフトウェアエンジニアリングの問題であり、障害への対応、予防、システムの耐故障性強化が必要です。過去に分散システムを開発していた際も、環境の不確実性と戦い続けてきました。AI の導入は、この不確実性をさらに増幅させ、常態化させてしまいました。その事実を理解した今では、むしろ心構えが楽になりました。これを受け入れるしかないのです。
四、まとめと展望
最後に一つの認識を共有します。「古い地図を持っていても、新しい大陸は発見できない」ということです。
現在の監視システムはすべて「人」を中心に構築されており、人間が使うことを前提に設計されています。人間の認知には帯域制限があり、複雑な情報を処理しきれません。そのため、経営陣への報告では多くの詳細を隠蔽し、抽象化されたシンプルな構造に凝縮する必要があります。システムも同様の論理で動いており、すべての底層データを全量表示することはできず、データのアブストラクション(抽象化)を行います。
しかし Agent にはそのような制約がありません。無限に近い量の複雑なデータを処理することが可能です。では、未来のシステムはどのように進化していくのでしょうか?可観測性(オバザビリティ)の全体体系が再構築されることになるのでしょうか。私にも答えはありませんが、この点については引き続き考え続けています。
もう一点、現在の組織構造は「人」を単位として高度に分業化されています。しかし Agent に分業は不要です。また、人間同士には情報隔離が存在し、組織的な問題と技術的な問題が絡み合うこともあります。例えば、「誰が多く情報を握っているか」が主導権を握る要因になるなどです。
しかし Agent の世界では事情が異なります。第一原理から考え直せば、すでに何かが変わっているのです。
さて、現在の発展状況について振り返ります。Agent 分野の進化は極めて速く、数ヶ月も経てば多くの結論が陳腐化してしまいます。では、一体何を蓄積できるのでしょうか。
私たちは「問題領域における業務資産」「評価(Eval)体系」「構造化された事例集」「人間と機械の協働モデル」など、一定期間にわたって維持可能な要素があると考えています。これらは安定した層であり、継続的に積み上げていくことができます。一方で、モデルの迭代に伴い変化する「変動する層」も存在します。例えば、下半期にさらに強力な新モデルが登場すれば、現在有効な手法がすぐに使えなくなる可能性があります。プロンプトの記述、ツールの選定、プロトコルの規範などはすべてこの変動層に含まれます。
私たちのアプローチは、より多くのリソースを安定した層に投入し、変動する層への投資を最小限に抑えることにあります。そのために、データコンテキストの構築に注力しています。
最後に、全体の方向性は「AI ネイティブな自律化」と「AI の自己進化」へと向かうべきだと考えます。現在の Agent が担っているのは、人間が主導して問題排查を行う際の意思決定支援です。将来的には新たな段階へ発展し、Agent が自ら意思決定の提案を行い、人間が最終的な承認とチェックを行う体制へと進化するでしょう。このプロセスが十分に長く継続され、99% のシナリオにおいて Agent の判断が正確であり、人間の承認者が有効な修正を提案する余地がないことが確認できれば、完全に「Agent による自己進化」と「自律的なクローズドループ」を実現できるはずです。
【快手技術交流群】への参加をお待ちしています。
QR コードをスキャンしてください👇
【原文を読む】をクリックして、講師の PPT をダウンロードしてください!
原文を読む
WeChat で開くにはこちらへ
原文を表示
快手技术 2026-07-23 17:34 北京
image
“拿着旧地图,找不到新大陆。”
image
在 AI coding 工具日益成熟的今天,代码生成能力已被视为接近攻克的领域,但软件工程的全局难题远未解决。本文整理自快手资深服务端架构师郭勇良在 QCon 全球软件开发大会 2026 北京站的分享《复杂业务场景下 RCA Agent 的探索实践》。
郭勇良在分享中详细介绍了一套基于大模型的业务排障体系,拆解业务中面临的四个核心挑战:如何让 AI 理解业务、如何对抗告警噪声、如何衡量不确定性、如何抑制模型幻觉,以及围绕这些挑战所构建的 Agent 架构设计、评测体系与持续演进思路。
一、背景和痛点:为什么需要 RCA Agent
Claude Code 负责人 Boris Cherny 曾在播客中提出一个观点:编码工作大体上已经被 AI 攻克了。这个判断引发了一个更加深层的问题——软件工程真的被解决了吗?
从两份调研报告来看,答案是否定的:2025 年的 DORA 报告统计了 AI Coding 落地后的效能变化,个人效能的提升相当显著,但组织效能的提升却相当有限。微软内部的一项调研也给出了类似的方向,他们收集了约六千份工作日时间分配的样本,除去会议、沟通、学习与行政事务,开发和排障仍然是研发人员时间占比最大的两块。一个自然而然的推论就是:如果 AI Coding 带来的红利已经趋于稳定,那么排障就是下一个需要被攻克的生产力瓶颈。
另一组现象也印证了这个判断。OpenClaw 在今年三月份发布了一个重大版本重构,版本上线后大量用户反馈插件出现瘫痪或功能失效。值得留意的是,OpenClaw 的代码绝大部分是通过 AI Coding 生成的。这意味着什么?随着 AI 时代人对代码掌控度的下降,AI 排障有可能从一个可选项演变成一个必选项。当人不再能完整理解自己的系统时,就必须有一个同样由 AI 驱动的诊断体系作为对等的保障。
整个技术系统大致可以切分为三层:基础设施层涉及容器、节点、网络故障,中间件层涵盖 Cache、DB、MQ 的异常,而我们主攻的业务层故障则直接面向核心指标下跌、风暴告警和跨系统传播。业务层有三个显著特点:第一,它是用户体验和营收的直接体现;第二,业务代码迭代极快,高度易变;第三,业务问题无法预测排查步骤。举个例子,同样是视频时长下跌,根因可能来自 Redis 慢查询,可能来自服务自身的 GC,也可能来自下游某个服务引入的 bug,排查路径的不确定性正是业务层排障最大的难点。
二、业务场景落地挑战
在实际落地过程中,我们面临着四个层层递进的核心挑战。第一个是如何让 AI 理解业务。一个典型的四象限图中,能引起业务指标波动的因素同时包含内源的与外源的、主动的与被动的,信号与噪声高度混合。中小学开学导致的流量自然变化与代码缺陷引发的异常下跌混在一起,共同构成了一个巨大的状态空间。第二个挑战是对抗噪声——在一个告警噪声占比可能超过 75% 的系统中,如何让 Agent 不会在无效信号上耗尽算力。第三个是如何衡量 AI 排障的不确定性本身,即建立可重复、可量化的评测体系。第四个则是直接对抗大模型在数值计算与趋势识别中的幻觉问题。
挑战一:如何让 AI 理解业务
举个例子,主站某次突然遭遇用户 Feed 流请求量上涨,突破了告警阈值,入口服务 A 作为直接承载 Feed 流的核心服务,它的所有下游可用率都显示正常。但服务 A 的下游依赖极其庞大,横跨几百个服务与多个部门。这种情况下,摆在值班工程师面前有两个层次的问题:首先,这个指标异常本身到底是不是一个问题?它是内部故障导致的,还是纯粹由外部热点自然引发?其次,即便决定把它当问题处理,逐一拉取所有下游业务的同事来排查,显然不现实。
事实上的根因出在推荐质量的下降上——信息流质量下降导致用户反复刷视频,引起了请求量的异常上涨。故障传播链非常复杂:入口服务 A 调用了下游 B,B 之所以没有表现出异常,是因为它内部存在兜底降级逻辑,但 B 所依赖的下游部门服务 E 发生了 Core Dump。而 E 发生 Core Dump 的原因,是其请求的另一个服务 F 出现了接口字段缺失,最终归因于 F 服务的配置变更引入了先前未走过的逻辑路径。
这个案例中出现了几个反常识的地方。一般来说推荐质量下降会导致用户请求量降低,但这个问题恰恰相反地引发了请求增加。整条异常传播链在 A 调 B、E 调 F 两个节点上被中断,指标层面看起来一切正常,依赖 Metrics 根本无从关联。跨部门协同更是人为增加了难度——主站的同学不了解下游部门内部的变更事件。这个问题最终耗费了大量人力,排障群一度达到一百多号人。
用传统的监控三板斧——Trace、Metrics、Log,在这个案例中至少存在两个明显的断点。第一个断点出现在 A 调 B,请求正常,Metrics 无法关联,只能依赖业务经验,主站同学不得不去找部门 B 的同学人工确认。第二个断点更隐蔽:E 调 F 的故障由接口字段缺失引发,请求也是正常的,且由于这个逻辑此前没有走到过,很可能根本没有打 Log。这个断点的发现同样依赖内部同学的人工沟通。
由此得出的结论非常清晰:如果想让 Agent 去做这件事,必须在技术指标之外理解业务,否则永远无法跨越这两个断点。
怎么做到?除了常规的 Trace、Metrics、Log 与变更事件外,我们引入了业务代码 GIT。因为代码是唯一真实的文档,所有系统都构建在代码之上。最初的实践非常直接,引入 Coding Agent 对代码进行实时分析。一开始使用的是 Claude Agent SDK,分析一个代码库的时间大约三十分钟,这在排障场景中显然不可接受。切换到 PI Coding Agent 后,单库任务分析时长降低到五分钟左右。但即便降到五分钟,实际场景中依然有效率瓶颈。一次完整的业务排障任务通常涉及一条链路上多个服务,而且 Java 系统中还有大量 SDK 的底层依赖需要梳理,往往需要同时分析三到五个库,总共需要十五到二十五分钟,这个时间对于故障响应来说依然太长了。
问题的根源在于,代码虽然是唯一真实的文档,但它是抽象层次极低的东西。低抽象必然带来低效率。人在排障时,即使是服务的维护者,也绝不可能记住每一行代码,人脑中对业务代码进行了一定程度的抽象。如果让 AI 去理解,就必须降低它的认知成本。
我们的做法是建立一层代码抽象,称之为“业务资产”。比如对错误码标注其业务语义,对 Metrics 含义进行业务化描述,建立指标之间的拓扑关系——以 Feed 流场景为例,下游 推荐服务 可用率降低可能导致上游服务兜底率变化,最终引起 Feed 下发量的变化。还有一些开关配置会直接影响业务逻辑,我们也把它们的影响地图建立起来。这些资产的构建有两种模式:一部分通过离线沉淀,用 Coding Agent 离线生成核心代码的关系描述,放入知识库并以 Markdown 文档形式存储;另一部分则在排障过程中按需生成,Agent 实时分析完某个任务后,将其沉淀为 Skill,纳入知识库。通过这两种方式,业务资产就转起来了。
总结起来,解决“让 AI 理解业务”这一挑战的本质,就是消除人和 AI 之间的上下文代差。AI 获取传统监控数据相对容易,但研发脑中同时运转着大量其他信息——代码逻辑、指标关系、业务常识,比如主播开播后可能引起送礼请求的增加,以及外部事件。这些与代码逻辑一样,如果想让 AI 去排查,就必须将这些信息全部提供给它。
挑战二:如何对抗噪声
在实际执行中,告警噪声是一个让人极其疲惫的问题。从统计来看,系统中大部分告警是没有用的,告警噪声占比可能超过百分之七十五,真正需要关注的不到四分之一。
告警噪声带来的危害是实实在在的。我们内部曾复盘过一个 P2 级别以上的故障,发现故障发生后大约十分钟,某个指标已经发生波动并发出告警,但当时的值班人员直接点击了静默。此后该指标在十五分钟之内快速偏离到严重程度,却没有人感知,原因正是这个告警在七天之内报警超过十五次,值班人员已经产生了告警疲劳,基本看都不看就直接静默。
但如果让 AI 全量处理所有告警,又会产生新的问题。内部试验下来,Agent 在 ReAct 循环中完成一次完整推理的 Token 消耗大约在六、七十万到一百多万 Token 之间。快手主站每个月的告警事件总量大概在两三万左右,如果让 AI 处理所有告警,每月 Token 消耗接近一百亿,年化成本达到几百万人民币。除了成本问题,ReAct 循环的交互次数不可控,延迟也无法保证。
我们的解决方案是分成两层。第一层引入一个非常轻量的告警置信度评估 Agent 或 Workflow。它的任务是提取告警的“画像”——包括告警的周期性规律、每次触发后阈值偏离程度、恢复时间、服务分布以及曲线的聚集情况,将这些作为统计数据进行评估。举个例子来说明偏离分析的价值:某个可用率告警每天可能都突破四个九到 98%,有一天突然降到 60%,显然需要关注;如果仍然只是到 98%,可能就不需要关注。周期性同理:如果告警每天凌晨都报警,其置信度就相对低;假如某天突然下午开始报警,那这很可能是一个明显的异常信号。
经过置信度评估筛掉一部分噪声后,下一步就是对保留下来的问题进行排障推理。然而即便经过了初步过滤,推理阶段仍然存在大量噪声。系统中充斥大量技术指标的波动,比如服务恰好发生了 GC,但又不足以引起核心业务指标的波动,这些都会造成 Agent 的误判。另一个典型的噪声来源是变更事件:在发布高峰期,一条核心服务的关联链路上可能在一个小时内关联出五百多个变更,这些变更绝大多数都不会导致故障,但当故障真的发生时,Agent 必然会拉到这么多变更,怎么判断它们与告警到底有没有关系?这些都是潜在的误判信号。
我们的应对方法是引入类似循证医学的证据金字塔,建立证据分级体系。这个思路来源于医院看病的场景——医生每天接手大量病例,其中很大一部分病人可能仅仅因为焦虑来就诊,并没有什么实质性疾病,所以医生首先需要过滤噪声。而对于真正有病的病人,则需要进一步排查病因。医学在这个问题上已经是一套非常严谨的科学,有成熟的最佳实践,我们完全可以拿过来借鉴。
在这个金字塔中,最下层是原始信号,往上一层是背景上下文——比如外部趋势热点、静态服务依赖关系、工程师的经验。再往上是单点观测数据,比如单个 Metrics 异常或单服务指标异常。当这些单点异常通过 Trace 或拓扑建立关联时,就组成了多元融合证据,例如链路上关联的变更、匹配历史故障模式等,这构成了更坚实的一层。最上层是直接因果推断:指标之间有明确的有向图拓扑关系,或在源码层面已经实锤,或故障服务恰好对应时间窗口内的直接变更,这些都被认为是直接因果推断。
挑战三:如何衡量不确定性
目前在生产级 AI 系统中存在一个共识:跑一个 Good Case 非常简单,给出几个 Demo 很容易,但真正投入生产环境时,消除 Bad Case 极为困难,存在大量的 Corner Case 与 Silent Error。一位 AI 初创公司 CTO 曾在发文中提到这样一个观点:Demo 演示时只需找到正确路径即可,但在生产环境下,百分之九十的情况都是坏情况。为什么会出现这种情况?因为此前在程序中的确定性因素,在 AI 中变成了不确定性因素——同一个问题多次输入推理,可能形成不同的推理路径,结论也可能不一样。而且在一个极其庞大的业务系统中,影响因素非常多,任何一个变量变动都可能导致结果出现巨大偏差,类似于蝴蝶效应。
我们有一个非常真实的案例。最初做 Agent 时,我们想要召回“单点抖动”问题,因为大量 RPC 可用性告警可能是由于下游某个 Pod 的单点抖动造成的整体指标波动。做法比较简单,引入传统异动分析算法并增加下钻维度,将这个工具提供给 Agent 使用。然而加上这个工具之后,单点问题虽然被成功召回了,整体 Case 的准确率反而劣化了。原因在于,单点问题是一个极其高频的问题,在一个几千 Pod 的集群中发生概率很高,当核心业务指标波动时,往往伴随有单点问题。Agent 在排查访问量下降时找到单点问题,在排查搜索量下降时也找到单点问题,于是错误地建立了因果关系。这个案例的根因很清楚:它跟传统软件的确定性修复不同,优化了一个 Case,可能又引入了其他 Bad Case。
解决方法在这个问题上也有比较强的共识。Andrej Karpathy 在三月份的一篇推文中提到了一个观点:现在的 Benchmark 已经是新的 Meta 了。去年那篇颇具影响力的文章《Agent Design is Still Hard》也表达了类似的观点:评估和测试是最难的问题,到了一定程度之后必须引入 Benchmark。
我们的 Benchmark 体系分为两个阶段。第一个阶段是 Case 收集:故障发生后,从发生到智能归因,经过专家标注后进入评测阶段,Case 被加入评测集,判断其是否值得纳入,相关数据进行转储,然后跑一个评测 Agent,进行效果对比。在评测集设计阶段,目标是覆盖真实的业务问题空间,所有 Case 全部来源于线上真实的异常场景。在评测集数据构造阶段,目标是复现真实的排障环境,我们采用了快照式的监控数据转储方案。快手每天会产生大量监控数据,部分数据有过期机制,我们需要将故障发生期间的监控数据尽量转储出来。
之所以没有采用仿真环境或混沌工程的方案,是因为我们要解决的是业务场景的问题,这类问题非常难以通过混沌工程来模拟。比如搜索量下降,你不可能真的去构造一个搜索量下降的故障——请求量太大,模拟成本太高。所以我们更多是从真实异常中收集案例,保存故障现场。在评估阶段,目标则是衡量模型效果,关注核心指标,比如线索命中率,进行量化评分,与预期行为做比对。
挑战四:对抗幻觉
大模型幻觉是一个绕不开的话题。有一个在去年 Claude Opus4 模型下发现的典型案例,虽然现在有了 4.7 可能已经不存在了,但它带来的启示仍然有效。有一次一位同事发给我一段 Prompt,我直接发给了 Claude,Prompt 非常简单,就是让它把时间转换成时间戳。结果发现它几乎做不了这件事,每次转换都不准确。后来我只是稍微修改了一下提示词,告诉它通过运行 Python 脚本的方式来帮我转换,结果就变得极其精准了。这个小小的实验非常清楚地说明了一件事:大模型本质上是一个概率预测器,并不擅长数值计算任务。
在实际业务场景中,我们遇到的第一个问题是识别监控图片中的简单趋势,比如八点到八点二十之间某个指标是上升还是下降。这本来是一个非常简单的事情,但我们用大模型尝试的时候却出现了明显的幻觉。最初想到的方案是用多模态去识别,直接把监控截图发给了大模型。这种方式幻觉相当严重——图片中 8:00 到 8:20 之间确实有下降,但时间点不够精准,模型只能给出非常模糊的时间范围。更糟糕的是,有时大模型对纵轴的理解也不准确,甚至会突然说一句“我在 8:30 发现了一次下降”,这显然是严重的幻觉。而且这种方案还依赖于图表样式的稳定,前端同学随意调整一下图表的颜色或布局,准确率可能就立刻受影响。
第二种方案是用时序数据进行识别,把一段时间内所有数据点的“时间-值”对构成一个巨大的 JSON List 直接发给大模型。结果依然逃不出计算出错的问题。首先是 Token 消耗太高,数据序列实在太长了。其次,它仍然需要执行计算,比如判断到底下降了多少百分比,大模型对此还是处理不好。
最终我们把这件事转变成了传统算法的任务,用孤立森林算法结合一些规则去判断。采用这种方式后,准确率显著提高,也不消耗 Token,确定性也得到了根本性的增强。由此得出的一个结论是:当确定性要求超过一定程度时,工程化封装成 Tool 和 Skill 是更优解。
将某个判别能力封装为标准化算子之后,它就拥有了标准化的接口,可以被复用,也可以配置可调参数。一旦沉淀为标准化算子,就可以逐步积累成一个算子库。借鉴类似 AutoResearch 与 CodeAct 的思路,把确定性重复问题沉淀成算法,然后为这些算法准备一系列输入输出——本质上就是一个函数。我们准备一些 Case,要求在输入 A 的情况下输出 B,在输入 C 的情况下输出 D,不断去跑,目的就是提高算法的得分。这一步就非常容易量化了,很容易形成一个有正向反馈的迭代回路,持续地打磨算法。
三、核心机制和架构设计
从整体演进路线来看,在 AI 引入之前是纯 Rule-Based 的阶段。AI 刚出来时,我们尝试将一些 SOP 用 Prompt 编排起来。Workflow 出现后又尝试过 Workflow 与 MCP 的组合。到去年下半年,我们开始真正尝试让 Agent 完全由大模型自主决定何时停止、何时继续排查。
有一个值得认真思考的问题:从 Workflow 演进到 Agent,一定是更优的选择吗?Workflow 的优点很明确,确定且可控,但它的局限性也同样明显——它严格依赖编排好的流程,依赖固定的流程编排,非常缺乏灵活性。Agent 解决了灵活性的问题,非常发散,有泛化能力,但同时也带来了不确定性。同时把 Workflow 换成 Agent 还会产生延迟的增加——ReAct 循环多轮必然导致延迟大幅上升,Token 消耗也是巨量爆炸。Workflow 不存在这些问题,延迟更低,Token 消耗更少,确定性更强。所以我们发现 Agent 对 Workflow 并不是一个纯粹的取代关系,Agent 更像是一个更灵活的升级,而非一个“更智能”的代名词。在某些场景下,用 Workflow 的效果确实更好。
那么为什么要用 Agent?因为在复杂的业务排障场景中,存在相当多的高度不确定性问题,这些问题没有办法用静态 SOP 覆盖。这就是引入 Agent 的核心价值所在。
整体告警治理的架构也是分层的。最下层是告警噪声,通过传统的告警治理、常规策略治理以及智能告警的引入,先把噪声降下来。上面的两层就是 AI 去处理的范畴。第一层通过一些 Workflow 进行“快思考”,将相对固定的系统类告警场景处理好,比如 SOP 场景、Redis 排障场景、Java 异常场景。这些东西相当套路化,可以变成快思考的简单问题来处理。最上层则是核心业务指标的突变,我们引入 Agent 进行“慢思考”,做深度推理。
在快思考这一层,从告警事件发出,经过抑制规则判定,比如被认定为一个单点问题,直接就可以处置,把单点重启一下,告警抑制掉即可。然后结合特征画像分析,会抑制掉相当一部分告警。剩下的告警进行简单的复杂度判定,有些问题通过维度分析、简单影响范围分析,就被认为可以在 Workflow 内解决,直接同步归因。对于那些比较复杂的问题,就走异步的 Agent 分析流程,可能耗时十分钟以上。Workflow 这一块的确定性相对较高,也会比较快速地出结论。
在复杂问题的慢思考层面,我们采用 Multi-Agent 架构。告警事件触发后进入平台,进入主 Agent 循环,创建一个 Plan 计划,动态调用底层的若干 Sub-Agent。底层有业务资产和数据基建作为支撑,最后输出可解释的报告。这里用到了几个关键技术点:第一是 SubAgent 领域封装。我们的工具加起来有八十多个,如果把这八十多个工具直接全量抛给主 Agent,其认知负担极大,Token 消耗压力也巨大。因此我们会把相近领域的 Tool 组成 SubAgent 封装起来。第二是在长任务中仍然可能需要代码分析,我们将这种代码分析异步化,投递到信箱中,让主 Agent 进行消费。第三,由于采用 SubAgent 的排查方式,各 SubAgent 之间的信息是隔离的,个别 SubAgent 容易陷入无效路径。比如某个 Agent 已经发现了关键线索,找到了关键的变更事件,那可能就没有必要继续做 RPC 下钻了。我们的解决方法是组成 Agent 通信 Team,让 SubAgent 之间进行必要的通信,以缩短整个排查路径。
在 Agent 自进化方面,我们的思考是这样的:大模型存在两个极端。如果非常泛化,不给它任何 Case 参考,就是 Zero-shot 的推理模式,可能会过于发散。但如果把 SOP 在 Prompt 里完全定死,第一步做什么、第二步做什么,又会产生过拟合。所以我们采用 Few-shot 的模式,告诉他类似故障大概要怎么处理。但构建 Few-shot 案例的过程中存在人工成本,需要人一个个去构建。为了解决这个问题,我们设计了一套自动构建案例集的系统。事先准备好一些问题和正确答案,然后让 Agent 启动迭代模式,不断去跑。过程中把模型换成小模型,提高温度,让它跑出非常多的路径,直到命中那个正确答案。当评估 Agent 认为它命中了,就把整个评估过程抽取出来,做一份摘要,加入到经验库中沉淀下来。
在 Agent 记忆方面,排障需要查询的信息量非常庞大,告警画像的统计信息、研发脑中的业务知识,这些可能都需要在推理启动时初始化到 Context 中,初始化到 System Prompt 里。推理过程中则会有动态的检索搜索过程,去搜索历史离线业务资产、过去推理过程所沉淀下来的长期记忆,以及场景化的 Skill,这部分 Skill 可能比较偏 SOP。这些东西我们会尽量让 Agent 自己去进行合并与整理,而不是消耗大量人力去人工解决。
在产品交互层面,我一直在思考一个问题。从去年 Claude Code 出来,到今年一月份 OpenClaw 发布,我身边的很多程序员同事并没有对 OpenClaw 展现出很大的热情,但它在社会上却产生了巨大的反响。Claude Code 为什么没有产生类似的反响?增量究竟是什么?观察下来,我们发现 OpenClaw 有一些独特的能力:接入了 IM,默认给全所有超级权限,有心跳机制来感知任务进展。总结起来,现在同类产品统一的特点就是让 AI 越来越 Proactive,越来越主动。
所以我们产品迭代的思路也是沿着这个方向走。最初形态是研发输入一个问题,Agent 进行推理,过程中给出一些关键发现,实时绘制链路拓扑,整个产品以 Chatbot 的形式对外提供服务。但未来的方向还是要发展成更加 AI Native 的自驱模式,让 Agent 能够自动发现问题,需要拉群就自动拉一个群,不断把它发现的关键线索抛在群里,最终实现从问题感知到排障处置到协同处理,甚至自己也可以进行经验沉淀,这种完全的闭环才是理想中的终态。
在核心指标运营上,面向告警和故障处置,我们最终要衡量的是 MTTR 的缩短。但实际过程中真正遇到故障的频次相对较低,案例数量有限,所以我们引入了一些过程指标。第一个过程指标是“有效线索率”。为什么会有线索这个概念?是因为整个 Agent 推理时间比较长,一个任务可能十分钟以上才能完成,不可能等到十分钟才告诉研发结论。过程中每发现一个值得分享的关键线索,就应该抛出来。因此关键线索的准确率就成为一个重要的衡量维度。同时我们也有归因的准确率以及归因时长,这些都需要持续运营。
目前我们在整体准确率上达到了百分之八十以上,但这个数字包括了非常多的告警噪声。实际推理层面的准确率并没有这么高。在推理层面目前主要衡量有效线索的准确率,让 Agent 最终把根因推对是相当困难的,但只要过程中发现了有效线索,就已经能给业务带来实际价值。
在实践中我们也踩过很多坑。比如遇到大模型层频繁失败的问题,API 接口不匹配的问题,不同模型厂商之间的大模型接口存在非常大的差异。这些问题本质上是软件工程的问题,需要去处理故障、防范故障、增强系统的容错能力。在过去做分布式系统开发时,我们就一直在对抗环境的不确定性。AI 的引入是把这种不确定性进一步增强,变成了一个常态。理解这一点之后,我们的心态反而变得坦然了:只能去拥抱它。
四、总结和展望
最后我想分享一个认知:“拿着旧地图,找不到新大陆”。现有的监控系统全都是围绕着人去构建的,全是为了给人使用而设计的。人有一个显著特点,就是认知是有带宽限制的。我们给老板做汇报时,需要把大量复杂信息屏蔽掉,浓缩成抽象、简单的结构。系统在给人汇报时也是一样的逻辑,不可能把底层所有数据都全量展现出来,只能做数据抽象。但 Agent 不存在这个问题,它几乎可以处理无限多的复杂数据。那么未来的系统会怎样发展?可观测的整个体系是否会被整体重构?这个问题我没有答案,也在持续思考。
另外还有一点,现在的整个组织都是按照人来组织架构的,人是高度分工的。但 Agent 不需要分工,而且人与人之间存在信息隔离,组织上的某些问题会跟技术问题纠缠在一起,比如谁掌握更多信息谁就掌握了主动权。但对于 Agent 来说也并非如此。从第一性原理出发,有些东西已经变了。
再说回现在的发展。Agent 领域发展极快,很多结论过两个月就可能已经过期。那到底能积累下什么东西呢?我们认为有一些东西是可以复用的——问题域业务资产、Eval 评价体系、结构化案例集、人机协作模式,这些东西是稳定层,可以持续积累。同时也有易变层,随着模型迭代,下半年出了一个更强大的模型,很多当前适用的东西可能就没用了,Prompt 描述、工具选型、协议规范都在这个范畴。我们的思路是把更多精力投入到稳定层上,尽量减少在易变层上的投入,因此会更多地构建数据上下文。
最后,我认为整个方向还是要向着 AI Native 自主化、AI 自进化的方向演进。目前 Agent 能做到的是提供辅助决策,由人主导排查问题。后面可能会发展到一个新阶段:Agent 自己出决策建议,人进行最终审批,起到一个把关兜底的作用。最终,如果这个阶段运行得足够久,我们发现在百分之九十九的场景下 Agent 都是准确的,人的审批已经没有提出任何有效修订的空间,那就可以完全走向 Agent 自我进化、自主闭环了。
欢迎加入【快手技术交流群】
扫描二维码👇
点击【阅读原文】,获取讲师PPT!
阅读原文
跳转微信打开
関連記事
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み