「LLMを利用したプログラム自動生成の精度評価」が学術論文誌 IEEE Accessに掲載!研究の概要を紹介します

こんにちは。
ソフトウェアエンジニアの傍ら、クラスターメタバース研究所と研究活動も行っている、倉井です。

昨年 cluster ユーザーの皆さまに実験に協力いただいた、LLMを利用したプログラム自動生成の精度評価 についての研究結果がこの度、学術論文誌の IEEE Access に掲載されました。実験に参加いただいた皆さま、ご協力ありがとうございました!

この研究ではClusterScriptという、メタバースプラットフォーム「cluster」で開発しているプログラミング言語によるコードの自動生成についての実験を行いました。ClusterScriptはcluster内の3D空間上にあるオブジェクトの振る舞いを記述することができます。
今回のブログでは、この研究成果についての報告を兼ねて、AIに ClusterScript を書いてもらうには何をすればよいのか?という具体的な方法をご案内したいと思います。

AIに ClusterScript を書いてもらう方法

ここ数年で ChatGPT, Gemini, Claude など、ユーザと対話できるインタフェースを備えたAIがたくさん登場しました。これらは大規模言語モデル (Large Language Model, LLM) をベースとしていますが、ClusterScript の生成は概ねどのLLMでもちょっとした工夫で行うことができます。いずれかの LLM の有料版を契約している人も多いかと思いますが、まずは、何も契約してないよ!という人のために google アカウントがあれば利用できる、NotebookLM を利用した、ClusterScript の生成方法について紹介します。

NotebookLM は google が提供している AI サービスの1つで、最初に upload したドキュメントについて 様々な質問をすることが出来るサービスです。現在は無料で利用することができます。ドキュメントについての質問ができるというところがポイントで、本稿では最初に以下のファイルをドキュメントとして upload します。

cluster_script_definition.txt

このファイルは ClusterScript のTypeScript 定義です。それが一体どんなものかという説明は後ほどするとして、まずはデモを御覧ください。

このように、作りたいクラフトアイテムの説明を書くだけで、ClusterScript を解説付きで生成してくれます。もちろんバグのないコードが常に生成されるわけではありませんが、作り始めるヒントになることは多いのではないかと思います。

さて、NotebookLMに最初にアップロードした cluster_script_definition.txt このファイルですが、一体どのようなファイルなのでしょうか。このファイルは TypeScript から ClusterScript を生成するための定義ファイルです。中をみると、ClusterScript に定義されている、オブジェクトや関数がサンプル付きで記述されています。最新版は、npm でも見ることができます。

  /**
   * アイテムを掴む・手放すときに呼ばれるcallbackを登録します。アイテムには`GrabbableItemコンポーネント`が付いている必要があります。
   * 
   * スクリプトのトップレベルでの呼び出しのみサポートされます。
   * トップレベルで複数回呼ばれた場合、最後の登録のみが有効です。
   * @example
   * ```ts
   * $.onGrab((isGrab, isLeftHande) => {
   *   if (isGrab) {
   *     if (isLeftHand) {
   *       $.log("grabbed by left hand.");
   *     } else {
   *       $.log("grabbed by right hand.");
   *     }
   *   }
   * });
   * ```
   * ベータではプレイヤーのハンドルを取得できます。
   * ```ts
   * // 掴んでいる間、移動速度を上げる。
   * $.onGrab((isGrab, isLeftHande, player) => {
   *   if (isGrab) {
   *     player.setMoveSpeedRate(2);
   *   } else {
   *     player.setMoveSpeedRate(1);
   *   }
   * });
   * ```
   *
   * @param callback
   * isGrab = 掴んだときにtrue、手放したときにfalseになります。
   * 
   * isLeftHand = 左手で掴んだときや左手で手放したときにtrue、右手で掴んだときや右手で手放したときにfalseになります。
   * 
   * player = アイテムを掴んだ・手放したプレイヤーのハンドルです。この引数はベータでのみ追加されます。
   */
  onGrab(callback: (isGrab: boolean, isLeftHand: boolean, player: PlayerHandle) => void): void;

このように関数の利用例が含まれているので、このファイルを NotebookLM に与えておくと指示した内容に近いコードをサンプルから類推して書いてくれます。もちろん、ClusterScript をすべて書かせなくても、”ユーザーの3次元位置はどうやって取得するんだっけ?” といった具体的な質問をして、リファレンスがわりに使う事もできます。

上記の例では NotebookLM を利用しましたが、ChatGPT, Claude, Geminin の有料版であればcluster_script_definition.txt を添付ファイルとして渡したうえで質問を投げれば概ね適切な回答を返してくれるようです。いずれかの LLM を契約している方はぜひお試しください。

ちなみに、私が契約している Claude に “持つとジャンプ力が5倍になるアイテムの cluster script を書いてください” という依頼をしたところ、Bloom エフェクトをつけてジャンブ力5倍の効果が可視化されるコードまで書いてくれました。

実際に cluster の craft item に反映してみると、何のエラーも無く動きました。

LLMにClusterScriptを書いてもらう公開実験

私達は、2024年の5月末にLLMにClusterScriptを書いてもらう公開実験を行いました。その研究成果が冒頭に紹介したIEEE Access に掲載された論文です。だれでもPDFをダウンロードできるので、 NotebookLM や他LLMにドキュメントとして与えればどんな論文なのか要約したり、質問しながら内容を知ることができます。これはどんな論文でも応用できるテクニックで私もよく利用しています。試しに、Claude に短くまとめてもらいましょう。

Claude によると以下のような論文ということです。

この論文では、メタバースプラットフォーム「Cluster」において、プログラミング経験の少ないユーザーでも自然言語入力によって仮想オブジェクトの動作を定義できるシステム「MagicItem」を提案しています。

Large Language Model(LLM)を活用して自然言語をCluster Scriptに変換し、オブジェクトの動作を制御する仕組みを実装。63名のユーザーによるオンライン実験では、プログラミング未経験者でも高い成功率でオブジェクトの動作を設定できることが示されました。

特に初心者ユーザーからは使いやすさが高く評価され、メタバース空間でのコンテンツ制作の民主化に貢献する可能性が示唆されています。一方で、より複雑な動作の実装や、エラー処理の改善などが今後の課題として挙げられています。

著者の私としても全く違和感のない説明です。このようにLLMはコードを生成するだけでなく、研究活動そのものも加速しています。公開実験を行ったときは上記のデモで利用している NotebookLM も Claude の最新バージョンである 3.5 Sonnet もリリースされていませんでした。そのなかでは、入力できる文字数(コンテキスト長)が長く応答も早かった OpenAI の gpt-4-turbo を利用してシステムを開発しました。TypeScript の定義は何も調整をしないと 48,000字もあります。このような長いテキストを参照しながら適切な部分を参照し、推論まで行う最近のLLMの能力には目を瞠るものがあります。また、コンテキスト長が長く推論が賢いLLMがどんどん発表されていく今の状況は本当にエキサイティングですね。

そして今回紹介した研究はユーザーの皆さんの協力なしには成し得ないものです。ご協力いただいた皆様、本当にありがとうございました。
メタバース空間での自己表現を誰でも出来るようにするために、創造力を加速する研究を今後も進めていきたいと考えています。どうぞよろしくお願いいたします。