QQ ブラウザ、チーム文脈で AI を進化させる実践を公開
本文の状態
日本語全文を表示中
詳細モードで約36分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
Tencent Engineering
腾讯工程团队は、AI コーディングにおける個人経験の断絶という課題に対し、90% のノイズを排除する三层治理ルン(Review/Dedup/Merge)を導入し、チーム全体の文脈を継続的に学習・蓄積するシステムを実践した。
AI深層分析を開く2026年8月1日 00:24
AI深層分析
キーポイント
経験の断絶という本質的課題
個々のセッションで修正された知識が次回のセッションや他メンバーに継承されず、AI が毎回「ゼロから」スタートする状態がチーム規模拡大時のボトルネックとなっている。
自動抽出の限界とノイズ問題
初期の自動抽出アプローチでは、失敗プロセスや文脈を欠いた断片的な情報が大量に混入し、実質的に90% が無効な「経験」として蓄積される結果となった。
三层治理ルンによる品質向上
Review(検証)、Dedup(重複排除)、Merge(統合)の三段階のガバナンスプロセスを導入することで、高品質なチーム文脈のみを抽出・定着させる仕組みを構築した。
業界既存方案との比較分析
単一セッション内の記憶管理に特化する「ClaudeCode AutoDream」や、タイミング制御に焦点を置く「Hermes Agent」とは異なり、チーム全体での知識継承と品質保証を主眼としている。
経験の定義:エージェント行動変容の基準
経験とは単なるテキストではなく、召喚後にエージェントが正しく行動を変化させるかどうかで判定される。
重要な引用
経験即抛:一次 session 反复纠偏踩出来的路径,session 结束就清零
过程录像不等于经验。自动提取放大候选集的同时,也在同步放大噪声
让 AI 自己判断自己产出经验的价值,等于让裁判同时当运动员
被召回后,Agent 能否产生正向的行为变更
編集コメントを表示
編集コメント
個々の開発者の経験値を組織資産として定着させるための具体的な工程設計が示されており、AI ツールの導入における「属人化」リスクへの対抗策として極めて参考になる。特に、自動抽出の限界を指摘し、人間のレビュープロセスを組み合わせたハイブリッドアプローチの有効性は、実務現場でのシステム構築に即座に応用可能な知見である。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。
QQ ブラウザにおける、チーム文脈の中で AI が継続的に進化するためのエンジニアリング実践
著者:linjangyang、lypeerluo、kehawang、yansycao
個人開発における AI コーディングの効率化はもはや疑いの余地がありません。しかし、チーム規模が拡大すると、より本質的な課題が浮き彫りになります。それは、各セッションで陥ったトラブルや修正から得られた有効な知見が、セッション終了と同時にリセットされてしまう点です。
現在の業界における Agent の経験管理の取り組みは、「個人の記憶」に焦点を当てることが多いですが、AI が毎回プロジェクトに入るたびに「ゼロからスタート」する循環を打破するには、チームの経験を継続的に捕捉し、精製・蓄積して、AI にプロジェクトの文脈ごと引き継ぐことができるシステムが必要です。本稿では、このシステムの 0 から 1 の構築プロセスを共有します。初版では候補となる経験の 90% が不要なものであったというスタート地点から、レビュー(Review)、重複排除(Dedup)、統合(Merge)という 3 層のガバナンス・ループを確立するまでの道のり、そして各段階で直面した実務的な課題への対応策と、それを支えた実験データや再現可能なメソドロジーについて解説します。
一、「そんなことはやるな。このフックは同期で報告してはいけない」
これは半年前に行われた CodeBuddy のセッションでの出来事です。当時、停止フック(stop hook)の報告機能を実装中で、AI は自然に「同期での報告」を提案しました。多くの報告シナリオでは同期で十分なので、これは妥当な回答でした。
しかし、コードレビューの際に私たちは修正を加えました。「必ず非同期で行う必要がある。そうしなければ停止フックがプロセスをブロックし、その後の処理がタイムアウトしてしまうからだ」という理由からです。AI はフィードバックに基づいてコードを修正し、セッションは正常に終了しました。
問題は、セッションが終わった後に起こりました。
一週間後、別のメンバーのセッションで同じシナリオが発生しました。しかし、AI には前回のセッションの文脈が存在しないため、再び「同期での報告」を提案してしまいました。そのコードの元開発者ではないメンバーは、レビュー時にこの落とし穴に気づくことができませんでした。コードはマージされ、テスト環境になって初めて問題が露呈します。停止フックの処理でプロセスがブロックされ、連鎖的なタイムアウトエラーが発生したのです。
これが「経験の断絶」です。AI ができないから起きたことではありません。そのセッション内では修正を受け入れ、正しく動作していました。しかし、その修正は发起者の頭の中だけで完結し、AI 自体は何も覚えていないのです。
より広く見れば、チームが AI コーディングを継続的に深く活用する中で、以下のような 4 つの課題に直面しています。
・経験が捨てられる:一つのセッションで試行錯誤して得た解決策は、セッションが終わると同時にリセットされてしまう。次のメンバーが同じ問題に直面した際、AI はまたゼロからスタートすることになる。
繰り返される失敗:プロジェクトの隠れた制約
「このディレクトリのコードは第三者サービスにアクセスする際、特別なプロキシを経由しなければならない」「モジュール間のスイッチ参照には文字列パラメータを直接使用できない。スイッチの使用タイミングの問題により、常にデフォルトでオフになってしまうからだ」——これらのルールは git blame の履歴に残っているが、公式ドキュメントには記載されていない。担当者が変わったりセッションが変わったりすれば、同じ過ちを繰り返す可能性が高い。
知識の断片化
ベテラン社員の間には「こうすべきだ」という暗黙のパターンが存在するが、それを文書化する動機を持つ人は誰もいない。ドキュメントはコードの変更速度に追いついていない。AI 時代において重要なのは知識管理ではなく、運である——今回のセッションのコンテキストが過去の履歴をたまたまカバーしていれば成功し、カバーできていなければ失敗する。
AI は常に「新人」
AI はプロジェクトを選ばない。新しいモジュールに入っても、アーキテクチャの境界線や歴史的な負債、チームが過去に陥った落とし穴について知らない。コードを書く能力は不足していないが、「このチーム特有の文脈」を欠いている。
したがって、本質的な課題は「AI にどうやってコーディングを高速化させるか」ではなく、AI がプロジェクトに入るたびに「ゼロから始めさせられる」という循環を打破することにある。そのためには、チームの経験を継続的に捕捉・精製・蓄積し、AI がプロジェクトの文脈を持って参画できるシステムが必要だ。
二、初版の失敗:出力の 90% が実用不可能
最初の案は非常に単純だった。CodeBuddy の Plugin Hook を活用してすべての開発会話をアップロードし、AI にそれを読み込ませて自動的に経験を抽出する。プロンプトの核心はたった一言、「価値があると思う内容を抽出してください」——境界線の判断や除外ルールもすべてモデルに任せた。
論理的には成り立つ:会話には情報が含まれており、モデルも十分に賢いからだ。このプロセスは次の 2 ステップで構成される。
会話のアップロード → 経験の抽出 → データベースへの登録と公開
しかしすぐに分かったのは、抽出された経験の約 90% が「無価値な経験」であり、その後の作業を円滑にするものではないということだ。ここで言う「無価値」とは主観的な評価ではなく、「後続の Agent がそれを参照した際に行動が前向きに変化したか」という基準で判断したものである。さらに、この問題には単一の欠陥があるのではなく、4 つの構造的な問題が重なっている。
第一層:ノイズが多すぎる
元の会話には大量のデバッグ過程——「続ける」「再試行」「ダメだ、別の方法を試そう」——や失敗への道筋が含まれている。これらは経験ではなく、単なるプロセスの記録に過ぎない。モデルは区別せずにすべて抽出してしまう。例えば、「何度か試せばうまくいく」という経験が抽出されたケースがあるが、これは運を頼っているだけで、判断の蓄積ではない。
第二層:文脈の欠落
抽出された経験は元の文脈から切り離されると歪んでしまう。ある時、システムが「stop hook は非同期処理が必要だ」というルールを抽出したが、これは一見正しそうに見えるものの、実際には特定の工程や特定の場合にのみ適用されるルールだった。条件付けなしでこのルールを適用すると、後続の Agent がすべての hook シーンで無差別に非同期処理を行い、新たなバグを引き起こすことになる。
第三層:誤った誘導
経験がないことよりも危険なのは、間違った経験である。「タイムアウトしたらパラメータを大きくする」という経験が抽出されてデータベースに登録されたケースがある。根本原因はそこではなく、これは単なる応急処置に過ぎない。Agent が同様の問題に遭遇した際、この経験に基づいてまずパラメータを変更しようとし、根本原因の調査をおろそかにして、システム的に間違った方向へ進んでしまう。
第四層:価値の定義が困難
LLM の要約能力は一般領域では非常に高いが、経験抽出という文脈では、多くの出力が表面的なものに留まってしまう。「複雑な問題にはコンテキストを多く収集する」——この言葉は常に正しいように見えるが、具体的なエンジニアリングの現場では指導的な意味を持たない。AI はこれを読んでも、次に何をすべきか分からない。
これらの 4 つの問題が浮き彫りにした核心的事実は、「プロセスの記録=経験ではない」という点である。自動抽出によって候補セットを拡大する一方で、ノイズも同時に増幅している。フィルタリングなしの自動抽出は、単なるゴミの増幅器に過ぎない。AI に自らの出力する経験の価値を判断させることは、審判が同時に選手を務めることと同じで、エンジニアリングの現場では無効だ。
三、既存の解決策が機能しない理由
失敗之后,我们系统性地审视了业界在“Agent 经验管理”方向上的方案。
ClaudeCode AutoDream は単一セッション内での自動記憶整理——ExtractMemories でエンティティ・嗜好・状態を抽出し、Auto Dream が非同期でマージする——に焦点を当てている。その位置づけは「単一の Agent の文脈を継続させる」ことであり、プロセスの記憶を永続的な記憶として保存するものだ。しかし、チームの境界を意識しておらず、何を長期的に残すべきか、何が単なる一時的な状態なのかを区別しない。
Hermes Agent はプロンプト駆動型のメモリ戦略システムです。特定の条件(タスクの成功や課題解決など)で振り返りをトリガーしますが、これは「いつ記憶するか」を解決するものであり、「何を記憶すべきか」という価値判断までは解決できません。また、システムレベルでの重複排除や出典の追跡も欠如しています。
Mem0 はエージェント向けの長期メモリインフラストラクチャです。ADD(追加)、UPDATE(更新)、DELETE(削除)、NONE(何もしない)という 4 つの判定と、混合検索機能、そして完全なライフサイクル管理を備えています。しかし、この設計には「記憶は概ね価値がある」という前提が置かれており、プログラミングのようなノイズの多い対話シーンでは、この前提は成り立ちません。
これらを比較すると、共通する限界が見えてきます。どちらも「個人の記憶」に焦点を当て、「より多く記憶すること」を追求しています。私たちが目指すべきは逆です。「チームの経験の質」に焦点を当て、「より少なく、しかしより信頼性の高いもの」を残すことです。それは適用範囲や制約条件、出典のエビデンスを伴ったエンジニアリングの知見です。業界に既存の解決策がないため、私たちは自らの手で模索する必要があります。
四、チーム経験とは何か——エージェントの視点から再定義する
経験システムの最終的な利用者であるのは人間ではなく、エージェントです。エージェントの動作は明確です。入力(ここで呼び出された経験が含まれる)を受け取り、意思決定を行い、出力を生成します。この仕組みに基づけば、ある情報を「経験」と見なす基準はただ一つに絞られます。
それは、「呼び出された後に、エージェントが前向きな行動変容を起こせるか」です。
これにより、「経験」という概念は「価値のあるテキストの断片」から、「エージェントの行動を変えられるかどうか」という実証可能な工程基準へと固定されます。
この基準に基づけば、合格するチーム経験にはいくつかの条件が同時に満たされる必要があります。具体的には、実際の対話からの出典であること、エビデンスで裏付けられていること、プロジェクト固有のもの(汎用的な常識ではない)こと、そして将来の類似シーンで再利用可能であることです。その中で最も重要なのが「容易に発見できない」という点です。もしエージェント自身で推論できる情報であれば、それを呼び出すことに追加価値はありません。
では、何が「容易に発見できない」のでしょうか?エージェントが要件を理解するプロセスを分解し、3 つの視点(レンズ)に分けて考えます。
- 用語のレンズ(意味的に発見不可能)
プロジェクト内部で使われる専門用語、略語、通称は、字面からは全く推測できません。例えば、「D サイト」がプロジェクト内では違法コピーサイト、「A サイト」がアダルトサイトを指す場合などです。AI は単に文字列として「D」「A」しか見ておらず、背後にある意味を理解していません。こうした名称は対話の中で頻繁に登場しますが、AI がその真意を推し量ることは永遠にできません。
- 索引のレンズ(位置が発見不可能)
特定のツールやディレクトリ、機能への入口が、直感的な経路から外れているケースです。例えば、「ダイレクトページ機能は xhome モジュールにあり、重要なクラス名は FastCutXXX です」といった情報です。コードを読んでも見つからないため、「どこを探せばいいか」を知っている必要があります。
- 論理のレンズ(行動が発見不可能)
直感に反するエンジニアリング上の制約や、暗黙のメカニズムです。冒頭で触れた「stop hook は同期的な報告を行ってはならない」というルールが典型例です。AI の通常の推論では、「報告は軽量な操作なので同期でも問題ない」と考えがちですが、実際の現場には競合によるブロックリスクが存在します。また、「モジュール間のスイッチ参照に文字列パラメータを直接使ってはいけない」といったケースもあります。確かにスイッチには String 型のパラメータが存在しますが、使用タイミングの問題により、それを使うと効果が常にデフォルトの「オフ」状態になってしまいます。こうした落とし穴は、通常の推論では導き出せません。
これら 3 つのレンズは、トピック(フロントエンドかバックエンドか)や重要度(高・中・低)で分類したものではありません。そのような分類法は列挙しきれないほど多岐にわたる上、主観的な判断に依存して不安定だからです。ここで重要なのは、認知上の障壁という客観的な事実です。「エージェントが自分自身でこの情報を発見できるか」という問いには、明確な判定が可能です。
| レンズの種類 | 障壁の本質 | 典型例 | 情報の欠落 |
|---|---|---|---|
| 用語のレンズ | 意味的に発見不可能 | 「D サイト」は単に文字列 D に過ぎない | 「違法コピーサイト」という明示的なマッピングが必要 |
| 索引のレンズ | 位置が発見不可能 | 「ダイレクトページ機能はどこにあるのか?」 |
xhome モジュールの FastCutXXX を明示的に指す必要があります。
論理的な視点と、行動の不検出性について。stop hook の同期アップロードも重要です。AI の一般的な推論では、並行処理によるブロッキングリスクを導き出すことはできません。
五、システム連携:課題が迫る中で進化する
実際のエンジニアリング現場に戻りましょう。初期の 2 ステップ連携は動作しましたが、運用を開始すると次々と問題が露呈しました。いずれも設計段階では予測されていなかったものです。
問題 1: 生データをそのままモデルに投入すると、テーマが混在しノイズが多く、コンテキストが溢れてしまいます。経験則から「単発の対話」で判断できるものではありません。「失敗→修正→修復→採用」という一連のプロセス全体を見る必要があります。
→ そこで「テーマ別グループ化」を追加しました。モデルにセッションの概要を提示させ、テーマごとにセグメントを分割し、その後個別に抽出を行います。
問題 2: 抽出したデータをそのままデータベースに保存すると、約 90% がノイズ(ゴミデータ)でした。
→ そこで「Review(品質審査)」を追加しました。保存前に品質のゲートキーパーを設置します。
問題 3: グループやセッションが異なることで、重複する候補経験が生まれます。
→ そこで「Dedup(候補の重複排除)」を追加しました。保存前に重複を特定し統合します。
問題 4: 保存後、長期的なメンテナンスができず、新しい経験と過去の経験の関係性が不明確になります。
→ そこで「Merge(履歴との統合)」を追加しました。新規作成、更新、スキップ、あるいは過去のデータとの競合があるかを判断します。
これにより、最終的な連携フローは以下のようになります:
会話のアップロード → テーマ別グループ化 → 経験抽出 → Review → Dedup → Merge → データベース保存 → 検索・統計
見落としがちですが重要なのが「テーマ別グループ化」です。2 つのグループで比較実験を行いました。片方はグループ化したセグメントにセッション概要を付与し、もう片方は付与しないというものです。結果、概要を付けたグループの方がノイズが多くなりました。なぜなら、概要がモデルに対して一般化された推論を促してしまい、そのセグメント内で実際に起きた具体的な経験から逸れてしまったからです。グループ化の粒度だけで十分でした。
六、3 層ガバナンス:「動く」から「使える」へ
連携を構築したことは第一歩に過ぎません。システムを信頼できるものにするのは、「Review」「Dedup」「Merge」という 3 層のガバナンスです。これら 3 つは目標も戦略もデフォルトの方向性も異なりますが、根底にある駆動方法は共通しています。「エラー分析→ルール抽象化→評価検証」です。
6.1 抽出:ノイズの排除から評価主導へ
3 層について語る前に、まず源流となる「経験抽出」のプロセス自体をどう継続的に改善するかを説明する必要があります。
初期版で「経験を抽出できること」は証明されましたが、品質にはばらつきがありました。「良い経験」を一発で定義するのは難しいですが、「ノイズ(ゴミ)の経験」の特徴なら归纳しやすいです。そこで私たちは「まずノイズの研究から始め、そこから良い経験を逆算する」というアプローチを取りました。
大量の注釈データを通じて、9 つの典型的なノイズ特徴を归纳しました:
- 事実誤認:存在しない制約を捏造したり、会話中の一時的な発言をルールとして扱ったりする。
- 一般常識:どのプロジェクトでも通用するため、チーム固有の特性が反映されていない。
- 会話要約:プロセスの復述に留まり、再利用可能な判断として定着していない。
- 単発ケース:現在のタスクには有効だが、他へ転用できない。
- ユーザーの主観的嗜好:個人の選択であり、チームの規範を代表するものではない。
- コンテキスト欠如:どのモジュール・コンポーネント・インターフェースに対応するかが不明。
- 粒度の混在:1 つの経験の中に一般ルールとケース固有の情報が混ざっている。
- 実行不可能:抽象的なアドバイスのみで、Agent が何を実行すべきか分からない。
- エビデンス不足:会話内に十分な根拠がなく、モデルが過度に推測している。
これら 9 つの特徴を踏まえ、2 つの工程化アプローチを進めました:
「标注路径」では、候補となる経験データに価値のラベル付け(高価値・低価値・ゴミ)を行い、ゴミについてはその原因を特定し、共通するパターンを抽出して、最終的にラベリングルールとレビュー基準へと変換します。このプロセスにより、「経験の質」という主観的な感覚を、議論可能で合意形成できる対象へと昇華させることができます。こうして構築された評価セットは、その後のプロンプト修正の効果測定に継続的に活用されます。
「可聴経路(監査可能なパス)」では、モデルに対して各経験データについて3 つの観点からの説明を求めます。「なぜこれが経験と言えるのか(解決した再利用可能な問題か、プロジェクト固有のものか)」「プロンプト内のどの除外ルールに該当し、どのようなゴミチェックを通過したのか」「会話のどのやり取りがその判断を支えているのか」です。これによりモデルの判断プロセスがブラックボックス化されず、後続のプロンプト改善において誤りの原因を特定する根拠となります。
この 2 つのパスを整備することで、プロンプトの改良は「なんとなく良くないから直してみる」という感覚的な作業から、明確な構造化されたフローへと進化します。具体的には、「固定された会話サンプルを用意」→「現行のプロンプトで抽出」→「人手によるラベル付けと照合」→「誤りの分析」→「プロンプトの修正」→「再評価」→「指標の変化を比較」という一連の流れです。
評価では、3 つの主要指標を同時に確認します。Recall(再現率)は「抽出すべきものをどれだけ拾えたか」、Precision(適合率)は「抽出されたもののうちどれがゴミでないか」、Garbage Rate(ゴミ率)は「不要なものをどれだけ引き出してしまったか」を示します。いずれかの指標だけを重視するのは危険です。適合率だけを追うとモデルが過度に保守的になり、再現率だけを追うとゴミが増加してしまいます。目指すべきは、ゴミ率を下げつつ、全体の抽出品質が低下しないように両立させることです。
6.2 Review:ソースコード探索による事実性の検証
Review の役割は、データ登録前に明確なゴミをブロックすることです。戦略としては「デフォルトで保持し、特定のフィルタリングを行う」アプローチを採用します。網羅的に厳しくするのではなく、「事実誤認・バイアス」「文脈の欠落」「粒度の混在」という 3 つの明確なゴミカテゴリーに対してのみ、正確に拦截(ブロック)を行います。さらに「経験として不適切なカテゴリ」を最後のセーフティネットとして配置します。
この設計思想の背景にはリスク管理があります。経験システムにおける最大のリスクは、「良い経験を逃すこと」が「少しだけ質の低い経験が入ること」よりも深刻であるという判断です。デフォルトで保持する方針をとることで、Review 工程が厳しすぎて高価値なコンテンツを誤って削除してしまう事態を防ぎます。
プロンプトによる判定フレームワークは以下の 4 ステップに収束しました。「事実誤認・バイアスのチェック」→「文脈の欠落チェック」→「粒度の混在チェック」→「経験不適切カテゴリでの兜底(セーフティネット)」。これまでに 3 回の迭代を経て、「全体のリニューアル」から「境界線の強化」、そして「バイアスルールの硬化」へと進化し、ゴミの漏洩は着実に改善されています。
しかし、テキストのみによる判断には本質的な限界があります。モデルは、経験データ内で言及されている技術的事実が実際に存在するかどうかを検証することができないのです。
実際の事例を紹介します。システムはある経験データを抽出しました。「Android のリスト開発において FastScrollBar を連携させる際は、attachToQBListView() メソッドを使用すべき」という内容です。テキスト上では論理が一貫しており、具体的なシナリオ、メソッド名、操作手順が明記されているため、純粋なテキストレビューであれば通過する可能性が高いケースでした。
しかし、私たちはソースコード探索を導入しました。コードベース内で FastScrollBar のクラス定義を検索した結果、同クラスには attachToRecyclerView() と attach() の 2 つのメソッドしか存在せず、attachToQBListView() というメソッドは存在しないことが判明しました。正しくは「FastScrollBarCompat.attachToQBRecyclerView()」です。この経験データは事実誤認と判定され、即座にブロックされました。
【レビュー対象候補エンティティ】──▶ コードの痕跡を抽出: "FastScrollBar", "attachToQBListView"
│
▼ Code Explorer によるソースコードの特定検索
[QQBrowser ソースコードライブラリ] ──▶ クラス"FastScrollBar"に一致 (収束成功)
│
▼ メンバ関数レベルでの事実検証
発見:このクラスには attachToRecyclerView() と attach() の 2 つしかメソッドが存在しない。
attachToQBListView() は存在しない。
(正しいメソッドは FastScrollBarCompat.attachToQBRecyclerView() に属する)
│
▼
[ S1_FACTUAL_ERROR 検知] この経験がデータベースに記録されれば、エージェントはリスト関連の場面で指示に従って存在しないメソッドを呼び出そうとし、コンパイルエラーが発生します。さらに厄介なのは、エージェントが自分の理解不足を疑い、経験自体の問題を疑わずに、試行錯誤の悪循環に陥ってしまう点です。
6.3 Dedup:厳格さを優先し、橋渡し的な統合は禁止
Dedup(重複排除)の役割は、候補となる経験セット内で重複を検出し、その後の処理における冗長な判断を減らすことです。この層で最も懸念されるリスクは「重複を見逃すこと」ではなく、「誤って重複と判定すること」、つまり本来独立して保持すべき 2 つの経験を誤って統合し、境界情報が汚染されてしまう点です。
そのため、方針は明確に「厳格さを優先する」ことにしています。以下の厳格な拒否ルールを設けます。
- When(適用条件)が異なる場合は統合不可:結論が似ていても、適用シーンが異なれば別々の経験として扱う。
- 主たる結論のタイプが異なる場合は統合不可:操作の提案、リスク回避策、トラブルシューティング方法などは混同してはならない。
- 局部的なサブメカニズムに関する経験と、システム全体に関する経験は統合不可:粒度が異なり、互いに代替できないため。
- 同じ技術的事実でも用途が異なる場合は統合不可:例えばある API を「性能最適化」と「互換性対応」の両方で使用する場合、「同じ API に関わるから」という理由だけで統合してはならない。
最も重要なのは「橋渡し的な統合(ブリッジ型マージ)の禁止」です。A と B が処理結果で重なり、B と C も関連しているとしても、それをもって A と C が重複であると推論することはできません。経験の境界は適用シーンの制約条件によって定義されるものであり、意味が似ているからといって経験が等価であるわけではありません。一度橋渡し的な統合を行って境界の異なる経験を連結・統合してしまうと、その境界情報は二度と復元できないまま失われてしまいます。
260 件の経験、4 つのグループを対象とした評価では、全体の F1 スコアは 71.79% でした。しかし、より注目すべき指標は「厳密な重複」のケースにおける性能です。What(内容)と When(条件)が完全に一致する経験については、Recall が 91.67% に達しています。これは、最も核心的な重複排除の目標において、この戦略が有効であることを示しています。
見落としが発生したのは主に、What が「包含」または「部分的に重なる」、When が「異なる」または「部分的に重なる」といった境界が曖昧な組み合わせの場合です。こうしたケースでは、戦略はあえて差異を保護し、安易な統合を行わない方向で動作しています。
值得注意的是,这 260 条经验是分 4 批独立进行的,batch 之间表现差异明显。最极端的是 batch_004,仅识别出 6 个人工正例中的 1 个——该 batch 的正例全部落在非"双强一致"的组合上。这说明去重 prompt 对边界的敏感度在输入特征分布变化时仍有波动。
值得注意的是、この 260 件の経験は 4 つのバッチに分けて独立して評価されましたが、バッチ間での性能差は顕著でした。最も極端なケースは batch_004 で、人工的に作成された正例 6 件中わずか 1 件しか検出できませんでした。このバッチに含まれる正例はすべて、「二つの強一致条件」を満たさない組み合わせに属していました。これは、重複排除のプロンプトが、入力特徴の分布が変化した際に境界に対する感度にばらつきが生じることを示しています。
6.4 Merge:唯一の目標を最優先し、歴史的な境界を守る
Merge(統合)は、経験データベースへの登録前の最終チェックです。新しい経験と既存の履歴データベースとの関係を判断し、以下の 4 つのアクションのいずれかを実行します。
- create:データベース内に同種の対象となる経験が存在しない場合、新規に登録する。
- update:既存の経験と同じ方向性を持つが、実質的な新情報を含む場合は、統合して更新する。
新経験と既存の核心結論が互いに代替可能な場合は「スキップ」、直接衝突する場合は「コントラディクト」として人工判断を要請します。
戦略には三つの主要な軸があります。
第一に、判定目標を最優先で決定することです。まず歴史データベースから新経験に関連するサブセットを呼び出し、「唯一最適な経験目標」が存在するかを確認します。もし該当しない場合(例えば新経験が複数の歴史経験と関連しているが、いずれも同一の維持可能な経験には属さない場合)は、デフォルトで「新規作成(Create)」へ回帰させます。このルールにより、「無理なマッチング」を根本的に防止し、不完全な一致しかできない歴史経験を強引に更新目標として押し付けることで境界線が汚染されるのを防ぎます。
第二に、更新(Update)には自己検査が必要です。すべての更新処理に対して内部品質チェックを追加します。具体的には、統合後の「When(いつ)」が過度に一般化して元の経験のシナリオ制約を失っていないか、「What(何を)」が最も具体的かつ安全で実行可能なアクション提案を残しているか、「Why(なぜ)」が核心メカニズムを保っているか、そして元々の経験の根拠がない新たな結論を導入していないかを検証します。現在、最も顕著な課題は「更新過剰」です。Recall(再現率)は 96.30% と高いものの、Precision(適合率)は 78.79% に留まっています。これは、更新すべき対象の大部分が検出されている一方で、モデルに明らかな「積極的な統合傾向」があり、本来は新規作成すべき内容まで更新と判定してしまっていることを意味します。
第三に、コントラディクト(矛盾)は自動的に見過ごしたり、自動で決断したりしません。矛盾とは、チームの新しい認知と古い認知が不一致を示している状態であり、それ自体が貴重なシグナルです。システムは単にこれをマークするだけで、具体的な意思決定は人工判断のプロセスへ委ねます。
六回の実験と 157 の統計サンプルにおいて、全体の F1 スコアは 94.27% を達成しました。新規作成(Create)が最も安定した主要カテゴリで F1 は 96.46%、「唯一の目標がない場合は作成する」という判断ロジックはすでに信頼性が高いと言えます。スキップ(Skip)の適合率は 100% に達しており、モデルが「スキップ」と判定すればほぼ正解ですが、再現率は 85.71% とまだ低く、一部の真のスキップケースが更新や新規作成へ誤って振り分けられています。更新(Update)は改善余地が最も大きいカテゴリです。
七、運用開始後
完全な三層ガバナンス・ファネルを経た結果、初期の抽出ゴミ率 90% から、ガバナンス後の有効率 95%、そして最終的な入库率平均 80% へと改善しました。多くの会話サマリーや汎用的なアドバイス、一時的なケース、文脈に欠ける断片的な内容は、抽出段階で阻止され、候補経験は逐層のフィルタリングと統合によってさらに絞り込まれました。
現在、チーム経験システムは QQ ブラウザチームの 6 つのリポジトリで定常運用されており、50 名以上の開発者の日常開発セッションをカバーしています。これまでに 1,236 回の独立した対話を収集し、そこから 1,022 件の候補経験を抽出。三層ガバナンスを経て最終的に 789 件の高信頼度経験が登録されました。パイプラインはすでに 30 回以上安定して稼働しています。
7.1 システムの完全な運用ライフサイクル
2026/05/27 の実際の Pipeline 実行事例を通じて、システムがどのように動作するかを見てみましょう。
今回の処理では、元の会話記録 39 件に対し、初期段階で候補経験 34 件を抽出。レビュー後に 3 件がブロックされ、歴史経験庫との統合で 1 件が処理され、最終的に登録されたのは 30 件でした。
「ForbiddenController に新しい無効化機能を追加するには、3 つの場所を同時に修正する必要がある」という候補経験が審査で却下されました。その理由は、「単に修正箇所のリストを示し、どこをどう直せばいいかを読者に伝えるだけでは不十分だから」です。これは、レビュー・ゲートウェイが「技術的事実」の境界線を正確に見極め、適切な判断を下したことを裏付けています。
一方、「Chromium のソースコード層からは hooks 層を経由してのみ UBA 機能をアクセスできる」という候補経験は、目に見えにくい技術的事実の結果を説明しているため、審査を通過し、知識ベースに登録されました。
その後の Agent と協働する開発シーンでは、TDev を駆使して要件実装のフローを回す際、会話内の特定のフェーズ(探索段階)で自動的に過去の経験を引き出す試みがトリガーされます。
7.2 検索結果の活用:既存インフラの再利用
この検索機能において、私たちは新たに仕組みを作るのではなく、社内に既に存在する知識基盤を深く活用しました。
- 保存と登録: 3 段階のガバナンスを通過した経験は、自動的に IWIKI の経験スペースへ書き込まれます。
- 自動インデックス化: Knot 知識ベースシステムが IWIKI の経験コンテンツをリアルタイムで監視し、自動的にインデックスを作成。ベクトルとキーワード索引を生成します。
- MCP 検索ブリッジ: Knot は標準的な MCP プロトコルサービスを提供します。Agent はセッション中に自動的に Knot の MCP インターフェースを呼び出し、関連する経験を検索してコンテキストに注入します。
- 監視バイパス: 検索フローにはレポート用のバイパスを追加し、検索の成功率和件数をリアルタイムで記録しています。
最新の 125 件の実際の開発における検索結果の分析では、リクエストレベルでの検索成功率は 68.8%、未ヒット(no_hit)はわずか 4.8% でした。平均して 1 回の検索ごとに 2.4 件の経験が注入され、平均検索時間は 1,299 ミリ秒です。
このアーキテクチャにより、チームは「経験の精製とガバナンス」という最も重要な課題に集中することが可能になりました。
八、再利用可能な 4 つのメソドロジー
振り返ってみると、価値があるのは特定のプロンプトの書き方やパラメータの調整方法ではなく、数々の失敗から収束した 4 つのエンジニアリング原則です。
第一条:先定义资产边界,再进行自动化沉淀。
初版经验告诉我们最核心的一课是:若不明确“什么算作经验”就直接启动自动提取,系统会将对话摘要、通用建议甚至一次性案例全部塞入数据库。经验系统的核心不在于“多提取”,而在于“高置信度地沉淀”。在工程化落地之前,必须厘清三个问题:什么是经验?什么不是经验?判断标准是什么?
第二条:实施分层治理,切勿试图用一个 Prompt 解决所有问题。
Review(审查)负责拦截垃圾数据,Dedup(去重)负责候选集内的重复项清理,Merge(合并)则专注于历史库的治理。每一层的目标、指标和 Prompt 设计都截然不同。若将它们揉在一起,各层目标便会相互掣肘。使用多个针对性模型各自完成特定任务,远比依赖一个通用大模型一次性全搞定更为可靠。
第三条:默认策略需按业务风险分别设计,不存在统一答案。
在 Review 环节,默认应保留(误删一条高价值经验的代价远高于放行两条垃圾);在 Dedup 环节,宁可严勿宽(合并错误导致的边界污染是不可逆的);在 Merge 环节,必须保护历史边界(已有的经验是已验证资产,新经验若要修改它,需跨过更高的门槛)。“宁可错杀”与“宁可放过”的方向在各层截然不同。
第四条:Prompt 优化应从错例中抽象规则,而非凭感觉调整。
我们的 Prompt 迭代并非“效果不好就改一下试试”,而是遵循固定流程:收集错例 → 识别误判类型 → 抽象为可操作规则 → 多轮实验验证效果 → 判断规则是否带来正向收益。同时,利用固定评测集防止数据泄露和过拟合。整个链路是工程化的,而非依赖个人手艺。
结语
经验系统从 0 到 1 的建设已跑通——链路运转正常,三层治理上线,召回机制也在发挥作用。但这仅仅是起点。真正让经验系统从“能用”迈向“可靠”,还有三个环环相扣的方向亟待突破:
经验质量(生产阶段):当前三层治理生效后,垃圾率已降至约 5%。但事实性错误仍难以仅凭纯文本识别;源码探索目前仅覆盖部分场景;超出“三镜头”之外的边界经验类型尚未被充分识别;评测集规模有限,长尾和冷门主题覆盖不全,Prompt 迭代的边际收益正在收窄。
使用效率(召回阶段):经验虽能被召回并注入上下文,但命中不等于采纳——目前缺乏观测 Agent 是否真正依据经验改变行为的手段;召回侧的判定目标过于粗放,在相似主题下容易出现“召回了却用不上”的情况。
管理维护(生命周期):长期未命中、未被采纳的经验缺乏自动淘汰机制,导致库随时间静默膨胀;项目演进时(如模块重构、能力下线),历史经验可能集体失效,目前尚无自动识别“需要复核”的能力。
这三者构成闭环:生产决定基线 → 使用暴露问题 → 维护反哺生产。任一环不闭合,经验系统就会从资产退化为噪声。
最后想说一句:经验系统的本质并非技术系统,而是团队认知能力的工程化管道。过去,经验在人脑中,产出在文档里;现在,经验产生于人与 AI 的对话过程,需要一套管道来捕获、提纯和分发。一旦管道建成,团队便不再依赖“谁在那个时间段在做什么”来传承知识——AI 每次进入项目,都能带着“这个团队积累了什么、在什么场景下该怎么做”的语境。
QQ 浏览器平台技术团队
我们是腾讯 CSIG 旗下负责 QQ 浏览器平台研发的核心技术团队。致力于为超 4 亿用户打造极速、智能、全平台的浏览体验,产品覆盖 Android、iOS、鸿蒙、Windows、macOS 全终端。
团队深耕浏览器底层技术十余年,当前正深度参与 AI 在浏览器的能力落地,持续探索大模型时代技术的新边界。期待与更多同行切磋交流,共同成长。
微信で開くにはこちら
原文を表示
原创 腾讯程序员 2026-07-30 17:36 广东
image
QQ 浏览器让AI在团队语境中持续进化的工程实践
image
作者:linjangyang、lypeerluo、kehawang、yansycao
个人 AI Coding 的效率提升已无悬念,但团队规模铺开后,一个更深的短板暴露了:每次 session 踩坑、纠偏产出的有效经验,session 结束即归零。业界在 Agent 经验管理上的探索多聚焦"个人记忆",而要打破AI每次进项目都"从零开始"的循环,需要的是一套能持续捕获、提纯、沉淀团队经验,让AI带着项目语境进场的系统。本文分享从 0 到 1 建设这套系统的完整过程——从初版 90% 候选经验为废料的起点,到打磨出 Review/Dedup/Merge 三层治理链路,每一步踩在真实问题上的演化路径,以及驱动策略设计的实验数据和可复用方法论。
一、“别那么干,这个 hook 不能同步上报”
这是半年前的一次 CodeBuddy session。当时我们在开发一个 stop hook 的上报功能,AI 很自然地给出了同步上报的实现——合理,绝大多数上报场景同步就够了。我们 review 代码时改了:必须异步,否则 stop hook 会阻塞进程,后续操作直接超时。AI 根据反馈修正了代码,session 正常结束。
问题出在结束之后。
一周后,另一个同事的 session 触发了同样的场景。AI 没有那次 session 的上下文,给出的仍然是同步上报。同事不是那块代码的原始开发者,review 时没有发现这个陷阱。代码合入了,直到测试环境才暴露——stop hook 场景下进程阻塞,一连串超时错误。 这就是经验断层。不是 AI 不行——它在自己的 session 里被纠正过一次,做得很好。但那次纠正只在发起那轮 session 的开发者脑子里,AI 完全不记得发生过什么。
更普遍地看,我们团队在持续深入使用 AI Coding 一段时间后,陆续碰到四类这类问题:
经验即抛:一次 session 反复纠偏踩出来的路径,session 结束就清零。下一个同事碰同样问题,AI 又是零基础起步。
重复踩坑:项目的隐性约束——“这个目录下的代码访问第三方服务需要走特殊代理”“模块间开关引用不能直接用字符串参数,因为开关使用时机问题会导致永远默认关”——这些规则写在 git blame 里,但从来不进文档。换个人、换个 session,很大概率照踩不误。
知识碎片化:老同事脑子里有一套"这么做才对"的 pattern,但没人有动力写下来。文档永远跟不上代码变更的速度。到了 AI 时代,靠的不是知识管理,是靠运气——这次 session 的上下文恰好覆盖了上次的历史,就对了;没覆盖,就错了。
AI 永远是"新同事":AI 不分项目。进新模块不知道架构边界在哪,不知道历史包袱是什么,也不知道团队踩过什么坑。它不缺编码能力,缺的是"这个团队的语境"。
所以整个事情的起点,不是"怎么让 AI 写代码更快",而要打破AI每次进项目都"从零开始"的循环,这需要的是一套能持续捕获、提纯、沉淀团队经验,让AI带着项目语境进场的系统。
二、初版翻车:90% 的产出不可用
我们最初的方案非常直白。利用 CodeBuddy 的 Plugin Hook,上报所有的研发对话。然后让 AI 读这些对话,自动提取经验。Prompt 核心就一句话:“提取你认为有价值的内容”——边界的判断、排除规则,全交给模型。
逻辑上说得通:对话里反正有信息,模型也足够聪明。整条链路只有两步:
对话上报 → 经验抽取 → 入库上线后我们很快发现,产出的经验里,大约 90% 是废经验,无法让后续工作更顺畅。这个"废"不是主观评价,是拿"被召回后 Agent 的行为是否发生正向改变"当标准来衡量的。而且废不是一种废,是四层结构性问题叠加在一起:
第一层:噪声极高。 原始对话包含大量调试过程——“继续”“重试一下”“不行,换个方式”——以及遍地的失败路径。这些不是经验,是过程录像。模型不加区分地全抽出来了。比如系统某次抽出一条"多试几次就好了"——这是在碰运气,不是在沉淀判断。
第二层:上下文脱离。 抽出来的经验脱离原始语境就失真了。比如有一次系统抽出"stop hook 需要异步处理"——听起来对,但实际上这条规则只适用于特定环节、特定场景。不加限定条件,会误导后续 Agent 在所有 hook 场景下无差别异步,反而搞出新的 bug。
第三层:错误引导。 比没经验更糟的,是错的经验。一条"超时就调大超时参数"的经验被抽出来进入库——根因不在这,这只是堆补丁。Agent 下次遇到类似问题,会优先调参数而不是排查根因,系统性走错路。
第四层:价值难定义。 LLM 的总结能力在开放域很强,但放在经验提取里,大量产出流于表面。“遇到复杂问题多收集上下文”——这句话永远对,但在具体工程场景下基本没有指导意义。AI 看完它不知道下一步该干嘛。
这四层问题暴露出一个核心事实:过程录像不等于经验。自动提取放大候选集的同时,也在同步放大噪声。不加过滤的自动提取,就是一个垃圾放大器。 让 AI 自己判断自己产出经验的价值,等于让裁判同时当运动员——在工程上无效。
三、为什么现成方案行不通
翻车之后,我们系统性地看了业界在"Agent 经验管理"方向上的方案。
ClaudeCode AutoDream 做的是单会话内自动记忆整理——ExtractMemories 抽取实体/偏好/状态,Auto Dream 异步合并。定位是"延续单 Agent 上下文",把过程记忆当永久记忆存下来。它没有团队边界的意识,也不会区分什么值得长期留、什么只是临时状态。
Hermes Agent 是 Prompt 驱动的 memory 策略系统。它在特定条件(任务成功、踩坑解决)触发回顾——解决的是"何时记",但解决不了"记的东西有没有价值"。缺乏系统级去重与来源追溯。
Mem0 是一套 Agent 长期记忆基础设施。ADD/UPDATE/DELETE/NONE 四类判定、混合检索,生命周期管理完整。但整个设计的假设是"记忆大体有价值"——这个假设在编程场景的高噪声对话里完全站不住。
把它们放在一起看,共同的局限是:聚焦"个人记忆",追求"记住更多"。我们需要的是反向的:聚焦"团队经验质量",追求"留下更少但更可信"——带适用场景、约束边界、来源证据的工程经验。 既然业界没有现成方案,我们只能自己摸索。
image四、什么是"团队经验"——从 Agent 的视角重新定义
经验系统的最终服务对象不是人,是 Agent。Agent 的工作方式很明确:接收输入(包含召回的经验)→ 做出决策/产生输出。由此推导,判定一条信息是不是经验的标准只有一个:
被召回后,Agent 能否产生正向的行为变更。
它把"经验"从"一段有价值的文本"锚定到了"能否改变 Agent 行为"上,是一条可实际验证的工程标准。
基于这个标准,一条合格的团队经验必须同时满足几个条件:来自真实对话、有证据支撑、项目特有、不是通用常识、后续相似场景可复用。其中最关键的是 “不容易直接发现”——如果 Agent 自己就能推出来,召回它没有任何额外价值。但什么才算"不容易直接发现"?我们按 Agent 理解需求的路径拆成三类:
黑话镜头(语义不可发现): 项目内部的黑话、缩写、代称,字面上完全无法推导。比如"D 站"在项目里指盗版站点、"A 站"指成人站点——AI 只看到字母,不知道背后语义。这类名称在对话里反复出现,但 AI 永远猜不对。
索引镜头(位置不可发现): 某个工具、目录、能力入口不在直觉路径上。比如"直达页面功能在 xhome 模块,关键类是 FastCutXXX"——读代码找不到,需要知道"去哪找"。
逻辑镜头(行为不可发现): 反直觉的工程约束、隐式机制。开头提到的"stop hook 不能同步上报"就是典型——AI 常规推理认为"上报是轻量操作,同步没问题",但实际场景有并发阻塞风险。再比如"模块间开关引用不能直接用字符串参数"——开关确实有 String 参数,但用了之后由于开关使用时机的问题导致效果永远为默认关。这种坑,常规推断推不出来。
这三个镜头不是按主题(前端/后端)或重要性(高/中/低)分的——那些维度要么无穷无尽列不完,要么依赖主观判断不稳定。认知障碍是客观的:一条信息"Agent 能不能自己发现",可以判定。
镜头类型
障碍本质
典型场景
信息缺口
黑话镜头
语义不可发现
"D 站"字面只是字母 D
需要显式映射为"盗版站点"
索引镜头
位置不可发现
“直达页面功能在哪”
需显式指向 xhome 模块 FastCutXXX
逻辑镜头
行为不可发现
stop hook 同步上报
AI 常规推理推不出并发阻塞风险
五、系统链路:被问题逼出来的演化
回到实际工程。初版的两步链路能跑通,但跑起来后问题一个一个暴露——每个都不是设计时预见的:
问题 1: 原始对话一股脑塞给模型,主题混杂、噪声大、上下文溢出。经验不是什么单轮对答就能判断的——需要看"失败 → 纠正 → 修复 → 采纳"的完整过程。
→ 新增 主题分组 环节:让模型结合 session 大纲按主题切分片段,分组后再逐个提取。 问题 2: 仅提取就直接入库,约 90% 是垃圾。
→ 新增 Review 质量审核 环节:入库前设一道质量闸口。 问题 3: 不同分组、不同 session 产生重复候选经验。
→ 新增 Dedup 候选去重 环节:在入库前识别并合并重复。 问题 4: 入库后无法长期维护,新经验与历史经验的关系是糊涂账。
→ 新增 Merge 历史合并 环节:判断新经验是新建、更新、跳过还是与历史冲突。
整条链路最终收敛为:
对话上报 → 主题分组 → 经验抽取 → Review → Dedup → Merge → 入库 → 召回统计一个容易被忽视的关键是主题分组。我们试过两组对照:一组给分组后的片段额外附上 session 上下文大纲,一组不给。带大纲的那组产出了更多垃圾——因为大纲引导模型做泛化推断,反而偏离了分组片段里实际发生的具体经验。分组本身的粒度就够了。
image六、三层治理:从"能跑"到"能用"
链路搭起来只是第一步。真正让系统可靠的是 Review / Dedup / Merge 三层治理。这三层目标不同、策略不同、默认方向也不同,但底层驱动方式一致——错例分析 → 规则抽象 → 评测验证。
6.1 抽取:从识别垃圾到评测驱动
在讲三层之前,得先说清楚源头——经验抽取这一步本身怎么持续变好。
初版证明了"能抽出经验",但质量参差不齐。"好经验"很难一次定义到位,但"垃圾经验"的特征更容易归纳。所以我们的做法是 先研究垃圾,再反推好经验。经过大量标注,归纳出九类典型垃圾特征:
事实性错误——编造不存在的约束,把对话里的临时说法当规则
通用常识——任何项目都适用,不体现团队特异性
对话摘要——只复述过程,没有沉淀成可复用判断
一次性 case——只对当前任务有效,不能迁移
用户主观偏好——个人选择,不代表团队规范
缺少上下文——不知道对应哪个模块/组件/接口
粒度混用——一条经验里兼顾通用规则和 case 特定信息
不可执行——只有抽象建议,Agent 看完不知道怎么做
证据不足——对话里没有足够依据,模型自己推断过多
有了九类特征,走两条路径工程化:
标注路径: 对候选经验做价值标注(高价值/低价值/垃圾)→ 对垃圾做归因 → 归纳垃圾模式 → 转成标注规则和 Reviewer 标准。这条路径的意义是让"经验质量"从主观感觉变成可讨论、可对齐的对象。形成的评测集会持续用于后续所有 prompt 修改的效果测量。
可审计路径: 要求模型为每条经验输出三个维度的解释——为什么这是经验(解决了什么可复用问题、是否是项目特有)、命中了 prompt 中的哪些排除规则(通过了哪些垃圾检查)、对话证据是什么(哪几轮对话支撑)。这让模型的判断过程脱离黑盒,也为后续 prompt 迭代提供了错例定位的依据。
有了这两条路径,Prompt 的迭代不再是"感觉不太好改一下试试",而是有明确的结构化流程:
固定对话样本 → 当前 prompt 提取 → 与人工标注对齐 → 分析错例 → 修改 prompt → 重新评测 → 对比指标变化三个核心指标一起看:Recall 看该提取的提了多少、Precision 看提取的有多少不是垃圾、Garbage Rate 看不该提取的提了多少。不能只看一个——只看 Precision 模型会过度保守,只看 Recall 垃圾会变多。目标是同时保持垃圾率下降和整体提取质量不退化。
6.2 Review:源码探索做事实性校验
Review 的定位是在入库前拦住明确垃圾。策略是默认保留、定向过滤——不追求全面收紧,只对明确的三类垃圾维度做精准拦截:事实性错误/偏好、缺上下文、粒度混用,外加一层无经验类别兜底。这一定位背后是风险判断:经验系统的首要风险是"漏掉好经验"大于"多放几条边缘经验",默认保留能避免 Review 因过于严格误杀高价值内容。
Prompt 的裁决框架收敛为四步:事实性错误/偏好检查 → 缺上下文检查 → 粒度混用检查 → 无经验类别兜底。经过三轮迭代从"整体重构"到"边界强化"到"偏好规则硬化",垃圾穿透不断改善。
但纯文本判断有一个天然局限:模型无法验证经验中提到的技术事实是否真实存在。
一条真实案例:系统抽出一条经验,声称 Android 列表开发中对接 FastScrollBar 应使用 attachToQBListView() 方法。从文字上看逻辑自洽——有具体场景、有方法名、有操作指引。纯文本 Review 大概率会放行。但我们引入了源码探索——在代码库中检索 FastScrollBar 的类定义,发现该类只有 attachToRecyclerView() 和 attach() 两个方法,根本不存在 attachToQBListView()。正确的方法是 FastScrollBarCompat.attachToQBRecyclerView()。经验被标记为事实性错误,直接拦截。
[Reviewer 候选实体] ──▶ 提取代码线索: "FastScrollBar", "attachToQBListView"
│
▼ Code Explorer 源码定向搜索
[QQBrowser 源码库] ──▶ 匹配 Class "FastScrollBar" (收敛成功)
│
▼ 成员函数级事实验证
发现: 该类只有 attachToRecyclerView() 和 attach() 两个方法
不存在 attachToQBListView()
(正确方法属于 FastScrollBarCompat.attachToQBRecyclerView())
│
▼
[ 触发 S1_FACTUAL_ERROR 拦截 ]如果这条经验入库,Agent 在涉及列表的场景中会按指示调用一个不存在的方法,编译失败。更麻烦的是 Agent 会怀疑自己理解有误,而不是怀疑经验有问题——陷入反复重试的恶性循环。
6.3 Dedup:宁严勿宽,禁止桥接合并
Dedup 的定位是在候选经验集内部识别重复,减少后续流程中的冗余判断。这层的核心风险不是"漏去重",而是误去重——把两条本应独立保留的经验错误合并,造成的边界污染是永久性的。
因此策略明确为宁严勿宽。几条严格否决规则:
When 不同不能合——即使结论看起来相似,场景不同就是两条不同的经验
主结论类型不同不能合——操作建议、风险规避、排查方法之间不能混为一谈
局部子机制和完整系统经验不能合——粒度不一致,不能互相替代
同一技术事实但用途不同不能合——比如同一条 API 既用于性能优化又用于兼容处理,不能因为"都涉及这个 API"就合并
最关键的一条是禁止桥接式合并:A 和 B 在处理结果上有重叠、B 和 C 也相关,不能因此推断 A 和 C 是重复。经验的边界在于适用场景的约束条件,语义相似不等于经验等价——一旦桥接式合并把边界不同的经验串联归并,边界信息就永久丢失了。
在 260 条经验、4 个分组的评测中,整体 F1 为 71.79%。但更值得关注的指标是严格重复场景下的表现——What 和 When 均相同的经验,Recall 达到了 91.67%。这说明在最核心的去重目标上,策略是有效的。漏判主要集中在 What 为包含/相交、When 为不同/相交的边界模糊组合上——这类场景下策略更倾向于保护差异,避免贸然合并。
值得注意的是,这 260 条经验是分 4 批独立进行的,batch 之间表现差异明显。最极端的是 batch_004,仅识别出 6 个人工正例中的 1 个——该 batch 的正例全部落在非"双强一致"的组合上。这说明去重 prompt 对边界的敏感度在输入特征分布变化时仍有波动。
6.4 Merge:唯一目标先行,保护历史边界
Merge 是入库前的最后一关。它判断一条新经验和历史经验库之间的关系,执行四种动作之一:
create:库中不存在同类目标经验,新建入库
update:与历史经验同向,但带有实质新信息,合并更新
skip:与新经验在核心结论上可互相替代,跳过
contradict:核心结论直接冲突,标记为冲突并提人工裁决
策略上有三条主线:
唯一目标判定前置。 先从历史库中召回与新经验相关的子集,判断是否存在"唯一最合适的经验目标"。如果没有——比如新经验和几条历史经验都沾边,但都不属于同一条可维护经验——默认回退到 create。这条规则从根本上避免了"强行匹配"——一条不够匹配的历史经验被硬推成 update 目标,污染边界。
Update 必须自检。 对每一笔 update 增加内部 quality_check:合并后的 When 是否过度泛化(丢失了原经验的场景约束)、What 是否保留了最具体、最安全、最可执行的操作建议、Why 是否保留了核心机制、是否引入了不受原始经验支持的新结论。Update 过判是当前最突出的问题—— Recall 高达 96.30% 但 Precision 只有 78.79%。也就是说大部分该 update 的都被识别了,但模型存在明显的"积极合并"倾向,把一些本该 create 的内容也判成了 update。
Contradict 不自动放过,不自动决断。 冲突意味着团队的新认知和旧认知出现了不一致——这本身就是有价值的信号,不应该被自动压制。系统只负责标记,具体的决策走人工裁决通道。
六轮实验、157 个统计样本中,整体 F1 达到 94.27%。Create 是最稳定的主类别(F1 96.46%),模型在"没有唯一目标就创建"上的判法已经比较可靠。Skip 的 Precision 达到 100%——一旦模型判成了 skip,基本都判对;但 Recall 只有 85.71%,仍有一部分真实 skip 被分流到了 update 或 create。Update 是改进空间最大的类别。
image七、跑起来之后
经过完整的三层治理漏斗,我们最终实现了从初版 90% 的抽取垃圾率到治理后 95% 的有效率,再到平均 80% 的最终入库率——大量的对话摘要、通用建议、一次性 case、缺乏上下文的碎片内容被扼杀在提取阶段、候选经验再被逐层拦截和合并。
截至目前,团队经验系统已在 QQ 浏览器团队 6 个仓库中常态化运行,覆盖 50+ 名研发人员的日常开发 session,累计采集 1,236 次独立对话。从这些对话中累计提取出 1,022 条候选经验,经三层治理最终入库 789 条高置信经验,Pipeline 已稳定运行 30+ 次。
7.1 完整的系统运行生命周期
以 2026/05/27 日这条 Pipeline 的真实运行案例来看系统如何运作。
本次处理原始对话记录数 39 条,初步提取候选经验 34 条,Review 后被拦截 3 条,与历史经验库合并 1条,最终入口 30 条:
image其中一条 “ForbiddenController 新增禁用能力须同步改三处” 的候选经验被拦截,被识别的原因就是“在罗列修改清单,告诉读者去哪里找、改什么,而不是在说明隐藏技术事实。”,印证了 Review 门禁在精确区分"技术事实"这条红线上,动作准确。
而另一条 “Chromium源代码层只能通过hooks层访问UBA功能” 的候选经验则由于表达的是不易察觉的技术事实后果,因此被允许通过并入库。
在后续与 Agent 协作的开发场景里,我们通过 TDev 驱动需求实现的流程时,对话内部在特定阶段(探索)自动触发对历史经验的召回尝试:
7.2 召回消费:复用已有基建
在召回这里,我们没有重新造轮子,而是深度复用了公司已有的知识库平台:
存储落库:三层治理通过后的经验,自动写入 IWIKI 经验空间。
自动索引:Knot 知识库系统实时监听并自动索引 IWIKI 经验内容,生成向量与关键词索引。
MCP 检索桥接:Knot 提供标准 MCP 协议服务。Agent 在 session 期间自动调用 Knot MCP 接口检索相关经验并注入上下文。
监控旁路:在检索流程中增加了上报旁路,实时记录召回成功率和条数。
在最新 125 次真实开发检索的召回表现:请求级召回率68.8%,no_hit(未命中)仅 4.8%,平均每次注入 2.4 条经验,平均检索耗时 1,299 ms。
这种架构让团队将全部精力集中在最核心的"经验提纯与治理"上。
八、四条可复用的方法论
回看整个过程,有价值的不是某一个 prompt 怎么写、某一个参数怎么调,而是四条从反复踩坑中收敛出来的工程原则。
第一条:先定义资产边界,再做自动化沉淀。 初版 90% 废经验教会我们最核心的一课:不定义"什么算经验"就直接启动自动提取,系统会把对话摘要、通用建议、一次性 case 全塞进库。经验系统的关键不是"多提取",而是"高置信地沉淀"。在工程化之前必须回答:什么算经验、什么不算、判断标准是什么。
第二条:分层治理,别用一个 prompt 解决所有问题。 Review 负责拦垃圾、Dedup 负责候选集内去重、Merge 负责历史库治理——每一层的目标不同、指标不同、prompt 设计也不同。把它们揉在一起,各层目标就会互相牵制。用多个针对性模型各自完成一件事,比一个通用大模型一次性全搞定更可靠。
第三条:默认策略要按业务风险分别设计,没有统一答案。 Review 默认保留(误杀一条高价值经验的代价大于放行两条垃圾)、Dedup 宁严勿宽(误合并的边界污染不可逆)、Merge 保护历史边界(已有的经验是已验证的资产,新经验要跨过更高门槛才能修改它)。"宁可错杀"和"宁可放过"的方向在各层完全不同。
第四条:Prompt 优化要从错例中抽象规则,不是凭感觉改。 我们做 prompt 迭代不是"这个效果不好改一下试试",而是固定的流程:收集错例 → 识别误判类型 → 抽象成可操作规则 → 多轮实验验证效果 → 判断规则是否有正向收益。同时用固定评测集防止数据泄露和过拟合。整个链路是工程化的,不是手艺活的。
结语
经验系统从 0 到 1 的建设已经跑通了——链路运转着,三层治理上线了,召回也在工作。但这只是起点。真正让经验系统从"能用"走到"可靠",还有三个环环相扣的方向:
经验质量(生产阶段): 当前三层治理生效之后,垃圾率降至约 5%。但事实性错误仍难以纯文本识别,源码探索只覆盖了部分场景;三个镜头之外的边界经验类型还没充分识别;评测集规模有限,长尾和冷门主题覆盖不全,prompt 迭代的边际收益在收窄。
使用效率(召回阶段): 经验已能被召回并注入上下文,但命中不等于采纳——目前缺乏观测 Agent 是否真的依据经验改变行为的手段;召回侧的唯一目标判定偏粗,相似主题下容易出现"召回了但用不上"。
管理维护(生命周期): 长期未命中、未采纳的经验没有自动淘汰机制,库会随时间静默膨胀;项目演进时(模块重构、能力下线)历史经验可能集体失效,目前没有自动识别"需要复核"的能力。
三者构成闭环:生产决定基线 → 使用暴露问题 → 维护反哺生产。任一环不闭合,经验系统就会从资产退回为噪声。
最后想说一句:经验系统的本质不是技术系统,是团队认知能力的工程化管道。过去经验在人脑里、产出在文档里;现在经验产生于人与 AI 的对话过程,需要一套管道来捕获、提纯、分发。管道一旦建成,团队就不再依赖"谁在那个时间段在做什么"来传承知识——AI 每次进入项目,都能带着"这个团队积累了什么、在什么场景下该怎么做"的语境。
QQ 浏览器平台技术团队
我们是腾讯 CSIG 旗下负责 QQ 浏览器平台研发的核心技术团队。致力于为超 4 亿用户打造极速、智能、全平台的浏览体验,产品覆盖 Android、iOS、鸿蒙、Windows、macOS 全终端。
团队深耕浏览器底层技术十余年,当前正深度参与 AI 在浏览器的能力落地,持续探索大模型时代技术的新边界。期待与更多同行切磋交流,共同成长。
跳转微信打开
関連記事
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み