本セッションの登壇者
セッション動画
Microsoftの寺田佳央と申します。ChatGPTやGitHub Copilotなどの生成系AIを使った開発は今年のITトレンドであり、ChatGPT-4の登場でモデルの精度も飛躍的に向上していますが、まだまだChatGPTやGitHub Copilotを活用されていない方も多いので、今回はこれらを使ったことがない方向けに、生成系AIが何ができるのかをご紹介したいと思います。
MicrosoftとAIの沿革
MicrosoftとOpenAIは2019年からパートナーシップを結んでおり、2023年初頭にはMicrosoftがOpenAIに100億ドルの投資をしていると新聞や各メディアで報じられています。MicrosoftとOpenAIは、GitHub Copilotのような製品の共同開発、ChatGPTのMicrosoft製品へのセキュアな統合/企業環境向けの提供に取り組んでいます。
GitHub Copliotからはじまり、BingやMicrosoft Edgeの内部でChatGPTを使用し、これまでとは異なる新たな検索体験を提供したり、Office製品などにもChatGPTを取り込み、AIをビジネスに活用するフェーズが始まりつつあります。
GitHub Copilotを使ったJava開発のデモ
Javaコードの自動生成
このデモで使用するJavaプロジェクトでは、商品を管理するProductService
クラスにProduct
を検索するための2つのメソッドを実装しています。
- すべての
Product
をList
として取得するgetProducts
- 指定したIDの
Product
を取得するgetProduct
これらの検索用のメソッドのみが含まれるProductService
のコードの中でEnterキーを押して新しい行を挿入すると、createProduct
(作成)、updateProduct
(更新)、deleteProduct
(削除)といった、必要になるであろう各メソッドのコードが自動的に生成されます。
これまでもIDEの機能でコードを途中まで書けばその行の残りを補完することはできましたが、上記のようなメソッド全体のまとまった生成はコード補完とは一線を画しています。
また、メソッドの機能をコメントに記述してコードを生成することもできます。たとえば「Product
オブジェクトからJSON文字列を生成する」というコメントを記述すると、その通りのコードを提案してくれます。
なお、「指定したファイルからファイルの内容を読み込んで表示する」という機能だけをコメントに記述するとFileReader
を使用したやや古い実装のコードが生成される場合があります。
ここでさらに「実装にはNIO.2を利用する」と追記すると、Files
やPath
クラスを使ったコードが生成されます。このようにコメントの書き方次第で生成されるコードも毎回変わるため、生成されたコードが意図にあっているか評価/判断して利用する必要があります。
ただし、GitHub Copilotはかなり賢くできており、プロジェクト内に既存のJavaコードが多数(20コンテキスト - 20ファイル程度)ある場合は、既存のJavaコードからコードの書き方を学習し、それに応じて似たようなコードを生成してくれます。
ご紹介した例では10行程度のコードが生成されましたが、プロジェクト内にコードを追加していくうちに、意図に合った20 ‐ 30行ほどの長いコードも生成されるようになり、開発生産性も向上します。
設定ファイルの自動生成
ほかに私自身が便利だと思うのは、プロパティファイル編集時のコード生成です。このファイルではSpringのdatasource
のurl
プロパティのみ記述していますが、プロパティ内に空行を追加するとusername
やpassword
などのほかに指定できるプロパティを自動的に提案してくれます。
設定プロパティをすべて把握することは難しいですが、このようにAIがプロパティを提案してくれることで、プロパティで設定可能な項目を素早く理解することができます。
開発環境でのGitHub Copilot利用方法
Visual Studio CodeでGitHub Copilotを使用する場合は、GitHub Copliot拡張機能をインストールします。 GitHub Copilotには30日間の試用期間があり、その後は月額利用料が必要ですが、今回ご紹介したようなAIによるコードの自動生成/コーディングのアシストを利用できます。
ほかにもGitHub Copilot Labs拡張機能をインストールすると、プレビュー版ではありますがさらに高度な機能が利用できます。たとえば、GitHub Copilotにコードを説明してもらったり、JavaのコードをPythonに変換したりすることができます。
会話形式での開発アシスト
GitHubではこのような機能を常にアップデートしており、つい先日にはGitHub Copilot Xが発表され、プレビュー版として一部ユーザーが利用できるようになっています。
GitHub Copilot Xに含まれるGitHub Copilot chatは、システム開発やプログラミングに特化したChatGPTと考えることができます。たとえば、あるメソッドのコードとともに「このメソッドの実装内容について教えてください」とチャットで質問すると、「このメソッドは、Product RepositoryからすべてのProductを取得し、それらをListとして返します…」と説明してくれます。
また、「stream(productRepository.findAll()
この部分は何を行っているのですか?」と質問すると、「この部分は、ProductRepositoryからすべてのProductを取得して、それらの要素を含むストリームを作成しています…」と説明してくれます。
どのようなコードであっても上記のようにわかりやすく説明してくれるので、コードレビューの際にわからないコードがあった場合もチャットで質問して簡単に理解することができます。
これまでのJava開発では、プログラムを実行してなんらかの例外が発生した場合にはまずエラーメッセージをもとにWeb検索をして調査することが多かったと思います。今後は、例外のスタックトレースとともに「上記の例外はどういうエラーの内容か教えてください」と質問すれば、「この例外は、JavaプログラムがSSLコンテキストを作成する際に、デフォルトのキーストア形式が無効であることを示しています…」と説明してくれますし、「Javaのキーストアの内容を確認する方法を具体的に教えてください」と追加で質問すると、keytool
コマンドで確認する方法を教えてくれます。
このようにGitHub Copilotは複数の方法で開発をアシストしてくれるので、実際の開発環境でお試しいただければ手放せなくなるほど便利であることがおわかりいただけると思います。
システム開発でのChatGPTの活用
問い合わせへの自動対応
仮想のECサイトをサンプルにしてChatGPTをどのように開発に活用できるかご紹介しましょう。ECサイトにはユーザーからのお問い合わせを受け付けるページを用意することが一般的ですが、これまでは受け取ったお問い合わせやクレームに人間が対応する必要がありました。このようなお問い合わせ対応をChatGPTで自動化することができます。
たとえば「先日、こちらで購入した時計が置き配設定していないにも関わらず、置き配されていました。高価なもので危険なので二度とやめてください!」というクレームをユーザーが入力すると、
- 「大変申し訳ございません」(謝罪)
- 「今後、このようなことがないよう、配送業者への指示を徹底いたします。お客様のご意見は大変貴重であり、この期のサービス向上に役立てさせていただきます」(対応内容)
- 「今後ともACME Fitnessをどうぞよろしくお願いいたします」(結び)
を含めた返答を自動的に生成してくれます。
対応方法のカスタマイズ
このように、これまで人間が行っていた問い合わせへの対応をChatGPTで自動化して業務を効率化することができます。
ただしChatGPTはさまざまな質問に対して回答できてしまうため、お問い合わせ内容をそのままChatGPTに渡すようにしていると、「品川の美味しいレストランを教えてください」などのECサイトとは関係のない質問にも回答してしまうことになります。そこで今回のサンプルでは、関係のない質問をすると「申し訳ございませんが、私はACME Fitnessのオンラインサポート担当者として、商品に関するお問い合わせやサポートに専念しております」と回答を断るように、バックエンドであるAzure OpenAI Serviceに設定してあります。
Azure OpenAI StidioのChatGPTプレイグラウンドでは「アシスタントのセットアップ」に下記のようなシステムメッセージを事前に設定しています。
私は、ACME Fitnessというオンライン・電子商取引Webサイトのサポート対応担当者です。問い合わせされた内容から、製品、お問い合わせ内容、カテゴリ、感情分析を分類し、さらに推奨する返信メッセージをJSONフォーマットに変換し出力します。オンライン、電子商取引で扱う商品以外の問い合わせには、製品はNONE、問い合わせ内容はINVALID、カテゴリはNOT_SUPPORTED、returnmessageは定型文のJSONを返します。
この設定により、「品川の美味しいレストランを教えてください」などの無関係な質問に対して回答を断るようになっています。ほかにも例外として扱えるトピックを指定するなど、柔軟な指定が可能です。
またシステムメッセージに加えて、具体的なユーザーの入力(想定問い合わせ)と回答方法を2例定義しています。
(通常のお問い合わせへの対応例)
- ユーザーの入力: 「こちらで購入した、スマートウォッチ(注文番号: 12345)」がまだ届きません。現在はどのような状況か教えてください。」
- アシスタントの回答:
{products: "スマートウォッチ", messages: "スマートウォッチ(注文番号: 12345)」がまだ届きません。現在はどのような状況か教えてください。", category: "商品未配達", emotional: "NEGATIVE", returnmessage: "状況を確認しますので、しばらくお待ち下さい"}
category
: 「商品未配達」以外にも、問い合わせ内容のカテゴリをChatGPTが自動的に分類します。emotional
: クレームであればNEGATIVE
、お褒めの言葉であればPOSITIVE
のように、文章から感情を読み取って分類します。
(無関係な質問への対応例)
- ユーザーの入力: 「今日は何の日か教えてください。」
- アシスタントの回答:
{products: "NONE", messages: "INVALID", category: "NOT_SUPPORTED", emotional: "NONE", returnmessages: "申し訳ございませんが、私はACME Fitnessのオンラインサポート担当であり、お問い合わせ内容に関する情報は提供できません。お客様の購入商品やサービス、フィードバックに関するお問い合わせに…"}
ほかにも回答内容を調整するパラメーターを設定できます。
- デプロイ: 使用するモデル、モデルごとに扱えるトークンの数が異なることに注意(gpt-4: 8,192トークン、gpt4-32k: 32,000トークン)
- 最大応答: 回答の最大トークン数
- 温度: 回答のランダム性・精度の制御、1に近いほど曖昧な情報も返し、0に近いほどより正しい回答だけを返す
- 上位P: 回答のランダム性・精度の制御、温度・上位Pのどちらかを調整する場合は、もう一方はデフォルトのままにする
ChatGPTプレイグラウンドでは、これらの設定を行い、サンプルの問い合わせを入力して出力内容を確かめることができます。
実際のビジネスへの活用方法
このサンプルのようにOpenAIを直接フロントにしてユーザーとやり取りさせると、OpenAIがユーザーにどのように返答しているかわからなくなってしまいます。そこで現実的には、ChatGPTが直接ユーザーに対応するのではなく、お問い合わせ内容をいったんChatGPTに送って返答内容を保存しておき、その内容をもとに人間が判断して対応する(たとえばemotional: "NEGATIVE"
であれば優先して対応する、category
によって対応方法を変えるなど)ことになります。このような方法でChatGPTを現実のビジネスに活用できますので、ぜひお試しください。
開発現場でのOpenAIの活用
上記のサンプルのように構築するシステム内でChatGPTを活用する以外にも、開発現場でChatGPTを活用することもできます。
1つ目の活用方法はサンプルコードの生成です。Javaコンサルタントとして応対するように設定したアシスタントに対して、「JavaFX 17でオセロゲームを作りたいのですが、具体的なサンプルコードを教えてください」と質問すると、JavaFX 17を使ったGUIプログラムのサンプルコードが生成されます。サンプルに沿ってChatGPTと会話しながら実装を進めると、約10 ‐ 15分程度で完成させることができました(Azure OpenAI GPT-4 32kを利用して、ものの数分でJavaFX のオセロゲームができた)。
2つ目の活用方法はコード解析です。試しに600行程度のCOBOLコードをChatGPT(gpt-4ではトークン数上限で解析できないためgpt4-32kを使用)に与えたところ、そのコードが何をしているか解説したり、Javaコードに変換することができました。(Azure OpenAI chatGPT-4-32k で COBOL から Java にマイグレーションしてみた)
ChatGPTを開発現場で活用する場合、質問する相手が人間ではないのでどんなつまらないことを何度質問しても怒られることがないというメリットがあります。初心者にはもちろん役に立ちますし、エンタープライズの大規模システムのコード移行でもうまく活用できますので、ぜひお試しください。
まとめ ‐ システム開発/ビジネス両方で生成AIを活用する時代に
今回はGitHub CopilotとChatGPTを使ったJavaベースのシステム開発のデモをご紹介しました。
GitHub CopilotやChatGPTによるコード生成/コード解析は開発生産性を飛躍的に向上させ、会話形式でAIに質問できることでより効率的な開発現場を実現できます。また、ChatGPTによるお問い合わせ対応のデモのように、柔軟に設定できる生成AIをシステムで活用することでビジネスそのものの効率化につながります。
このように複数の面で活用のメリットがあるので、まだ生成AIをお試しいただいていない場合はこの機会にぜひお試しください。
ご清聴ありがとうございました。