プログラマーからデータ エンジニアまで、プログラム コードを書くことは基本的なスキルですが、長いコードを書くプロセスは開発者の忍耐力を大いに消耗させます。最近、米国のKiteやカナダのTabNineなど、コード補完ツールに関するニュースが多く報道され、多くのプログラマーの注目を集めています。しかし実際には、メディアで絶えず宣伝されているこれらの外国製品の背後には、ディープラーニングをコード補完に早期に適用する、より強力な機能を備えた製品、つまり北京大学の開発者が開発した中国発のツール、aiXcoderがあることをまだ多くの人が知りません。 この記事では、Synced が北京大学コンピュータ科学技術学部の准教授でありプロジェクト リーダーでもある Li Ge 氏にインタビューし、自動コード補完の背後にあるテクノロジーと、aiXcoder の技術的な特徴や利点について読者に説明してもらいました。 aiXcoder公式サイト: https://www.aixcoder.com/#/ aiXcoderのコード補完効果 まず、TensorFlow を記述する際のコード補完効果を見てみましょう。
上記のように、aiXcoder は TensorFlow コード環境でモデルが確立された後、一連のコード フローを直接「推測」できます。たとえば、損失を定義した後、オプティマイザーを定義し、次に train_op メソッドと init メソッドを定義し、最後にモデルの saver メソッドを定義して計算グラフの実行を開始する必要があります。このプロセスはディープラーニング開発者には基本的に知られていますが、プロセスに従って書き留めるのは非常に面倒です。 aiXcoder の助けにより、開発速度が向上しました。 aiXcoder は、Java、C++/C、Python、PHP、JavaScript などの言語をサポートしており、Pycharm、Android Studio、VS Code、Eclipse、Webstorm、Sublime などの既存の IDE にプラグインとして統合されています。プラグインの背後には、強力なクラウドベースのディープラーニング エンジンがあります。 開発者向けに、この製品は現在、コミュニティ エディション、プロフェッショナル エディション、エンタープライズ エディションに分かれています。コミュニティ版は完全に無料で、プロフェッショナル版も共有することで無料でご利用いただけます。両者の違いは、モデルが学習し続けるかどうかにあります。コミュニティ版は主に、事前にトレーニングされた公開モデルを使用して予測を行いますが、プロフェッショナル版は、ユーザーのコード習慣や構造に基づいてさらに調整を行います。 エンタープライズ エディションは、aiXcoder の最も強力なバージョンです。企業内のプライベート クラウドに導入でき、企業独自のコードを使用してモデル トレーニングを最適化できるため、より高い精度と運用パフォーマンスを実現できます。 aiXcoderの使い方 百聞は一見にしかず。Synced は aiXocder のテストも実施しました。 Synced は、オンライン推論を必要とする Pycharm のコミュニティ バージョンとプロフェッショナル バージョンを試しました。違いは、プロフェッショナル バージョンでは追加のメモリも必要になることです。これは、各 Pro ユーザーが、モデルによって「学習」されたユーザーの習慣を保存するために追加のバッファーを必要とするためです。もちろん、Pro ユーザーのバッファーにはこのプラグインからのみアクセスできます。 一般的に言えば、Python と PyCharm を選択する場合、コード補完のために IDE に付属するツールを自然に使用します。 aiXcoder を使用した最初の印象は、組み込みの補完ツールよりもはるかに柔軟性が高いということです。これは、以前の補完が主に Python 関数や他のパッケージの API に反映される一方で、aiXcoder は変数名が何であるか、操作が何であるか、呼び出したい関数が何であるかを予測することもできるためです。 コード補完の推論プロセスはすべてクラウドで行われますが、私たちの使用環境では、一般的なネットワーク環境や 4G でもリアルタイムのフィードバックを提供できるため、補完速度は基本的に Pycharm の組み込みツールと同じです。李歌教授は、現在、ほとんどの aiXcoder アプリケーションは 200 ミリ秒以内にフィードバックを得ることができると述べました。一部の地域のユーザーは、ネットワーク遅延の問題により遅延を経験する可能性があります。aiXcoder は、ユーザー エクスペリエンスを向上させるために、全国の主要都市にサーバーを展開しています。同時に、aiXcoder チームはモデル圧縮技術にも特別な注意を払っており、CPU ベースの推論操作時間を許容できるレベルまで圧縮し、CPU 上で実行できるローカル バージョンをリリースしたいと考えています。 一般的に、aiXcoder が提供する補完機能は、変数名、関数名、キーワードの予測に非常に柔軟であり、開発者のコーディング スタイルとプログラミング モードも学習するため、効果はかなり良好です。 自動補完の候補として以下が挙げられます。関数名の中には開発者の間でよく使用されるものもあるため、以下が推奨されます。 一部の変数については、aiXcoder は変数の型に基づいて、変数に対して実行可能な操作を提案できます。たとえば、下の図の変数「m」の場合、aiXcoder は文字列を追加するコードを提案します。 aiXcoder の担当者は、この製品を Kite や TabNine などの他のコード補完ツールとも比較しました。 比較プロセス中、aiXcoder は Kite または TabNine によって公式に提供されたサンプル コードを使用し、コードを完了するために必要なキーストロークの数をテストします。結果によると、aiXcoder は他のプラグインよりも 1.5 倍以上効率的です。 aiXcoderの構築方法 効率的なコード補完が可能な aiXcoder には、強力な技術サポートが備わっています。 Li Ge教授によると、aiXcoderは以前から言語モデルを試みており、コードを言語として扱い、直接モデル化しており、これはDeep TabNineと同じである。しかし、研究者たちはすぐに、言語モデルだけでは不十分であり、常に意味のない非科学的な補完提案しか得られないことに気付きました。この目的のために、aiXcoder は、シーケンスベースのプログラム コード言語モデル、抽象構文木に基づくグラフ ニューラル ネットワーク、プログラム ロジック関係などの方法を組み合わせて、完全なシステムを作成します。 ディープラーニング モデルが開発者の意図に基づいてエンドツーエンドで対応するコードを直接生成できる場合、そのようなモデルは非常に「エレガント」なものになります。しかし、調査の結果、そのようなタスク要件を達成することは困難であることが判明しました。これは、タスク自体が依存するデータの性質に関連しています。 李歌教授は、機械学習が依存するデータの性質の観点から、コード生成タスクと従来の画像処理タスクおよび自然言語処理タスクとの違いをより鮮明に説明しました。 画像認識または画像分類タスクの場合、機械学習の目標は、連続したデータ セット (画像データ) とほぼ明確な境界を持つほぼ連続したデータ セット (ラベル) 間のマッピング関係を確立することです。 このように、画像データは非常に密度が高く、ラベルセットには十分に明確な境界があるため、学習するデータ量が多いラベルと同等になります。このようなマッピング関係を確立するのは比較的簡単であるため、機械学習における画像関連のタスクは比較的簡単に完了できます。 自然言語処理タスクの場合、機械学習は、比較的連続的 (画像よりも離散性が高い) で境界が明確なデータセットと、別の比較的連続的で境界が明確なデータセットとの間のマッピング関係を確立する必要があります。 しかし、自然言語処理におけるテキストデータは画像データよりもスパースであるため、自然言語処理に関連するタスクで優れたモデルパフォーマンスを達成することは困難です。 しかし、コード生成の観点から見ると、プログラマーの意図からプログラム コードを生成する問題は、「プログラマーの意図空間」から「プログラム コード空間」へのマッピングとして捉えることができ、ここでの意図は自然言語で記述された情報である可能性があります。上の図に示すように、これは、境界が明確な、より連続的なデータ セットから、境界が明確でない、より離散的なデータ セットへのマッピングです。 つまり、コード生成の意図は比較的明確であるものの、その意図を実装するコードデータは比較的まばらであり、同じ意図であっても、対応する実装コードの間には依然として大きなギャップがあるため、このようなタスクを学習するのは非常に困難です。 このため、aiXcoder の実際の実装では、さまざまなアプリケーション分野のコードに特定のモデルが使用され、その分野のデータのみを使用してトレーニングされます。たとえば、TensorFlow や PyTorch などのフレームワークにも、独自のコード補完モデルがあります。これを実行する主な目的は、プログラム配布の密度を高めることです。特定の領域では、コードの配布が連続性に近づきます。プログラマーの「意図」に基づいて完全なコードを「直接」生成することは非常に難しいことがわかりますが、李歌教授は、同様の技術を使用して人間のプログラマーのコード作成を支援できると述べています。プログラマーがすでに書いたコードからプログラマーの「プログラミング意図」を取得し、コード、構造情報、変数参照情報、APIシーケンス情報、継承関係情報などを総合的に分析して、後続のコードを自動的に生成します。ただし、このプロセスでは、言語モデルだけでは十分ではありません。生成コード補完を実行するには、他の多くのコード機能を分析する必要があります。シンプルな事前トレーニング済み言語モデルはどうでしょうか? コード補完に関して、これは単なる通常の言語モデリングタスクであり、モデルは開発者が以前に書いたコードに基づいて後続のコードを予測するだけでよいと無意識のうちに考える人もいるかもしれません。したがって、最も高度な事前トレーニング済み言語モデルを使用してから、コードデータで微調整することが良い考えかもしれません。 しかし、李歌教授は、そのような考え方だけでは十分ではないと述べた。事前トレーニング済みの言語モデルは、コード補完タスクではうまく機能しません。主な理由は、コード補完タスク自体に、自然言語分析タスクとは異なる多くの課題があるためです。 1 つ目は、コード テキストにおける意味の抽象化の問題です。コードのセマンティクス (機能的セマンティクス) とそのリテラル表現の間には、はるかに大きなギャップがあります。コードの文字どおりの意味に基づいて、コードの正確な意味を判断することはできません。たとえば、コードでは、1 文字を変更するだけでコード行全体の機能が完全に変わる可能性があるため、コードの言語を処理してその意味を正確に抽出することは、自然言語処理よりも難しい作業です。 - f = 開く( 'word_ids.txt' , 'r' )f = 開く( 'word_ids.txt' , 'w' )
上の図に示すように、Python コードでは、ファイルを開くときに「r」と「w」を使用すると、まったく異なる機能が実現されます。 さらに、コードの機能的意味論は、具体的に表現したり特徴付けたりすることが難しく、コードの機能的意味論を表現する方法は多種多様です。たとえば、ある機能を実装するためのコードが複数あり、そのうちの 1 つのコードが正しく、他のコードが間違っているとは言えません。 - list_a = [] i が items 内にある場合: result = test(i) list_a.append(result) list_a = [test(i) i が items 内にある場合]
図に示すように、list_a を実装するコードはさまざまですが、言語モデルはそれらを完全に異なる表現として学習します。 同時に、コードテキスト自体の構造は非常に複雑です。例えば、コードの意味とコード構造(行間のインデントなど)には大きな相関関係があり、コードの意味は表現のコード構造に依存します。これは、事前にトレーニングされた言語モデルでは表現するのが難しい機能です。 最後に、コードは本質的に進化するものです。コードは自然言語よりも速く反復されるため、事前にトレーニングされた言語モデルは進化的特徴をタイムリーに捉えることができません。 コード言語の多くの特性を考慮すると、単純な事前トレーニング済み言語モデルでは、あまり良い結果を達成できません。 単一の言語モデルだけでは不十分なので、aiXcoder はどのようなテクノロジーを組み合わせて、どのようにコードを完成させるのでしょうか?一般的に、aiXcoder はプログラム コードの学習に主に独自のディープ ニューラル ネットワーク モデルに依存しており、次の種類のプログラム機能を分析できます。 1. プログラムの構造的意味特性: プログラミング言語は高度に構造化された言語であり、プログラムの構造情報もプログラムの意味を反映します。たとえば、抽象構文木はコードを解析するための比較的一般的な構造です。これはコードの意味特性を反映します。aiXcoder は抽象構文木を最大限に活用して、プログラマーが記述したコードのセマンティクスを解釈します。 2. プログラム要素間の論理関係: プログラム変数間の参照関係、クラス間の継承関係、メソッドとパラメータ間の呼び出し関係など、プログラムコードのさまざまな要素間にはさまざまな関係があります。プログラム自体は、制御フローグラフ、データフローグラフ、呼び出し関係グラフなど、さまざまなグラフとして表現できます。グラフ ニューラル ネットワークの助けを借りて、aiXcoder はプログラム要素間のさまざまな関係をモデル化し、それによってプログラム要素間の複雑な関係を分析および推論することができます。 - 3. プログラミング言語シーケンスモデル:もちろん、プログラミング言語も自然言語との類似点があるため、プログラム識別子間のシーケンス関係を使用してプログラミング言語モデルを確立できます。 aiXcoder は、最新のディープラーニング言語モデルを使用して、プログラム内のシーケンス情報をモデル化します。
プログラム コードのさまざまな特徴を取得したら、これらの特徴をディープ ニューラル ネットワークに入力して分析する必要がありますが、これらの特徴はニューラル ネットワークに入力する前にベクトル化する必要があるため、これは簡単ではありません。研究過程で、北京大学はプログラミング言語コンポーネントの量子化に関する一連のソリューションを提案し、世界で初めて関連論文を発表し、aiXcoderの構築の基礎を築きました。 |