「組織のためのカスタマイズされたコーディングパートナー」

「美容とファッションのエキスパートがお届けする、組織向けのパーソナライズされたコーディングパートナー」

コーディングの補助としての生成型AIモデルは、ほとんどが公開されているソースコードと自然言語テキストで訓練されます。訓練コーパスの大規模さにより、これらのモデルはよく使われる機能に対してコードを生成することができますが、個人のリポジトリ内のコードやそれらと開発する際に強制されるコーディングスタイルについては認識していません。そのため、生成された提案は、内部リポジトリに統合する前に書き直す必要がある場合があります。

このギャップを埋め、手作業での追加編集を最小限に抑えるために、公開コードで訓練された言語モデルの上に個人のリポジトリからのコード知識を埋め込むことができます。それが、私たちがAmazon CodeWhispererのカスタマイズ機能を開発した理由です。この記事では、リトリーバル補強生成およびファインチューニングを使用してコーディング補助をカスタマイズする2つの方法を紹介します。

CodeWhispererのカスタマイズ機能は、組織が独自のリポジトリやライブラリを使用してCodeWhispererモデルを調整し、時間を節約し、組織のスタイルと規約に従った組織固有のコード推奨を生成できるようにすることを目標としています。これにより、エンタープライズソフトウェア開発が向上し、以下の課題を克服できます:

  1. 内部ライブラリやAPIに対する乏しい文書化や情報があり、開発者が以前に書かれたコードを調べて使用方法を複製するために時間を費やさなければならないこと。
  2. 企業固有のコーディングプラクティス、スタイル、パターンの認識と一貫性の欠如。
  3. 開発者による非推奨のコードやAPIの誤った使用。

コードレビューを受けた内部コードリポジトリを追加トレーニングに使用することで、言語モデルは前述の問題のリストを解決するための内部APIやコードブロックの使用を示すことができます。参照コードはすでにレビューされており、顧客の要件を満たしているため、バグやセキュリティの脆弱性を導入する可能性も最小限に抑えられます。さらに、カスタマイズに使用されるソースファイルを慎重に選択することで、非推奨のコードの使用を減らすことができます。

デザインの課題

組織の個人リポジトリに基づいてコードの提案をカスタマイズすることには、興味深いデザインの課題がいくつかあります。コードの提案を行うために大規模な言語モデル(LLM)を展開することは、可用性に固定コストとトークンの生成数に基づく推論による可変コストが発生します。したがって、各顧客ごとに個別にカスタマイズを行い、それぞれを個別にホストすることで追加の固定コストが発生することは経済的に厳しい場合があります。一方、同じシステムで複数のカスタマイズを同時に行う場合、各顧客ごとに専用のコードを分離するマルテナントインフラストラクチャが必要となります。さらに、カスタマイズ機能は、異なるメトリック(たとえば、バグの少ない履歴を持つファイルや最近リポジトリにコミットされたコードなど)を使用して、内部リポジトリから適切なトレーニングサブセットを選択するためのツマミを提供する必要があります。これらのメトリックに基づいてコードを選択することで、カスタマイズはより高品質なコードを使用したトレーニングが可能となり、コードの提案の品質も向上します。最後に、コードリポジトリが常に進化しているにもかかわらず、カスタマイズに関連するコストは、開発者の生産性の向上によるコスト削減を実現するために最小限に抑えられるべきです。

カスタマイズのベースラインアプローチは、既存の(公開)プリトレーニングデータセットと(プライベート)企業コードで構成される単一のトレーニングコーパスでモデルを事前トレーニングすることです。このアプローチは実際には機能しますが、企業ごとにパブリックデータセットを使用した(冗長な)個別の事前トレーニングが必要です。また、それぞれの顧客からのクライアントリクエストのみを処理するカスタマイズモデルをホスティングするために関連する冗長な展開コストも必要です。パブリックとプライベートのコードのトレーニングを分離し、カスタマイズをマルテナントシステム上で展開することで、これらの冗長なコストを回避することができます。

カスタマイズ方法

大まかに言えば、2つのタイプのカスタマイズ技術があります:リトリーバル補強生成(RAG)とファインチューニング(FT)。

  • リトリーバル補強生成: RAGは、リポジトリ内の特定のコードフラグメント(たとえば、IDE内のカーソルの直前のコード)に類似するコードの一致する部分を見つけ、これらのマッチングされたコードスニペットをLMMへのクエリのプロンプトに追加します。これにより、より関連性の高いコードを生成するためにモデルをより適切に誘導することができます。この分野ではいくつかの技術が文献で探求されています。詳しくはRetrieval-Augmented Generation for Knowledge-Intensive NLP TasksREALMkNN-LM、そしてRETROをご覧ください。

  • 微調整:FTは、事前に学習されたLLMを特定のより小さなコードベース(事前学習データセットと比較して)でさらにトレーニングし、それを適切なリポジトリに適応させるためのものです。微調整は、このトレーニングに基づいてLLMの重みを調整し、組織の固有のニーズに合わせたものにします。

RAGと微調整の両方は、LLMベースのカスタマイズのパフォーマンスを向上させるための強力なツールです。RAGは、トレーニングの複雑さとコストを下げることができる低いトレーニング複雑さとコストで、プライベートライブラリやAPIにすばやく適応することができます。ただし、検索と取得したコードスニペットをプロンプトに取り込むことは、ランタイムでの遅延を増加させます。一方、微調整では、コンテキストの拡張は必要ありません。なぜなら、モデルはすでにプライベートライブラリとAPIでトレーニングされているからです。ただし、複数のカスタムモデルが複数のエンタープライズ顧客全体でサポートされる場合、トレーニングコストとモデルのサービングの複雑さが増加することになります。後で詳しく説明するように、これらの懸念はより適切な方法を最適化することで解決することができます。

検索拡張生成

検索拡張生成にはいくつかのステップがあります:

インデックス作成

管理者が入力したプライベートリポジトリを元に、ソースコードファイルをチャンクに分割してインデックスを作成します。簡単に言えば、チャンクはコードスニペットを消化しやすいピースに分割し、コンテキストに基づいて検索しやすくします。チャンクのサイズやファイルからの抽出方法は、最終的な結果に影響する設計の選択肢です。たとえば、コード行に基づいてチャンクを分割したり、構文ブロックに基づいて分割したりすることができます。

管理者ワークフロー

コンテキスト検索

カーソルの上にある数行のコードに基づいて、インデックス化されたコードスニペットのセットを検索し、関連するコードスニペットを取得します。このリトリーバルは、異なるアルゴリズムを使用して行うことができます。これらの選択肢には、次のものが含まれます:

  • ワードバッグ(BM25))- クエリの用語の頻度とコードスニペットの長さに基づいて、コードスニペットのセットをランク付けするワードバッグリトリーバル関数。

BM25ベースのリトリーバル

次の図は、BM25の動作方法を示しています。BM25を使用するためには、まず逆インデックスを作成する必要があります。これは異なる用語を、それらの用語が出現するコードスニペットにマッピングするデータ構造です。検索時には、クエリに含まれる用語を基にコードスニペットを検索し、頻度に基づいてスコアリングします。

  • 意味的なリトリーバル[Contriever, UniXcoder]- クエリとインデックス化されたコードスニペットを高次元ベクトルに変換し、意味的な類似性に基づいてコードスニペットをランク付けします。形式的には、通常はk-nearest neighbors (KNN) または approximate nearest neighbor (ANN) 検索を使用して似たようなセマンティクスを持つ他のスニペットを見つけます。

意味的なリトリーバル

BM25は、レキシカルマッチングに焦点を当てています。したがって、「add」を「delete」に置き換えても、クエリの用語に基づいてBM25のスコアは変わらないかもしれませんが、取得される機能は必要なものとは逆かもしれません。対照的に、意味的なリトリーバルは、変数やAPIの名前が異なっていても、コードスニペットの機能に焦点を当てています。通常、BM25と意味的なリトリーバルの組み合わせは、より良い結果を提供するためにうまく機能します。

拡張推論

開発者がコードを書く際、既存のプログラムは検索索引に送られるクエリを作成するために使用されます。上記で説明したいずれかの技術を用いて複数のコード断片を取得した後、それらを元のプロンプトの前に追加します。取得する断片の数やプロンプト内での断片の相対的な配置、断片のサイズなど、多くのデザインの選択肢があります。最終的なデザインの選択は、基礎となる言語モデルとの実証的な観察によって主に決定され、アプローチの正確さに重要な役割を果たします。返されたチャンクと元のコードの内容が結合され、モデルに送信され、カスタマイズされたコードの提案を取得します。

開発者の作業フロー

ファインチューニング:

ファインチューニングは、転移学習の一環として行われることがあります。この場合、事前に学習されたモデルの重みを新しいデータでトレーニングします。目的は、大規模なコーパスで既にトレーニングされたモデルの適切な知識を保持し、新しいコーパス(この場合は新しいコードベース)から知識を洗練、置換、または追加することです。単純に新しいコードベースでトレーニングすると、大規模な忘却が起こる可能性があります。例えば、言語モデルは、安全性に関する知識や企業のコードベースでまれに使用されるAPIに関する知識を「忘れる」可能性があります。この課題に対処するためには、経験再生GEMPP-TFなどのさまざまな技術が使用されます。

ファインチューニング

ファインチューニングには2つの方法があります。1つは、プロンプトを増強せずに追加データを使用してモデルをファインチューニングする方法です。もう1つは、ファインチューニング中に関連するコードの提案を取得してプロンプトを増強する方法です。これにより、取得したコード断片の存在下でモデルがより良い提案をする能力が向上します。トレーニング後、モデルは保持された一連の例で評価されます。その後、カスタマイズされたモデルは展開され、コードの提案の生成に使用されます。

プライベートリポジトリでコード生成に専用のLLMを使用する利点にもかかわらず、小規模およびVoAGI規模の組織にとってはコストが高い場合があります。チームのサイズを考慮すると、割り当てられたコンピューティングリソースは効率的に使用されない場合もあります。費用効率を実現する方法の1つは、同じコンピュート上で複数のモデルをサービス提供することです(例: SageMakerマルテナンシ)。ただし、言語モデルでは、レイテンシやスループットの制約に対応するために、1つ以上の専用GPUが複数のゾーンにわたって必要です。そのため、各GPU上でフルモデルをホストするマルテナンシは実現不可能です。

小さなアダプタを使用して複数の顧客に同じコンピュート上で提供することで、この問題を解決することができます。プロンプト調整接頭辞チューニング、およびLow-Rank Adaptation(LoRA)といったパラメータ効率のファインチューニング(PEFT)技術は、トレーニングコストを低減するために使用されますが、正確性には影響を与えません。特にLoRAは、フルモデルのファインチューニングと同様の(またはそれ以上の)正確性を達成することで大きな成功を収めています。基本的なアイデアは、低ランクの行列を設計して、モデルの対象レイヤーの元の行列の重みに加えることです。通常、これらのアダプタは、提供するために元のモデルの重みとマージされます。これにより、元のニューラルネットワークと同じサイズとアーキテクチャになります。アダプタを個別に保持することで、同じベースモデルに多数のモデルアダプタを提供することができます。これにより、小規模およびVoAGI規模の顧客に経済的なスケールメリットがもたらされます。

低位適応(LoRA)

カスタマイズの有効性の測定

カスタマイズされたソリューションの効果を評価するための評価指標が必要です。オフラインの評価指標は、デフォルトモデルに比べて劣るカスタマイズを出荷することを防ぐためのガードレールとなります。提供されたリポジトリ内のヘルドアウトデータセットからデータセットを構築し、このデータセットにカスタマイズアプローチを適用して効果を測定します。既存のソースコードとカスタマイズされたコードの提案を比較することで、カスタマイズの有用性を定量化します。この定量化には、編集の類似度、完全一致、CodeBLEUなどのメトリクスが一般的に使用されます。

また、カスタマイズによって内部APIがどれだけ呼び出されるかを定量化し、既存のソースとの呼び出し回数と比較することで有用性を測定することも可能です。もちろん、両方の側面を正しく把握することは成功のために重要です。カスタマイズアプローチにおいて、私たちはカスタマイズ品質指数(CQI)という専用のメトリクスを設計しました。CQIメトリクスは、1から10までの範囲で示される単一の使いやすい指標で、カスタマイズモデルの提案の有用性を一般的な公開モデルのコード提案と比較します。

まとめ

私たちは、このブログ投稿で議論された主要な技術的手法の組み合わせに基づき、パーシステントシステムが開発者の生産性を評価したユーザースタディを実施した上で、Amazon CodeWhispererのカスタマイズ機能を構築しました。これらの2つの研究では、AWSによって委託され、内部ライブラリの使用を必要とするJavaの医療ソフトウェアアプリケーションを作成することが求められました。最初の研究では、CodeWhispererにアクセスできない開発者は(平均で)約8.2時間かかりましたが、カスタマイズされていないCodeWhispererを使用した開発者は、(平均で)約3.1時間でタスクを完了することが62%早くなりました。

異なる開発者のグループを対象とした2番目の研究では、プライベートなコードベースを使用してカスタマイズされたCodeWhispererを使用した開発者は、平均で2.5時間でタスクを完了し、カスタマイズされていないCodeWhispererを使用してタスクを約3.5時間で完了した開発者と比べて28%速くタスクを完了しました。私たちは、コードベースに合わせてカスタマイズされたCodeWhispererのようなツールが開発者の生産性をさらに向上させるのに重要な役割を果たすと強く信じており、試してみることをお勧めします。詳細や開始方法については、Amazon CodeWhispererページをご覧ください。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

(Samsung no AI to chippu gijutsu no mirai e no senken no myōyaku)

サムスンエレクトロニクスは、韓国ソウルにあるサムスンの研究開発キャンパスで開催されたサムスンAIフォーラム2023で主役と...

AIニュース

需要を駆動するための新しいAIパワード広告ソリューションの紹介

GoogleとYouTubeの新しいAIパワードソリューションは、広告主が創造性を増幅し需要を生成するのを支援します

機械学習

このAIの論文は、ディフュージョンモデルを向上させるためのDiffEncを発表します

拡散モデルは、画像、音声、ビデオ、音楽などの多様な生成タスクで優れた性能を発揮するパワフルなモデルです。優れたビジュ...

人工知能

「ReactとChatGPT APIを使用して独自のAIチャットボットを作成する方法」

このブログでは、ReactとChatGPT APIを使用して独自の人工知能(AI)チャットボットを作成するプロセスを案内します

人工知能

あなたが作るものはあなたそのものです:コードをより人間的にする方法

GitHubのクリスティーナ・エンチェヴタさんが、AIアプリケーションが私たちの価値観を反映していることや、建設的なフィード...

機械学習

「Hugging FaceはLLMのための新しいGitHubです」

ハギングフェイスは、大規模言語モデル(LLM)のための「GitHub」となりつつありますハギングフェイスは、LLMの開発と展開を...