🦔

要約:はじめてのAI駆動開発 -雑誌『Software Design 2024年11月号』

2024/12/10に公開

記事の概要

この記事は
雑誌『Software Design 2024年11月号』
第1特集 はじめてのAI駆動開発
https://gihyo.jp/magazine/SD/archive/2024/202410
の要約になります。

GitHub Copilot

GitHub Copilot とは

GitHub社が提供するAIペアプログラマーサービスです。
「AIペアプログラマー」とあるように、生成AIでソフトウェア自体を生成させるのではなく、ユーザーの開発を 補助するため のサービスとして位置づけられています。

コード提案

簡単な例ですが、Pythonで、start_time_strend_time_str という2つの日付の文字列から、その間の秒数durationを求めるコードを書いてみます。

ひとまず、次のように記述します

start_time_str = "2024-08-24T10:49:00Z"
end_time_str = "2024-08-24T12:49:00Z"
duration = 

この続きのコードを date と記述すると、Copilotは実装を、変数名などの前後のコードから提案します。

コード補完

Pythonで入力した年月の月末を取得する関数 get_end_of_month を実装するとしたとします。
関数名の定義を def get_end_of_month( とまで入力すると関数名から推測して関数内の実装がまるっと提案されます。ただし、通常のコード補完と異なり、AIによる推論であるため、コンパイルエラーや実行エラーがないコードであることを保証していません。

Copilotが参考にする情報

Copilotは、カーソルの前後のコードを読み取り、学習した公開コードのコーディングパターンを利用して推論します。編集中のコード以外にも、同じディレクトリのほかのファイルや、現在別のタブで開いているファイルの内容が参照されます。すでに実装済みのコードと同じパターンの処理を実装する場合、そのファイルを開いておくと近いコードになるように提案してもらいやすくなります。

関数名やコメントが最大のヒント

関数や変数の定義名を記述する際に、その名前が実装に具体的であれば、Copilotはその意図を理解して提案を行います。よって定義名を丁寧に付けることは効果的です。
処理の前や、関数にコメントを付けると、そのコメントの意図を読み取ってくれます。最終的に残さないコメントをCopilotのために記述し、実装後に過剰なコメントを削除するのも有用です。

チャットで指示する

Winowsの場合: [Ctrl]+[I] でチャット

編集箇所にカーソルを移動したり、範囲選択した状態でチャットを開いて指示します。
たとえば

  • 番号を振りなおす指示
  • JSONデータテキストから構造体・クラスを出力する
  • プログラム言語を他のプログラム言語に変換させる

という指示も可能です。

専用コマンド

チャット機能にはコマンドが用意されています。

# テストを作成する
/tests

# ドキュメントコメントを作成する
/doc

# 発生しているエラーを修正する
/fix

ターミナルコマンド生成

ターミナル上でも Windowsの場合は [Ctrl]+[I] でプロンプトを入力でき、コマンドを提案してもらえます。

Copilot活用の注意点

  • 最新のプログラミングの現状を熟知しているわけではない
  • 必ずしも正しく動くコードが提案されるわけではない。必ず動作テストしましょう
  • 生成されたコードの採用に責任を持つのは実装者。コードレビューにおいて内容を問われて「Copilotに提案されたから」で説明を完了させないようにしましょう

生成AIを使用する際のポイント

  • 最新サービスは反映されない。学習データの更新頻度に依存する
  • 機密情報は入力しない
  • 出力されたコードの検証が必要。必ずしも正確で最適化されているとは限らない

AI駆動開発の将来

LLMの技術進化

直近のLLMの進化を妨げる要因はまだ見つかっていない状況でもあり、必然的に今後もLLMの進化は進むと紹介されています。
一方で、学習データの枯渇、電力問題等が課題として挙げられています。ただし、アルゴリズムの改良やハードウェアの進化も急激に進んでいるため、これらの課題を乗り越えてLLMの進化が進む可能性も十分高いと言われています。

開発サイクル全体の高速化

今後はコーディングだけではなく、要件定義から、デザイン、設計、テスト、デプロイまで幅広くAIを用いて実施していく方向に波及すると予想されます。

課題

著作権の取り扱い

  • 学習データに関する著作権
  • AIサービス利用時の著作権
  • 生成された成果物の著作権

生成された成果物の著作権

受託開発のような納品物としてソースコードが含まれ、またその著作権の所属が契約上定義される場合に、契約時点から生成AIを用いて開発する範囲、利用するツール等を記載したうえで、著作権の扱いについて認識を合わせておくことが重要になります。

再現性

LLMは元来確率的なモデルであり、同じ入力に対して毎回異なる出力を生成する可能性があります。
LLMには厳密な再現性がありません。

なお、DevinAutoDev に代表されるアプリ開発用のAI Agentの場合では、生成・検証・修正が内部的に繰り返されることにより高度なコードの出力が行われています。

セキュリティ

  • コードの漏洩
  • 学習への利用
  • 機密情報や個人情報の漏洩

LLMサービス自体のセキュリティ、入力情報がLLMの学習に利用されるか、などの確認が必要です。

脆弱性のあるコードの生成

LLMは非常に膨大なデータ(公開されているコード)から学習を行います。誤った判断や予測をしてセキュリティ上問題のあるコードを生成する可能性があります。トレーニングデータポイズニング などの手法により、脆弱性のあるコードを狙った攻撃が発生する可能性もあります。

責任の所在

AIを利用してコード生成した場合、ソフトウェアに不具合・バグが発生した場合に、責任をLLM事業者やツール提供者に求めることは原則的にできません。
このため生成されたコードをうのみに利用することがないように注意し、必ずソースコードの内容のレビューや理解、テストによる品質担保等を行う必要があります。

このような前提を開発チームとも共有し、生成AI利用においてのガイドラインや開発ルールとして明確化し、開発チームに定着させていく活動も必要になります。

章のまとめ

これからの時代はAIを使いこなし組織・チームとして生産性を向上するための能力・スキルが求められる時代になります。求められるスキルについては今後の技術革新により急激に変化することもあり得ます。

このような変化に対してチャンスととらえ、積極的に学び・そして新たな技術・ノウハウを取り入れていくチャレンジする力 こそが最も大事になると言えるでしょう。

Discussion