大規模言語モデルが「コードの補足」に留まらず、現実の開発タスクを遂行するまで
風戸氏によれば、LLMがソフトウェア開発能力を獲得し、実用化されるまでの過程には、大きく分けて3つの進化の段階が存在するという。
第1段階は、与えられたテキストの続きを生成する「ベースモデル」の登場だ。大量のソースコードを読み込ませることで、プログラマーが書きかけたコードの続きを予測し出力する機能が実現した。
第2段階は、人間の指示に寄り添う「インストラクションモデル」への進化である。ここでは、チャット形式でコードの意味を質問したり、特定の処理を行う関数の作成を依頼したりといった対話的な要求に応える能力を獲得し、非エンジニア層にまで利用の間口を広げた。
そして現在、第3段階として「推論モデル」が出現している。これは即座に回答を出力するのではなく、背後で自らの思考過程を分解し、複雑な条件を考慮した上で最終的な答えを導き出すモデルであり、競技プログラミングレベルの難問や複数工程にまたがる開発タスクの遂行をも可能にしている。
tsuzumiをはじめとする「Code-LLM」は、自然言語とソースコードを共にテキストデータとして横断的に扱うことができる。これにより、自然言語の仕様書からコードを生成するだけでなく、ソースコードを入力してバグを修正する、リバースエンジニアリングによって仕様書を起こす、別のプログラミング言語へ翻訳するなどの多様なワークフローが実現する。
風戸氏は、これらの能力が開発環境にどのように統合されているかについて、IDE(統合開発環境)に組み込まれた開発アシスタントや、端末ベースの自律型エージェントの事例を挙げて解説した。
例えば、オープンソースのターミナルエージェントである「Aider」は、自然言語で変更要求を伝えると、AIが自らソースコードの状態を確認し、修正計画を立て、実際のコード変更からバージョン管理システムへのコミットまでを一貫して自動で行うことができる。
こうした高度な能力をLLMに獲得させるための学習プロセスは、従来のソフトウェア開発とは全く異なるアプローチをとる。コンパイラや構文解析器を作るのではなく、GitHubなどのリポジトリから収集された膨大なソースコードを用いた機械学習が行われる。
しかし、単に量を集めれば良いわけではない。風戸氏は「データを集めた後に、品質の悪いデータを除外していくとAIの性能が向上することが分かりました」と語り、コンパイル不可能なコードや文字化けを含むデータを徹底的に除外する厳格なフィルタリングの重要性を強調した。
さらに、対話能力を高めるインストラクションモデルの学習には、大量の「問題と解答」のペアが必要となる。手作業で数十万件の学習データを用意するのは現実的ではないため、研究者たちは強力なAIモデルを用いて学習データを自動生成する「データ合成」という手法を編み出した。
プロンプトエンジニアリングによってAIに大量のコーディング問題を作成させ、さらにAI自身に解答のコードを書かせた上で、Pythonなどの実行環境でテストコードを走らせ、合格したものだけを学習データとして採用するのだ。
「AIが生成したデータをそのまま学習させるとモデルが劣化します。そのため、テストによる品質確認が重要です」と風戸氏が指摘するように、自動生成されたデータの真偽を機械的に検証しやすいソフトウェア工学の分野は、LLMの学習手法と極めて相性が良く、それが近年の急激な性能向上の原動力となっている。
