Claudeとプロパティベーステストによるバグの発見
Anthropicは、一般的なコードのプロパティを自律的に推論し、プロパティベーステスト(PBT)を適用することで、大規模なソフトウェアプロジェクトにおけるバグを効率的に特定できるAIエージェントを開発しました。ファズテストに似た手法を利用することで、このエージェントはNumPy、SciPy、Pandasを含む主要なPythonパッケージにおけるバグを発見しました。
プロパティベーステスト vs. 例示ベーステスト
プロパティベーステストは、特定の、手動で定義された例を検証するのではなく、コードの一般的な不変条件やプロパティが幅広い入力に対して真であるかどうかを検証することに焦点を当てます。
- 例示ベーステスト: 開発者が特定の入力(例:
[2, 10, 5, 4])を定義し、出力が期待される結果(例:[2, 4, 5, 10])と一致するかどうかを検証します。このアプローチでは、開発者が予期できなかったエッジケースを見逃すことがよくあります。 - プロパティベーステスト: 開発者が一般的なプロパティ(例:「JSONのデシリアライゼーションはシリアライゼーションの逆操作である」)と入力ドメインを指定します。すると、フレームワークがプロパティを破る反例を探すために、膨大な数の有効な入力を自動的に生成します。
Anthropicのエージェントは、型注釈、docstrings、関数名、およびコメントを読み取ることでこれらのプロパティを推論し、Hypothesisライブラリを使用してテストを記述することで、このプロセスを自動化します。
プロパティベーステスト・エージェントのワークフロー
このエージェントは、カスタムのClaude Codeコマンドとして実装されています。ターゲット(Pythonファイル、モジュール、または特定の関数など)を受け取り、以下の5段階の反復プロセスに従います。
- 分析: コードとドキュメントを読み取り、ターゲットとそのコードベースとの関係を理解します。
- 提案: 分析に基づいたプロパティを提案します。
- 実装: Hypothesisを使用してプロパティベーステストを記述します。
- 内省 (Reflection): テストを実行し、結果を評価します。テストが失敗した場合、エージェントはそれが本物のバグであるか、あるいはテスト自体を調整する必要があるのかを判断します。テストが成功した場合、エージェントはテストが些細なものか、あるいは意味のあるものかを評価します。
- 報告: バグの妥当性に自信がある場合、エージェントはフォーマットされたバグ報告書を生成します。
長期的な推論を管理するために、エージェントはToDoリストを活用します。研究者たちは、自己内省能力がSonnet 4と比較して、Opus 4.1およびSonnet 4.5で大幅に向上したことを指摘しています。
実社会でのパフォーマンスと検証
研究者たちは、100を超える人気のPyPIパッケージに対してエージェントをテストしました。評価は2つのフェーズで行われました。
フェーズ1: 初期評価 (Opus 4.1)
Claude Opus 4.1によって生成された984件のバグ報告のうち、50件を対象とした手動レビューの結果、56%が有効なバグであり、32%が報告可能な有効なバグであることが判明しました。精度を向上させるため、チームはバグをランク付けするための15ポイントのルーブリック(評価基準)を開発しました。このルーブリックを適用した場合、スコアの高い報告の86%が有効であり、81%が有効かつ報告可能でした。
フェーズ2: 修正された評価 (Sonnet 4.5)
チームは、Sonnet 4.5を使用してエージェントを10個の主要なパッケージに対して複数回実行し、最終的な人間による専門家レビューの前に、正確性と深刻度をチェックするために、より高度な評価エージェントを使用しました。
ケーススタディ: 特定されたバグ
エージェントによって発見されたいくつかのバグは、主要なライブラリで報告され、修正されました。
NumPy: エージェントは、
numpy.random.waldが時折負の数を返し、Wald分布のプロパティを破ることを発見しました。修正には、数値的に安定した定式化を作成するために、破滅的な桁落ち(catastrophic cancellation)に対処することが含まれ、相対誤差をほぼ10桁減少させました。aws-lambda-powertools: エージェントは、
slice_dictionary()がイテレータをインクリメントしていないため、最初のチャンクを繰り返し返してしまうことを発見しました。これは、辞書のスライシングと再構成が元の辞書をreturnすることを確認するプロパティをテストすることで特定されました。cloudformation-cli-java-plugin: エージェントは、
item_hash()がインプレースの.sort()メソッドを使用しているため、すべてのリストに対して同じハッシュを生成することを発見しました。.sort()はNoneを返します。これは、異なる入力が異なるハッシュを生成すべきであるというテストによって捕捉されました。tokenizers: エージェントは、
EncodingVisualizer.calculate_label_colors()において、閉じ括弧が欠落していることを発見しました。これにより、無効なHSL CSSが生成される結果となりました。これは、HSLカラーコードの正規表現に対して出力をテストすることで発見されました。
python-dateutilにおけるユリウス暦に関する報告された問題の一つは、メンテナーによって無効と判断されました。これは、エージェントが、メンテナーのみが定義できるような、微妙な、あるいは暗黙的な前提条件を含むコードを扱う際に苦戦することを示しています。
未来の方向性
Anthropicは、エージェントによるPBTを、人間のテストを補完する重要な要素と見ています。特にLLMが文脈からプロパティを推論する能力が向上するにつれ、その傾向は強まっています。研究者たちは、次の論理的なステップはパッチの自動生成であると示唆しています。もし正確性のプロパティが完全に指定できるのであれば、バグの修正はより単純になり、LLMがメンテナーのレビューを受けるための高品質なパッチを提案できる可能性があります。
Sources
関連
- Dispatch
- Dispatch
- Dispatch
- プロジェクト
- Dispatch