快手、AI 活用による機能フラグ全ライフサイクル管理を提案
本文の状態
日本語全文を表示中
詳細モードで約33分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
Kuaishou Engineering
快手技術チームは、AI エージェントを活用した機能スイッチの全ライフサイクル治理を推進し、膨大な技術債の解消とシステム安定性の向上を実現する具体的な実践例を公開した。
AI深層分析を開く2026年8月1日 00:48
AI深層分析
キーポイント
機能スイッチが招く技術債の深刻さ
業務の複雑化により機能スイッチが爆発的に増加し、コード維持コストの上昇、計算・帯域リソースの浪費、および見落としによる安定性リスクという4つの重大な課題を発生させている。
AI エージェントによる自動化治理
人工知能エージェントがスイッチの検出、分析、削除提案を行うことで、人間による手動管理の非効率性を克服し、全ライフサイクルにわたる自動的なガバナンスを実現する。
双エンジン安全护栏と自進化
AI の判断を裏付けるための検証エンジンと、運用データに基づいて自ら改善を行う自進化メカニズムを組み込むことで、自動化プロセスの安全性と信頼性を担保する。
AI ネイティブな治理への転換
従来のルールベース管理から脱却し、AI が自律的にスイッチを管理・消滅させる「AI ネイティブ」なガバナンスパラダイムへ移行する必要性と具体的なロードマップを示している。
多輪対話と強固な検証フレームワークの構築
大模型に記憶を持たせずコンテキストを永続化して多輪対話を可能にし、論理・コンパイルなどの検出プラグインによる第一道安全柵でエラーを検知する。
重要な引用
最好的治理,是治理本身被遗忘;最好的系统,是系统自己照顾自己
大量长期存活的开关正在演变为一种沉重的隐性技术债
代码几步之内就能发现一个开关
哪怕已经推全的开关,如果不加治理,就可能成为一颗随时引爆的定时炸弹
編集コメントを表示
編集コメント
機能スイッチ管理における技術債の解消策として、AI エージェントによる自律的なガバナンスを提案する点は非常に示唆に富んでいる。特に「治理そのものが忘れられる」ことを理想とする視点は、自動化の究極形を示すものと言える。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。
「最高のガバナンスとは、ガバナンスそのものが忘れ去られること。最も優れたシステムとは、自らを管理できるシステムである。」
微サービスとアジャイルな開発サイクルの深化に伴い、機能フラグ(Feature Flag)は現代のソフトウェアデリバリーにおける不可欠なリスク制御手段となっています。しかし、業務が極めて複雑で、イテレーションが非常に速い超大規模システムである快手のような環境では、長期にわたって存続する多数のフラグが、重たい隠れた技術負債へと変貌しつつあります。
本稿は、QCon 全球ソフトウェア開発大会 2026 北京大会で、快手のシニアサーバーサイドアーキテクトである閻文亮氏が行った基調講演「機能フラグを自己消滅させる:AI によるフルライフサイクルガバナンス」の内容を整理したものです。氏は、AI を活用した機能フラグの全ライフサイクルガバナンスにおける実践を振り返り、ガバナンスの行き詰まり、AI エージェントの実装プロセス、ダブルエンジンによる安全バリア、自己進化メカニズム、そして AI ネイティブなガバナンスパターンの進化に至るまでの全体像について解説しました。
一、Feature Flag の価値と隠れた技術負債:ビジネスの必須要件から技術負債の罠へ
快手アプリは起動時にバックエンドサーバーの特定のインターフェースを呼び出します。ある時、このインターフェースが新機能のアップデートにより、クライアント側で互換性のないフィールドを返したことが原因で、アプリがクラッシュしました。バックエンドの開発チームは即座にコードをロールバックしましたが、クラッシュが発生したのは起動直後の極めて早い段階であり、その時点でクライアント側はまだ修正されたコードを取得できていませんでした。結果として再度クラッシュし、「起動すればクラッシュ、再起動してもクラッシュ」という無限ループに陥ってしまいました。
当時、クライアント側の「安全装置」や「セーフティモード」は未だ不十分でした。最終的にはユーザーに対してアンインストールと再インストールを促すしか手がなく、この状況に直面した開発者の心境は想像に難くありませんでした——極めて焦り、必死の思いで対応していたことでしょう。
その時、誰もが繰り返し問うていた命題があります。「どうすれば、新機能のリリースをもっと自信を持って、余裕を持って行えるのか?」
これに対する標準的な答えが「Feature Flag(機能フラグ)」です。これは本質的に、機能のリリースとコードのデプロイを分離するソフトウェア技術です。仮に当時、万全なフラグ管理機能が備わっていたなら、新機能はまず内部ユーザー向けに限定して開放し、モニタリングで問題が確認されてから段階的に外部へ展開できたはずです。そうすれば、今回のような大規模障害は回避できた可能性が高いのです。
さらに、Feature Flag(機能フラグ)を使えば、コードのリリースと機能の公開を完全に切り離すことができます。
例えば、A・B・C の 3 つの機能を同時にリリースする際、もし B に問題が発生しても、スイッチがなければ 3 つ全体を巻き戻さざるを得ず、結果として A と C も延期せざるを得なくなります。しかし Feature Flag を使っていれば、B の機能だけをオフにすればよく、A と C には影響がありません。
このように、Feature Flag は非常に強力なツールです。特に AI コーディングが主流となった現在では、コードを自分で書くのではなくすべて AI に生成させるため、リリースに対する不安はより大きくなっています。そのため、Feature Flag を活用してリリースの自信を持つことが、以前にも増して重要になっています。
しかし、その反面で Feature Flag があまりに便利であるがゆえに、快手(Kuaishou)のプロダクションコード内には膨大な数の機能フラグが存在しています。誇張ではなく、コードを数行読むだけで必ず 1 つは見つかるほどです。
例えば、快手の検索業務に関するコードを見てみると、検索自体のためのスイッチだけでなく、ローカルライフや EC(電子商取引)関連のスイッチも混在しています。その理由は、快手のビジネスフローが極めて複雑であるためです。あるコンテンツを検索する際にも、ローカルライフのフィードや EC の商品が表示される可能性があります。こうした多様な機能のためにスイッチが積み重なり、それぞれの役割や責任範囲が曖昧になっていきました。
このように大量に蓄積されたスイッチは、4 つの深刻な課題をもたらしています。
まず第一に、コードの保守コストが急増することです。新人がプロジェクトを引き継ぐ際、無数のスイッチの中から論理を整理し、どの部分が有効で、どの部分が廃止されたのかを判断する必要があります。AI コーディング時代においては、コードが自分自身の手によって書かれたものではないため、誰しもが新人同様の状況に置かれ、コストは依然として高いままです。特に AI がコードを読み込む場合、どのロジック分岐を実行すべきかを決定するために各スイッチシステムの値を参照する必要があり、これはさらにコストを増大させます。
第二に、計算リソースの浪費です。呼び出しや論理判断のたびに、どのブランチへ進むべきかを確認する処理が発生します。これが積み重なると、無視できないほどのリソース損失となります。例えば、快手のショート動画メイン業務(上下流は除く)では、1 秒間にスイッチを参照する回数がなんと 155 億回に達しています。
第三に、帯域幅のリソース浪費です。クライアント側でも機能リリースのためにスイッチを利用する必要があり、その値はバックエンドサービスから配信されます。その結果、1 つの API で配信されるスイッチの数が膨大になり、帯域コストが莫大なものになります。快手では、スイッチの配信だけで毎年数百万円の帯域コストが発生しています。
第四に、隠れた安定性のリスクです。期限切れとなったスイッチは、時折「完全に展開済み」の値を取得できず、古いロジックへ分岐してしまいます。これがオンライン上の問題を引き起こす原因となります。実際の事例として、数年前にすでに 100% 展開済みのスイッチがありながら、古いロジックが削除されず、そのまま放置されていたケースがあります。ある日、小さなバグによってスイッチの値が取得できず、予期せぬ異常が発生しました。業務チームは徹夜で調査を続け、ようやく根本原因を特定することができました。
つまり、すでに 100% 展開済みのスイッチであっても、適切に管理されなければ、いつ爆発してもおかしくない時限爆弾となり得るのです。
既然危害如此明确,为什么业务团队仍缺乏治理的动力?首先,开启开关极其容易:只需一分钟写一个 if 语句,就能解决发布风险、赋予发布自信、实现部署与发布的解耦。但删除一个开关却复杂得多:需要梳理上下游业务、评估下线风险、修改代码、重新发布并测试,耗时短则一小时,长则更久。
其次,在心态上,加开关是顺手的事,而删开关既无直接收益又需承担风险,业务人员自然不愿主动去做。再次,从组织层面看,员工离职交接时往往会留下所谓“后人的智慧”:我创建的开关我不删,留给后人治理;后人一看,不知这开关的用途,担心下线有风险,干脆放着不动。再加上跨部门合作的开关职责不清,人人都不敢动。债务越积越多,谁也不愿删除,形成了一个死循环。从快手某部门的开关增长数据来看,每年新增量高达数千个。
尤其值得警惕的是,麻省理工学院的一位教授曾预言:“人工智能就像一张全新的信用卡,让我们以前所未有的方式积累技术债。”人写代码的速度有限,债务还有时间修复;但如果未来代码都由 AI 生成,技术债将呈爆发式增长。如果当下不开始治理,后续的时间窗口可能都会错过。
过去我们也尝试过多种传统治理手段:例如建立平台规范、为开关设定下线时间、搭建审计看板等,但这高度依赖业务的自觉性,执行力度参差不齐;也有编写自动化脚本删除开关的做法,效率尚可,但一旦遇到代码嵌套或业务逻辑复杂的场景,极易出错;再熟悉不过的是开展专项治理行动,拉一群人同步进度、强推治理。这种运动式治理确实立竿见影,但往往是一阵风过后不久就反弹,反弹后再拉人治理,治完又反弹,形成“治而不绝”的死循环。治理速度远远跟不上开关新增的速度。
直到 AI 的出现,才真正让我们看到了打破这一死循环的可能。2024 年下半年,我们判断,用 AI 治理开关的内外部条件已经成熟:外部,大模型迭代极快、API 成本持续下降,模型在代码理解与修改上的能力已趋可靠;内部,我们对高效、安全且尽可能无需人工介入的治理方式有着迫切需求,加之公司 AI 基础设施的持续投入,我们认为时机刚刚好。快手由此跨入了 AI 治理的新时代。
二、治理 Agent 的演进与工程落地:从 Demo 到工程落地
回顾快手开关治理的整体历程:2025 年之前,主要采用运动式治理,靠拉人推业务,效果差、效率低;2025 年上半年,我们推出了 AI 开关治理 Agent,帮助业务提效,极大减少人工介入;从 2026 年至今,我们正在构建 AI Native 开关治理。其核心思想已不再是人全程治理开关,而是“让开关自己下线”。AI Native 强调的是:搭建一套让 AI 觉得治理效率高的整体环境,而不是让人感觉治理效率高的人为方式。
振り返れば、2025 年の上半期のことだ。当時私は Cursor を使ってある機能の開発を進めていたが、Cursor とのやり取りで何度も行き違いが生じ、システムが「管理すべきスイッチ(Feature Flag)の数」を警告するメッセージを表示した。その時、私は即座に Cursor に指示を出した。「スイッチ A はすでに 100% ロールアウト済みだ。不要なコードとスイッチを削除してくれ」と。
Cursor はすぐに修正を終え、コードのフォーマットやロジックも正確だった。この体験から私たちは、「AI が単一のスイッチ管理をこなせるなら、それをスケーラブルにできないか?」と考えた。しかし、全員が Cursor を導入して手作業で一つずつ管理するのは現実的ではない。そこで、大規模な管理のために大規模言語モデル(LLM)の API を直接呼び出すアプローチを試みた。
すぐにデモを構築し、プロセスは極めてシンプルだった。まず、スイッチがどのコードから参照されているかを特定し、Git Open API を使って該当ファイルのソースコードをローカルメモリに取得する。次に、そのソースコードと修正指示(プロンプト)を LLM に渡す。最後に、LLM が修正した結果を受け取り、再び Git Open API を経由してリモートで MR(Merge Request)を作成すれば完了だ。
しかし、この試作デモはすぐに多くの課題を露呈させた。例えば、AI はまだ使用されている import 文を削除してしまう「減号二行」の問題や、意味もなく大文字・小文字を変更するケースが頻発した。当時はプロンプトのチューニングが注目されていたこともあり、私たちは伝統的な手法を採用した。具体的には、禁止事項をプロンプトに明記したり、サンプル事例を提供したり、「思考してから修正せよ」という Chain of Thought(思考連鎖)を指示して「安易に変更せず、誤りを防ぐ」よう求めた。
これらの対策により、AI によるスイッチコードの修正精度は大幅に向上し、比較的シンプルなシナリオでは 70%〜80% の水準まで達した。
しかし、スイッチ管理という文脈において、70%〜80% の精度では業務上許容できない。なぜなら、論理を一つでも誤って修正すれば、それは重大なオンライン障害に直結するからだ。以下に、実際に起きた恐ろしい事例を挙げる。
第一に、メソッド名とスイッチ名が完全に一致している場合、AI がメソッドをスイッチと誤認し、関数自体を削除してしまうケースだ。これにより、機能モジュール全体が無効化される。
第二に、ロジックの反転である。本来は false の時に A を実行するロジックを、true の時に A を実行するように変更されてしまう。これはより深刻な結果を招く。
第三に、スイッチ名の混同だ。スイッチ A と B が非常に似ている場合、「A を削除して」と指示しても、AI は B も一緒に削除してしまう。
第四に、無関係なコードの改変である。全く関係ないロジックに対して、AI が理由もなく手を加えてしまうケースだ。
これらの事例から、私たちは明確に認識した。大規模言語モデルを完全に信頼することは、障害が起きるのを待つことと同じだ。AI が常に正確であるはずがないため、すべての誤りを検知・阻止し、誤ったコードが本番環境へ漏れないよう、堅牢なセーフティネット(安全装置)を構築する必要がある。
OpenAI の共同創設者であるアンドレイ・カルパティ氏は、Vibe Coding(感覚的なコーディング)という体験を共有したことがあります。彼は AI にコード生成を任せる際、結果を確認せず、AI が出力したコードをそのまま受け入れるそうです。エラーメッセージが出たら、それをコピーして AI に入力するだけで、何も追加の説明を加えずに解決してしまうのです。日常で AI チャットボットを使う際にも似た感覚があります。大モデルが最初の回答で期待通りの結果を出さなかった場合、追問することで修正を促せば、多くのケースで問題が解消されます。これが多輪対話の基本的な考え方です。
この考え方を元に、セッションベースの多輪対話システムを構築しました。大モデル自体には記憶機能がないため、会話全体のコンテキスト(文脈)をすべて永続化して保存しています。エラーが発生した際、過去のメッセージ履歴とエラー情報をセットで再度大モデルに送信し、既存の文脈を踏まえた上で改善案を出させるようにしています。
多輪対話が可能になったことで、新たな課題が浮かび上がりました。「AI がどこまで間違えているか」を検知する方法です。そこで、強力な検証フレームワークを構築しました。
この検証フレームワークは拡張性を重視し、あらゆる種類の検出プラグインをサポートして不良ケース(Bad Case)をブロックできるように設計されています。現在、2 つ主要なカテゴリの検出プラグインを実装しています。1 つ目はロジックチェック用プラグインです。不要なスイッチが誤って削除されていないか、ブール論理が逆転していないか、ビジネスロジックに抜けがないか、スイッチ関連以外のコードが誤って削除されていないかなどをチェックします。2 つ目はコンパイルチェック用プラグインで、Checkstyle などのコーディング規約に準拠しているか、構文エラーはないか、パイプラインでのコンパイルが成功するかなどを検証します。
この強力な検証フレームワークと多輪対話を組み合わせることで、最初の安全装置(セーフティネット)が完成しました。具体的なフローは以下の通りです。ソースコードと修正指示を大モデルに渡した出力結果は、まず第一の安全装置でチェックされます。ここでは構文解析、ロジック検証、コンパイルテストなどが行われます。もし安全装置を通過できなかった場合、過去のメッセージ履歴とエラー情報を再度大モデルへ返し、大モデルが継続的に修正を加え、すべての安全チェックに合格するまでループします。これで初めて「一応問題ない」と判断されます。
しかし、安全装置自体も常に進化し続けるものであり、あらゆる不良ケースを 100% 防ぐことは不可能です。そこで、第二の安全装置として「人間の最終チェック」を導入しました。AI が登場する以前から、コードは人間によるレビューを経てからリリースするのが常識でした。AI の時代になっても、この原則は変わりません。大モデルが人間に代わって作業を行うのは事実ですが、では大モデル自身でコードレビューを行えないかという実験を行いました。
具体的には、3 つの異なる大モデルを使って、メインの大モデルが生成したコードを検証する実験です。これら 3 つのモデルは互いに独立しており、コンテキスト(文脈)を共有しません。少数決を採用し、3 つのうち 2 つ以上が「問題なし」と判断した場合にのみ、その結果を承認します。
しかし、避けて通れないバグがあります。大規模言語モデル(LLM)による評価が本当に正しいとどうやって保証できるのでしょうか?これは本質的に「確率的事象で確率的事象を解決する」試みであり、レビュー結果の 100% の正確性を保証することはできません。もし 100% の保証ができないなら、結局は人間による 100% のレビューが必要になってしまいます。
例えてみましょう。AI が「このコード修正の正解率は 99% です。100 個修正すれば 1 つ間違いますが、どの箇所が間違っているかは教えられません」と言った場合、あなたは 100 個すべてを人間で確認する必要があるでしょうか?そうであれば、人間の関与は全く減りません。
真に人間の介入を減らすために、私たちは『Program-Aided Language Models(プログラム支援型言語モデル)』という論文を調査しました。この論文の核心は、大規模言語モデルが自然言語による質問を読み解き、推論ステップを生成するプログラムへと昇華させ、実際の解決ステップは Python などのインタプリタに任せるという考え方です。
これは以前、同僚が経験した話と重なります。彼は LLM に「100 個の文字列を生成してカンマで連結して」と指示しました。LLM は瞬時に結果を出力し、目視で確認しても問題ないと思われました。しかし後になってみると、2 つの文字列が欠落していることが発覚しました。目で追うだけではその欠落を見つけるのは極めて困難です。
私は彼にこうアドバイスしました。「今後は LLM に直接結果を出させるのではなく、スクリプトを書かせてください。まずそのスクリプトを人間がレビューし、その後で実行すれば、ほぼ間違いなく正確な結果が得られます」と。この考え方をコードガバナンスに応用したのが、本稿の提案です。つまり、人間の最終チェックに頼るのではなく、確定的なプログラムによる検出で代替するのです。
具体的な実装では、AI がコードを修正した後、AST(抽象構文木)エンジンが同じコードに対して再度修正を行います。もし AST エンジンが生成したコードと AI が生成したコードが完全に一致すれば、問題なしとして人間のレビューは不要です。両者が不一致であれば、初めて人間が介入します。
AST エンジンは、ルールと有向グラフを組み合わせたアーキテクチャを採用しています。ルールは原子化されており、1 つのルールは 1 つのことだけを行います。例えば「if 文の整理」や「フィールドの削除」「メソッドの削除」などです。AST エンジン全体は有向グラフによって駆動され、各ルールを順次実行することで、コード修正の平衡状態に到達します。
これにより、「大規模言語モデルによる生成」と「AST による検証」を組み合わせた双エンジンアーキテクチャが確立されました。大規模言語モデルは探検者のように振る舞い、コードの曖昧性を処理し、革新的な解決策を提案して、ハードコーディングではカバーしきれない問題を解決します。一方、AST エンジンはその検証者として機能し、プログラムルールによってゼロ障害を確保します。
全体のフローを段階的にまとめると以下のようになります。まず、元のコードと修正指示(プロンプト)を取得します。これを大規模言語モデルに渡して修正を行います。その後、第 1 の安全装置として、ロジックチェックやコンパイルチェックなどを実行します。この第 1 の安全装置を通過したら、AST エンジンが再度コードを修正します。
修正完了後、AST の結果と AI の結果を Diff(差分)比較します。両者が一致すればレビュー合格とし、人間の介入は不要です。もし差異があれば、第 2 の安全装置として人間によるレビューに移行し、問題が解消されるまで続けます。実践の結果、この AST エンジンによって膨大なレビューコストを大幅に削減できることが確認されています。
ここには二つの核心的な疑問が生じます。
第一に、AST エンジンは本当に正しいのかという点です。誰が自分の書いたコードを 100% 正確だと保証できるでしょうか?私たちはいくつかのセーフティネットを用意しています。例えば、クイックハンド(Kuaishou)の採用基準をパイプラインで引き継ぎ、ユニットテストやインテグレーションテスト、トラフィックの録画再生、Diff 確認などを適用します。しかし、これらだけでコード変更の正確性を完全に保証することはできません。
最も重要な考え方は、「なぜ AST で人手によるレビュー(Code Review)を代替できるのか」という点です。それは AST が 100% 正しいからではありません。むしろ、業務側のガバナンス(管理・統制)の負担をプラットフォーム側に移したからです。以前は、業務側がコードを変更してガバナンスを行う必要があり、もし間違えれば責任も業務側にありました。しかし現在では、業務側は自分でコードを変更する必要がなく、AI が変更を行い、AST がレビューを行います。もしこの一連のプロセスに問題が生じても、その責任はプラットフォーム側が負います。
プラットフォーム側は単なる効率化ツールの提供者という役割を超え、業務側と共に立ち、ガバナンスの責任を共に担うパートナーとなりました。この責任の移転により、業務側のガバナンスへの協力度が劇的に向上しました。また、AST エンジンと AI エンジンの両方が同時にコードを間違える確率は、私個人の見解ではほぼゼロだと考えています。不確実な生成結果と、決定論的なプログラムが、同じ間違いを犯す可能性は極めて低いからです。
さらに、両者のエンジンはお互いに補完し合い、強化し合います。AST が AI の変更を誤りと判断すれば、それをフィードバックして AI を最適化できます。逆に、AI が AST の判定に疑問を呈すれば、AST の精度向上にも寄与します。
第二の疑問は、「AST エンジンがあるなら、なぜ AI エンジンも必要なのか」という点です。「AST エンジンを最終的な上限とする」のであれば、AST は必ずしも正しいとは限りません。例を見てみましょう。AI エンジンがない場合、元のコードから AST エンジンによる変更完了までを想定します。AST はすべてのシナリオを 100% カバーできないため、複雑なケースでは間違いが発生し、かつどのシナリオに対応していないかを事前に予測することはできません。その結果、依然として 100% の人手によるレビューが必要になります。
しかし、AI エンジンを加えることで状況は変わります。AST 単独のプロセスでは人手によるレビューが必須ですが、「AI+AST」の組み合わせであれば、人手によるレビューコストを極めて低いレベルに抑えられます。なぜなら、両者のエンジンで判断が分かれた場合のみ、人間が介入すればよいからです。
三、自己進化:人手からシステムへの自立的なアップグレード
AI と AST のダブルエンジン体制を整えても、AST エンジンや検証プラグイン自体は完璧ではありません。未検出の「Bad Case(失敗事例)」が残ってしまうことがあります。当時、このシステムの維持に要するコストは 1 人月未満でしたが、人手によるメンテナンスのコストは極めて高く、一連の問題を引き起こしました。
具体的には、効率性の低下です。毎日大量の MR(Merge Request)を人手でレビューする必要があり、レビューが溜まって待ち行列が発生します。また、人件費の無駄も生じます。AI が正しく修正した結果のほとんどから、人間が誤りを見つけ出す必要があるからです。さらに、対応の遅れも深刻です。AST エンジンや検証プラグインのバージョン更新速度が、人手のボトルネックにより常に追いついていませんでした。
そこで私たちは、AST と検証プラグインを自己進化させ、人間の関与をさらに減らす方法を真剣に考え始めました。
自己進化を実現する前に、人間がシステムを最適化する方法を例に考えてみましょう。必ず根拠を持って最適化する必要があります。つまり、每一次の変更が正しいのか間違っているのかを知る必要があります。これは業界で広く採用されている手法であり、「評価体系(ベンチマーク)」を構築することです。
私たちのプロセスは以下の通りです。コード変更が完了するたびに、Trace(追跡ログ)に基づいて、AI のプロンプト、レスポンス、AST エンジンの結果、検証プラグインの結果をすべてデータベースに保存します。次に、すべての結果に対して人手によるラベル付けを行います。AST レビューで既に合格したケースを除き、すべてのケースについて人手でのレビューを実施します。
その後、ダッシュボードを整備し、ラベル付け結果を可視化します。毎日分析会議を開催し、「どこが間違っていたのか」「なぜ間違えたのか」を特定し、AST エンジンの最適化か、検証プラグインの最適化かを判断して対策を講じます。最適化が完了したら、以前に保存されたすべての履歴データに基づいて評価を遡行(バックテスト)します。
この評価の遡行結果は非常に明確です。「正解なら正解」「誤りなら誤り」という結論が、プログラムによって即座に導き出されます。
評価システムの基盤となるのはデータ収集層です。AST エンジンによるレビューを通過したケースは自動的に評価セットに追加されます。同様に、人間が手動でレビューして「正しい」と判断されたケースも評価セットへ自動登録されます。
一方、人間が手動レビューで却下したケースは、「重要ケース評価セット」へと送られます。ここでのルールは明確です。将来の評価を遡る際、これらのケースは 100% の確率で通過させる必要があります。つまり、一度犯したミスを二度と繰り返してはならないのです。
このように評価セットが構築されると、次は上位レイヤーである注釈(ラベリング)工程へと進みます。注釈作業が完了すれば、いよいよ実行層へ移行します。ここでは本番環境から完全に隔離された、評価専用のパイプラインと環境を構築します。最終的にデータは分析層に流れ込み、リンク解析や結果の遡及調査が行われます。
この一連のチェーンを確立し、AI がシステム全体の自己進化を駆動できれば、正のフィードバックループ(フライングホイール)が形成されます。具体的には以下の通りです。
人間による注釈完了 → システムの自動最適化 → 自動評価の実行 → 評価通過による精度向上 → 精度向上に伴う人間の注釈量減少 → 削減された注釈量が再びループにフィードバック → 最終的に人間の注釈量はゼロに漸近する。
では、具体的にどのように進化していくのでしょうか。私たちは過去に行われたすべてのラベル付けケースを遡って分析しました。その結果、大きく分けて二つのパターンが存在することが分かりました。
第一のタイプは、「人間が再確認したところ AI の修正が間違っていた」というケースです。これは検出プラグインの能力不足を示しており、エラーを適切にブロックできていなかったことを意味します。つまり、現在のシステムには「盲点」があり、検出プラグインの最適化が必須であることを示しています。
第二のタイプは、「人間の注釈が正しく、AI も修正を完了していた」というケースです。しかし、なぜか人間が確認作業を行ってしまいました。これは AST Review がエラーをブロックしきれなかったことを意味しており、AST エンジンの改善が必要であるという証拠になります。
これらの洞察に基づき、私たちは「2 つの Agent を活用した特別アップグレードシステム」を設計しました。
まず、「人間の注釈が正しく、AI も正しく修正していたケース」については、AST 能力アップグレード Agent に任せることにします。この Agent はなぜ AST がエラーを検出できなかったのか、なぜシステムの判断が誤ったのかを分析し、自主的に修復を行います(例:AST エンジンのコード最適化)。修正とデプロイが完了すると自動的に評価がトリガーされ、問題がなければ本番へリリースされます。
一方、「人間の注釈が正しくなく、AI の修正も間違っていたケース」については、検出プラグインアップグレード Agent に任せます。この Agent はなぜ検出プラグインがエラーをブロックできなかったのかを特定し、プラグインのコードを補完します。これも同様に自動評価を経てリリースされます。
AST エンジンアップグレード Agent のワークフローを例に挙げると、その手順は即座にコードを書き始めるわけではありません。
最初のステップは「要件の理解」です。専用の要件理解 Agent が担当しますが、この Agent は設計案を作成したり PRD(製品要件定義書)を出したりするのではなく、「何を」「どのように行うべきか」を正確に把握し、まずはドキュメントを生成します。生成されたドキュメントは人間のレビューを経る必要があります。問題があればフィードバックループで修正を繰り返し、承認されるまで続けます。
2 つ目のステップでは、別の Agent が技術的な実装案の作成を担当します。ここではアーキテクチャ設計や核となる考え方、プロセスフローなどが含まれます。これもまた人間のレビューを経なければなりません。
3 つ目のステップは、自動コード生成とインテリジェントなコードレビューです。すべての審査を通過すると、デプロイパイプラインがトリガーされ、コードは隔離された評価環境へデプロイされます。そこで自動評価が行われ、一連のサイクルが完了します。
至此,我们可以完整俯瞰整个治理系统的运作全景。整体流程分为上下两层:上层是完全无需人工参与的自动化链路。原始代码与修改指令交给大模型,大模型改完后由校验插件进行检测,通过后交给 AST 引擎再次修改,修改结果与之前结果做 Diff,如果 Diff 一致,整个流程结束,无需人工介入。
下层是带有人工参与但不断反哺上层的进化链路。如果 AST Review 拒绝,则进入人工 Review。若人工 Review 拒绝,将 Case 交给检测插件优化 Agent 去升级校验插件;若人工 Review 通过,则交给 AST 引擎优化 Agent 去升级 AST 引擎。下层的人工参与持续反哺上层,使得人工介入比例越来越低,整个系统成为一个正向自我优化的循环。
当前我们正在全力推进的一项工作,是 AI Native 全生命周期治理。此前的工作仍集中于债务发生之后的“堵”,工作环节都堆在治理链的最后一个环节,非常片面。真正的 AI Native 意味着要覆盖开关的完整生命周期,从源头即参与。
我们正在搭建的系统围绕三个阶段展开。第一,智能创建。在需求研发阶段就让 AI 参与进来,根据需求场景判断该功能是否需要开关,开关的作用到底是什么,是用于放量还是用于功能降级等等,同时给开关打上分类标签。这样开关从一出生就具备了可治理的属性。第二,智能变更。让 AI 参与变更计划制定和放量节奏设计,并且自动巡检相关监控指标,一旦巡检到异常,立即执行变更阻断,防止风险扩大。第三,智能删除。基于创建时已积累的上下文信息,在开关全量放量结束、稳定性验证完成后,无需人工介入,系统自动下线开关。
整体治理架构自底向上分为五层:底层为 AI 基建层,包含大模型、会话存储及多轮对话等基础设施;其上是评测层;再上层是逻辑检测、代码检测、编译检测等安全护栏层;最上层是日常使用的 MR 工具层,例如提代码、拉代码等操作;右侧则是自进化的 Agent,用以持续优化整套系统。
四、总结与展望
我们此前经历过运动式治理,也陷入过治理死循环,最终用 AI 打破了困局。我们构建了双引擎架构,通过多轮对话加逻辑验证使自动化流程跑通,又通过双 Agent 的自进化让系统持续自我完善。这与 Harness 现在倡导的理念十分契合,虽然我们并没有刻意去对标这个概念,但在落地过程中,的的确确是在用工程化手段约束 AI、引导 AI。
このシステムはこれまで、自動で 1,500 個の機能フラグを削除し、6 万行以上のコードを整理しました。その結果、本番環境での障害はゼロです。現在の精度は 98% を超えており、まだ完全にブロックできていないケースがわずかに残っていますが、AST(抽象構文木)と AI エンジンの適合率も 80% を上回っています。これにより、人的コストを極限まで削減することに成功しました。
最後に、少し考えを広げてみましょう。私が紹介したのは機能フラグの管理という非常に狭い範囲の事例ですが、技術負債の整理において「正解が明確に存在する」ケースであれば、理論的にはすべてこのアプローチで対応可能です。例えば、インフラのアップグレードで RPC SDK のバージョンが古すぎる場合や、コード内にドメイン名をハードコーディングして災害対策が効かない状態になっている場合などです。これらもすべて、「不確実性の探索+確定性の検証+自己進化のループ」という同じ手法で解決できます。
また、不要になった「コールドコード」の管理も同様です。本番環境で全くトラフィックがなくとも、長期間業務システムに残り続けているコードは、自動化された方法で安全に削除できます。最も優れた管理とは、管理そのものが忘れ去られることです。最も優れたシステムとは、システム自身が自らを維持できるものです。
【快手技術交流群】にご参加ください
QR コードをスキャン👇
【原文を読む】をクリックして、講師の PPT を入手してください!
原文を読む
WeChat で開くにはこちらへ
原文を表示
快手技术 2026-07-24 11:51 北京
image
最好的治理,是治理本身被遗忘;最好的系统,是系统自己照顾自己。
image
随着微服务与敏捷迭代的深化,功能开关已成为现代软件交付不可或缺的风险控制手段。但在快手这样业务高度复杂、迭代极其迅猛的超大规模系统中,大量长期存活的开关正在演变为一种沉重的隐性技术债。
本文整理自快手资深服务端架构师闫文亮在 QCon 全球软件开发大会 2026 北京站的分享《让开关自我消亡:AI 赋能的 Feature Flag 全生命周期治理》。他在分享中对 AI 赋能开关全生命周期治理的完整实践进行了复盘,内容涵盖从治理困局、AI Agent 的工程落地,到双引擎安全护栏、自进化机制,以及 AI Native 治理范式的演进全过程。
一、Feature Flag 价值与隐形技术债:从业务刚需到技术债陷阱
快手 APP 在启动时会调用后端服务器的一个接口。有一次,这个接口因升级新功能返回了一个客户端不兼容的字段,造成 APP 崩溃。后端同学发现后立刻对代码进行了回滚,但由于崩溃发生在启动阶段的极早期,客户端此时还没有拉到修正后的代码,于是再次崩溃。启动即崩溃,再启动再崩溃,由此陷入无限循环。当时客户端的“安全气垫”和“安全模式”还远未完善,最终只能引导用户卸载重装。可以想象,如果你是这个需求的后端研发,心情会是怎样的——极度匆忙,连滚带爬。彼时大家必然在反复追问一个命题:怎样能让发布新功能更加自信,从从容容、游刃有余?
这个问题的一个标准答案,就是 Feature Flag,即功能开关。它本质上是一种使功能发布与代码部署解耦的软件技术。理论上,如果当时拥有完善的开关能力,新功能可以被优先开放给内部用户,待监控确认无误后再逐步对外放量,这场大规模故障就很可能不会发生。
更进一步,Feature Flag 可以将代码发布和功能发布完全解耦。设想一个场景:ABC 三个需求一起上线,如果 B 出了问题,没有开关就只能把三个需求整体回滚,导致 A 和 C 被迫延期;而有了开关,仅需关闭 B 功能即可,A 与 C 不受任何影响。正因如此,在如今 AI Coding 时代,大家已经不自己写代码了,全都是 AI 生成代码,在发布 AI 代码时心里可能更加没底,就愈发需要 Feature Flag 来帮助建立发布自信。
然而,也正因为开关太好用,快手的生产代码中存在着数量极为庞大的 Feature Flag。毫不夸张地讲,代码几步之内就能发现一个开关。以快手搜索业务的一段代码为例,其中不仅包含着搜索自身的开关,还夹杂着本地生活的开关、电商的开关等等。原因是快手的业务链路极为复杂,搜索某个内容时可能会下发本地生活 Feed 或电商商品,各类开关因此越积越多,职责划分也逐渐模糊。
大量堆积的开关带来了四个维度的切肤之痛。首先是代码维护成本飙升:新人接手项目时,必须在一堆开关里仔细梳理逻辑,判断哪段代码有效、哪段已经废弃。在 AI Coding 时代,由于代码并非自己亲手所写,每个人在梳理开关和业务时都像新人一样,成本同样高昂。尤其当 AI 去阅读代码时,它需要去查询各个开关系统的返回值以确定走什么逻辑分支,这又进一步拉高了成本。第二是浪费计算资源:每一次调用、每一次逻辑判断,都意味着要判断开关到底走哪个分支,日积月累也是不小的损耗。我们查得快手短视频主业务(不包括上下游),每秒调用的开关次数就达 155 亿次。第三是浪费带宽资源:客户端同样需要使用开关进行功能发布,开关值需要后端服务下发,导致单个接口下发的开关数量极多,带宽成本惊人。快手每年仅因开关下发而产生的带宽成本就有 几百万。第四是隐藏稳定性风险。过期开关会偶发性地拉不到已推全的值,导致走到旧逻辑,触发线上问题。真实的案例是,一个早几年就已经推全的开关,旧逻辑始终没有下线,开关被遗忘,旧逻辑也无人维护。某一天某个小 Bug 导致开关没有拉到值,异常立刻被触发,业务团队连夜排查了非常久才定位到根因。可以说,哪怕已经推全的开关,如果不加治理,就可能成为一颗随时引爆的定时炸弹。
既然危害如此明确,业务团队为什么仍然缺乏治理的动力?首先,加开关极其容易,一分钟写一个 if 语句就能解决极大问题——消除发布风险、赋予发布自信、实现部署与发布解耦。但删除一个开关,则需要梳理上下游业务、评估下线风险、修改代码、发布、测试,短则一个小时,长则更长。其次,心态上,加开关是顺手的事,而删开关毫无收益且要承担风险,业务同学自然不愿意主动去做。再次,组织上,离职人员交接时往往会留下“后人的智慧”:我创建的开关我不删,留给后人治理;后人一看,也不知道这个开关是干什么的,下线肯定有风险,干脆放着不动。再加上跨部门合作的开关职责不清,所有人都不敢动。债务越积越多,谁也不愿删除,形成了一个死循环。从快手某个部门的开关增长数据来看,基本上每年都有大几千的增长量。
尤其值得警惕的是,麻省理工学院的一位教授曾预言:“人工智能就像一张全新的信用卡,让我们以前所未有的方式来积累技术债。”人写代码速度有限,债务还有时间修复;如果未来代码都由 AI 来写,技术债将呈爆发式增长。如果当下不开始治理,后续的时间窗口可能都会错过。过去我们也尝试过多种传统治理手段,例如做平台规范治理,给开关设定下线时间,搭建审计看板,但这依赖于业务的自觉性,执行力度参差不齐;也可能写一些自动化脚本去删除开关,效率尚可,但一遇到代码开关嵌套或业务逻辑复杂的场景,基本就会改错;再熟悉不过的是搞专项治理行动,拉一群人大规模同步进度、强推治理,这种运动式治理确实立竿见影,但往往是一阵风过后不久就反弹,反弹之后再拉一群人再治理,治理完再反弹,形成一个“治而不绝”的治理死循环。治理速度远远跟不上开关新增速度。
直到 AI 的出现,才真正让我们看到了打破这一死循环的可能。2024 年下半年,我们判断,用 AI 治理开关的内外部条件已经成熟。外部,大模型迭代极快,API 成本持续下降,模型在代码理解与修改上的能力已经可靠;内部,我们对高效、安全且尽可能无需人工介入的治理方式有着迫切需求,加之公司 AI 基础设施持续投入,我们认为时机刚刚好。快手跨入了 AI 治理的新时代。
二、治理 Agent 的演进与工程落地:从 Demo 到工程落地
回顾快手开关治理的整体历程:2025 年之前,主要采用运动式治理,拉人推业务,效果差、效率低;2025 年上半年,我们推出了 AI 开关治理 Agent,帮助业务提效,极大减少人工介入;从 2026 年至今,我们正在构建 AI Native 开关治理,其核心思想已不再是人全程治理开关,而是“让开关自己下线”。AI Native 强调的是,搭建一套让 AI 觉得治理效率高的整体环境,而不是让人感觉治理效率高的方式。
把时间拉回 2025 年上半年,当时我正在使用 Cursor 开发一个需求,与 Cursor 来回拉扯调试,反复沟通它都搞不明白的时候,系统弹出了一条消息,告知我名下有多少个开关需要治理。我随手就把这个需求丢给了 Cursor,说“开关 A 已经百分百推全了,帮我把无用代码和开关下线掉”。Cursor 很快就完成修改,而且格式和代码逻辑非常正确。这个体验让我们当即意识到:既然 AI 能搞定单个开关的治理,那能否规模化?不可能让每个人都装一个 Cursor 一个一个治理,于是我们直接调用大模型 API,尝试做批量治理。
我们快速搭建了一个 Demo,流程极其简单:第一步,定位到开关被哪些代码引用,找到这些文件之后,通过 Git Open API 把源代码拉到本地内存中;第二步,将源代码和要修改的需求(即提示词)交给大模型;第三步,大模型修改完后返回,再通过 Git Open API 提起一个远程 MR,流程就此结束。然而,这个迫不及待投入试用的 Demo 立即暴露了大量问题。比如,AI 会把还在使用的 import 语句直接删掉,也就是“减号两行”的问题;或者莫名其妙更改了大小写。当时提示词调优正火,我们也采取了非常传统的调优方式,例如在提示词中加入禁止项命令、提供样本案例、加入思维链提示,要求模型“先思考再修改,不要直接改,怕改错”。通过这些手段,AI 修改开关代码的正确率得到了大幅度提升,在场景较为简单的情况下,正确率一度能达到 70%-80% 的水准。
但即便是百分之七八十,在开关治理场景中,业务是绝不能容忍的。因为只要改错一个业务逻辑,基本上就等同于一个非常严重的线上故障。我举几个触目惊心的例子:第一种,方法名与开关名完全相同,大模型误把方法当成了开关,直接将整个方法删掉,意味着整个功能模块全部失效。第二种,把逻辑改反,原来为 false 时执行 A,改成了返回 true 时执行 A,后果更严重。第三种,开关名混淆,开关 A 和开关 B 命名极其相似,我让 AI 下线 A,结果它把 B 也一并下线。第四种,无关代码修改,完全不相干的逻辑,AI 莫名其妙也要去动一下。当时我们就清醒地意识到,完全信任大模型,基本等于被动等待故障发生。绝不能指望大模型永远不出错,因此必须建立起一套足够完善的安全护栏,拦截所有错误,防止错误代码透传到线上。
OpenAI 的联创 Andrej Karpathy 曾分享过一种 Vibe Coding 体验:他使用 AI 生成代码时,已经不再看结果,全盘接受 AI 生成的代码,一旦遇到报错信息,就原样复制粘贴过去,什么都不说,往往就能解决问题。我们在日常使用 AI 对话框时也有类似感受,当大模型第一次回答不符合预期时,采用追问的方式进行纠偏,常常也能解决。这种方式就是多轮对话。
基于这一思想,我们搭建了基于 Session 的多轮对话实现。大模型本身没有记忆,因此我们将整个上下文对话全部持久化存储。当遇到错误时,将历史消息连同错误信息一并再次提交给大模型,让它在既有上下文的基础上给出改进。那么,有了多轮对话之后,另一个关键问题随之而来:如何检测 AI 是否出错?我们必须构建一个极强的校验框架。
这个校验框架被设计为可扩展的,能支持全方位的检测插件来做 Bad Case 拦截。目前我们沉淀了两大类检测插件。第一类是逻辑检查插件,例如检查是否误删了无关开关,检查布尔逻辑是否被改反,检查业务逻辑是否完整,检查是否误删了非开关相关的代码等。第二类是编译检查类插件,包括代码是否符合 Checkstyle 规范,是否存在语法错误,流水线编译能否通过等等。
将强校验框架与多轮对话结合,第一道安全护栏就成型了。流程是:源代码和修改指令交给大模型后,输出结果首先经过第一道安全护栏的校验,包括语法检测、逻辑检测或编译检测等。如果安全护栏未通过,会把历史消息与错误信息再次返回给大模型,让大模型持续迭代修改,直至第一道安全护栏全部通过,我们才认为暂时没有问题。
然而,安全护栏本身是持续进化的,各类 Bad Case 必然还会存在,不可能百分之百拦截所有错误。于是我们设计了第二道安全护栏——最直接想到的就是人工兜底。因为在 AI 出现之前,代码本来就需要人工 Review 之后才能上线;有了 AI 后,我们在想能不能用大模型替代人工 Review,反正大模型本来就是替人干活的。我们做了一个实验:用三个大模型去 Review 主大模型生成的代码,判断是否有错。三个模型互相独立、不共享上下文,采取少数服从多数的原则,两个或以上通过才视作通过。
但这里有一个很难回避的 Bug:你怎么保证评测大模型就一定没问题?这本质上是用概率事件解决概率事件,Review 结果无法保证百分之百正确率。既然无法保证,那还是需要百分之百的人工 Review。打个比方,AI 说“我改这段代码的正确率有 99%,改一百个会错一个,但我不能告诉你是哪一个错了”,此时你是不是还得把一百个全部看一遍?这意味着人工参与度根本没有降低。
为了真正降低人工参与,我们调研到一篇论文《程序辅助语言模型》,其核心思想是利用大语言模型解读自然语言问题,并将推理步骤升华为生成程序,同时将解决步骤交由 Python 解释器继续执行。这让我想起之前一位同事的经历:他让大模型生成一百个字符串并按逗号拼接,大模型很快拼接完成,肉眼检查以为没问题,后来却发现少了两个字符串,肉眼极难查出。后来我告诉他,以后大模型干活的时候,不要让它直接出结果,而是让它写一段脚本,你先 Review 这个脚本,再让脚本去执行,这样几乎不会出错。我们将这个思想应用到了治理上:用确定性的程序检测替代人工兜底复核。
具体实现是,AI 改完代码后,我们再让一个 AST(抽象语法树)引擎把同一段代码再改一遍。如果 AST 引擎改出的代码与 AI 改出的代码完全一致,我们就认为没有问题,不需要人工复核;如果不一致,再人工介入。
AST 引擎采用的是规则加有向图的架构。我们将规则原子化,一条规则只做一件事,例如只做 if 清理,或者只做删除字段、删除方法等。整个 AST 引擎由一个有向图驱动,逐步执行各个规则,最终达到修改代码的平衡状态。由此我们形成了大模型生成与 AST 校验的双引擎架构范式:大模型像一个勘探者,处理代码的模糊性,生成创新方案,解决硬编码无法覆盖的问题;而 AST 引擎是一个校验者,依靠程序规则确保零故障。
阶段性总结整体流程:拿到原始代码以及修改提示词之后,首先将提示词给到大模型,大模型修改完成后经过第一道安全护栏,即逻辑检测、编译检测等。第一道安全护栏通过后,继续交由 AST 引擎再改一遍。改完之后,将 AST 结果与 AI 结果做 Diff,如果一致,我们就认为 Review 通过,人工不再介入;如果有差异,则走第二道安全护栏,即人工 Review,直到通过为止。实践表明,AST 引擎可以帮我们拦截非常庞大的 Review 成本。
这里可能产生两个核心疑问。第一个疑问是,AST 引擎本身一定正确吗? 没有人能保证自己写的代码百分之百正确。我们也有一些兜底方案,比如在流水线中沿用快手的准入条件,包括单元测试、集成测试、流量录制回放、Diff 等。但这依然无法完全保证代码修改的正确率。最核心的思想是,我们为什么能用 AST 替代人工 Review?并不是因为 AST 百分百正确,而是我们将业务治理的压力从业务侧转移到了平台侧。此前,推业务去治理,业务改代码有可能改错,责任全在业务;现在业务不用再自己改代码,AI 去改代码,AST 去 Review。如果这一整套流程出了问题,责任归属平台。平台方不再只是一个提供提效工具的协助角色,而是与业务方站在一起、帮业务承担治理责任的同行者。这种责任转移极大提升了业务方配合治理的意愿。而且,AST 引擎与 AI 引擎同时改错代码的概率,我个人认为几乎为零——一个不确定性的生成结果加上一个确定性的程序,两者同时错且错得一模一样,这个概率极低。同时,两个引擎可以互补互反哺:当 AST 认为 AI 改错时,可以反过来优化 AI;反之亦然。
第二个疑问是,既然已经有了 AST 引擎,还需要 AI 引擎吗? 结果是以 AST 引擎为最终上限,那 AST 是不是就意味着一定对?看这样一个例子:假设没有 AI 引擎,从原始代码到 AST 引擎改完代码,由于 AST 必然不能百分之百覆盖所有场景,有些复杂场景之下肯定会改错,而你又无法预知哪些场景不支持,于是依然需要百分之百人工 Review。但如果加上 AI 引擎,只用 AST 的流程肯定还需要人工 Review,而 AI+AST 的流程却可以将人工 Review 成本降到极低,因为只有在两个引擎发生分歧时才需要人介入。
三、自我进化:人工到系统自升级
即便有了 AI+AST 双引擎,AST 引擎和校验插件本身仍然是不完善的,它们会遗留一些未拦截住的 Bad Case。当时我们维护这套系统的投入不到一个人力,人工维护成本极高,引发了一连串问题:效率低,每天要人工 Review 大量 MR,导致 Review 积压排队;人力成本浪费,AI 改对的绝大多数结果还需要人从中寻找错误的;滞后性强,AST 引擎和校验插件的版本迭代速度因人力瓶颈而持续跟不上。我们开始认真思考,如何让 AST 和校验插件实现自进化,使人工参与度再进一步降低。
在自进化之前,我们可以先类比一下人类优化系统的方式:一定要让优化有据可依,要知道每一次修改到底是正确还是错误。这也正是业界常用的一种方法——搭建一套评测体系。我们的流程是:每次修改代码完成后,基于 Trace 将 AI 的提示词、Response 以及 AST 引擎的结果和校验插件的结果,全部存入数据库;接下来,对全部结果进行人工打标,除了 AST Review 已经通过的 Case 之外,每一个 Case 都要做人工 Review;然后建设看板,将打标结果可视化,并每日召开分析会议,识别哪些错了、为什么错,进而做出针对性优化,到底是优化 AST 引擎还是优化校验插件。优化完成后,再基于之前存储的所有历史信息进行评测回溯。评测回溯的结果非常明确:对了就是对了,错了就是错了,直接通过程序就能给出结论。
评测体系的底层是数据采集层。AST 引擎 Review 通过的 Case 会自动进入评测集;人工 Review 通过的 Case,也视为正确,自动进入评测集;但人工 Review 拒绝的 Case,会进入一个重要 Case 评测集,其决策是:未来做评测回溯时,这些 Case 必须百分之百通过,也就是说,犯过的错误绝对不能再犯。评测集构建完毕后,进入上层标注环节,标注完成后走到评测执行层,这里会构建与线上隔离的评测用流水线与环境。最终数据流入分析层,进行链路分析及结果回溯。
如果能打通这一套链路,并让 AI 驱动整个系统自进化,就能形成一个正向飞轮:人工标注完成,系统自动优化→自动执行评测→评测通过后正确率提升→正确率提升后人工标注量减少→减少后继续反馈到这个回路,最终人工标注量趋近于零。
具体怎么进化?我们对之前打标的所有历史 Case 进行了回溯,基本上可以分为两类:第一类,人工复核后发现 AI 改错了,说明检测插件能力没有到位,未能把错误拦截住,这证明当前存在盲区,必须优化检测插件;第二类,人工标注是正确的,证明 AI 都改对了,但你居然还是让人去看了,这说明 AST Review 没有拦截住,需要优化 AST 引擎。
由此我们设计出一个双 Agent 专项升级体系。针对“人工标注正确”的场景,将此类 Case 交给 AST 能力升级 Agent,由它分析为什么 AST 没有拦截住,为什么系统判断出错,然后自主完成修复(如优化 AST 引擎代码)。改完并部署后,自动触发评测,评测结果没有问题便上线。针对“人工标注错误”的场景,则交给 检测插件升级 Agent,由其定位为什么检测插件没有拦截住,进行插件代码补齐,同样自动评测后上线。
以 AST 引擎升级 Agent 的工作流为例,其步骤并非直接动手写代码。第一步是需求理解。有一个专门的需求理解 Agent,它不需要做方案设计,也不出 PRD,而是要准确理解“要干什么、怎么干”,并先生成一份文档。文档产出后需要人工 Review,若存在问题则在反馈环路中持续修正,直至通过。第二步由另一个 Agent 负责技术方案编写,包括架构设计、核心思路与流程,同样需要人工 Review。第三步是自动编写代码并进行智能化代码审查。全部审查通过后,触发部署流水线,将代码部署到隔离的评测环境中,进行自动评测,整个循环完成。
至此,我们可以完整地俯瞰治理系统的运转全景。整体流程分为上下两层:上层是完全无需人工参与的自动化链路。原始代码与修改指令交给大模型,大模型改完后由校验插件进行检测,通过后交给 AST 引擎再次修改,修改结果与之前结果做 Diff,如果 Diff 一致,整个流程结束,无需人工介入。下层是带有人工参与但不断反哺上层的进化链路。如果 AST Review 拒绝,则进入人工 Review。若人工 Review 拒绝,将 Case 交给检测插件优化 Agent 去升级校验插件;若人工 Review 通过,则交给 AST 引擎优化 Agent 去升级 AST 引擎。下层的人工参与持续反哺上层,使得人工介入比例越来越低,整个系统成为一个正向自我优化的循环。
当前我们正在全力推进的一项工作,是 AI Native 全生命周期治理。此前的工作仍集中于债务发生之后的“堵”,工作环节都堆在治理链的最后一个环节,非常片面。真正的 AI Native 意味着要覆盖开关的完整生命周期,从源头即参与。
我们正在搭建的系统围绕三个阶段展开。第一,智能创建。在需求研发阶段就让 AI 参与进来,根据需求场景判断该功能是否需要开关,开关的作用到底是什么,是用于放量还是用于功能降级等等,同时给开关打上分类标签。这样开关从一出生就具备了可治理的属性。第二,智能变更。让 AI 参与变更计划制定和放量节奏设计,并且自动巡检相关监控指标,一旦巡检到异常,立即执行变更阻断,防止风险扩大。第三,智能删除。基于创建时已积累的上下文信息,在开关全量放量结束、稳定性验证完成后,无需人工介入,系统自动下线开关。
整体治理架构自底向上分为五层:底层为 AI 基建层,包含大模型、会话存储及多轮对话等基础设施;其上是评测层;再上层是逻辑检测、代码检测、编译检测等安全护栏层;最上层是日常使用的 MR 工具层,例如提代码、拉代码等操作;右侧则是自进化的 Agent,用以持续优化整套系统。
四、总结与展望
我们此前经历过运动式治理,也陷入过治理死循环,最终用 AI 打破了困局。我们构建了双引擎架构,通过多轮对话加逻辑验证使自动化流程跑通,又通过双 Agent 的自进化让系统持续自我完善。这与 Harness 现在倡导的理念十分契合,虽然我们并没有刻意去对标这个概念,但在落地过程中,的的确确是在用工程化手段约束 AI、引导 AI。
截至目前,这套系统已经累计自动下线了 1500 个开关,删除 六万多行代码,且实现了 线上零故障。当前准确率在 98% 以上,仍有少量 Case 未能完全拦截,AST 与 AI 引擎的拟合率也达到了 80% 以上,人工成本由此得到极致降低。
最后,我想延展一点思考。虽然我分享的只是一个非常窄的开关治理例子,但所有技术债的治理,只要存在确定性的答案,理论上都可以采用这种范式来执行。例如基础设施的升级,当 RPC SDK 版本太低需要统一升级时,或者代码里写死域名导致没有域名容灾能力需要治理时,都可以复用这套“不确定性探索 + 确定性校验 + 自进化闭环”的方法。此外还包括冷代码的治理,那些线上已经毫无流量却长期驻留在业务里的代码,同样可以采用自动化方式安全删除。最好的治理,是治理本身被遗忘;最好的系统,是系统自己照顾自己。
欢迎加入【快手技术交流群】
扫描二维码👇
点击【阅读原文】,获取讲师PPT!
阅读原文
跳转微信打开
関連記事
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み