Slackのエンジニアリングチームは先日、 EnzymeからReact Testing Library(RTL)へ大規模言語モデル(LLM)を使って、15,000の単体テストと統合テスト自動変換する方法を発表した。Abstract Syntax Tree(AST)変換とAIによる自動化を組み合わせることで、Slackの革新的なアプローチは80%の変換成功率を達成。必要な手作業を大幅に削減し、複雑な開発作業を合理化するAIの可能性を示した。
この移行は、EnzymeがReact 18をサポートしていなかったため、Reactの最新バージョンとの互換性を維持するために大幅な移行が必要になったことがきっかけだった。Slackでの変換ツールの採用率は約64%に達し、少なくとも1万時間の22%というかなりの開発者の時間を節約した。この数字は大幅な節約を意味するが、Slackのシニアソフトウェア・エンジニアであるSergii Gorbachov氏は、実際にはもっと高い数字だろうと推測している。
この22%の時間節約は、テストケースがパスした文書化されたケースのみを表していることに注意が必要です。しかし、一部のテストケースは適切に変換されたにもかかわらず、セットアップやインポート構文などの問題によってテストファイルがまったく実行されず、そのようなケースでは時間短縮が考慮されなかった可能性があります。
チームは当初、抽象構文木(AST)変換を使用して変換を自動化し、100%の精度を目指そうと試みた。しかし、エンザイムのメソッドは複雑で多岐にわたるため、コードの自動変換の成功率は45%と、わずかなものにとどまった。成功率の低い原因のひとつは、正しい変換がAST変換ではアクセスできない、テスト対象のレンダリングされたドキュメントオブジェクトモデル(DOM)に関するコンテキスト情報に依存することである。
representation of wrapper.find('selector');
のAST表現 (出典)
次に、チームはAnthropic社のLLM「Claude 2.1」を使って変換を試みた。プロンプトを改良する努力にもかかわらず、変換の成功率は40%から60%の間で大きくばらついた。Gorbachov氏は、"結果は、タスクの複雑さに大きく依存し、驚くほど効果的な変換から失望するほど不十分な変換まで様々だった "と述べている。
満足のいく結果が得られなかったため、研究チームは人間の開発者が単体テストの変換にどのように取り組んでいるかを観察することにした。彼らは、開発者がReact、Enzyme、RTLに関する幅広い知識ベースにアクセスできることに気づき、その知識を、レンダリングされたReact要素のコンテキストへのアクセスと、変換ツールの初期バージョンが提供するAST変換と組み合わせた。
そしてSlackのエンジニアは、AST変換をLLM機能と組み合わせ、人間の動作を模倣するハイブリッドアプローチを採用した。テスト対象のレンダリングされたReactコンポーネントと、ASTツールによって実行された変換を、プロンプトの一部としてLLMに送り込み、AI用の堅牢な制御メカニズムを作成することで、80%の変換成功率を達成。これらの技術の相補的な性質を実証した。
修正されたパイプラインのフローチャート(出典)
Claude 2.1は、Anthropicが2023年11月に発表したLLMモデルである。200Kトークンコンテキストウィンドウ、モデルの幻覚率の大幅な減少、システムプロンプトが含まれ、ツールの使用が可能になった。Anthropicはその後、3つの異なるモデル、マルチモーダル機能、改善された文脈理解からなるクロード3ファミリーのモデルを導入した。
抽象構文木(AST)は、プログラミング言語で書かれたソースコードの抽象的な構文構造を木で表現したものである。ツリー内の各ノードは、ソースコード内で発生する構文を表す。構文ツリーは、コードの機能を理解するために必要な構造と内容に焦点を当てている。ASTは、コンパイラーやインタープリターでコードを解析・分析するために一般的に使用され、コンパイル時にさまざまな変換、最適化、変換を可能にする。