🐨

GitHub Copilotハンズオン~AzureOpenAIを使ったチャットアプリを作る~

2024/07/26に公開

GitHub Copilotについて

GitHub Copilotは名前の通り、あくまでも「副操縦士」ですのでハンドリングは自分自身で行う必要があります。
「プログラミング経験が全くない人でもCopilotを使えばアプリを作ることができる」というわけではありません。

たまにコードを間違えますし、最新のアップデート情報を取り込めてなくてバグが発生することもあります。
また、Copilotからの提案コードは複数ありますので、自分で最適なものを選択していく必要があります。

それでもエンジニアが今まで1からルーティーンのように書いていたコードやテストコードといった箇所をCopilotに自動生成してもらって、よりハイレベルな実装に時間がかけられるようになりました。
上手く使いこなすことで何倍も生産性を上げることができます。

準備

  • GitHub Copilot Chatが使えるようになっていること
  • Visual Studio Codeをインストールしていること
  • PC環境にPython3.10がインストールされていること
  • Gitをインストールしていること
  • GitHubのアカウントを持っていること

やること

GitHub CopilotとVisual Studio Codeを活用してチャットボットアプリを作ります。
1からプロジェクトを作るのではなく、既にベースだけできているプロジェクトをもとにアプリを作っていきます。

ハンズオン

1. ローカルにプロジェクトを取り込む

以下のリポジトリをベースにします。

https://github.com/IkeuchiRyuto/gh_copilot_handson.git


vscodeを立ち上げて、Copilot Chatを開きます。
ローカルにプロジェクトを取り込む方法を早速Copilotに聞いてみましょう。
参照機能の一つである「@terminal」を追加して質問します。

スクリーンショット 2024-07-21 18.01.00.png
「git clone」というコマンドを使用するそうです。


コマンドだけ出てきましたが、具体的にどんなことをするコマンドなのかを説明してもらいましょう。
スクリーンショット 2024-07-21 18.05.34.png

git clone コマンドは、GitHubなどのリモートリポジトリからプロジェクトのコピーをローカルマシンにダウンロードするために使用されます。このコマンドを実行すると、リモートリポジトリの全てのファイル、ディレクトリ、そしてその履歴(コミット履歴)がローカルにコピーされます。これにより、ローカルでプロジェクトを開発したり、変更を加えたりすることが可能になります。

具体的な手順は以下の通りです:

リモートリポジトリのURLを指定して git clone コマンドを実行します。
指定したURLからプロジェクトのデータがダウンロードされ、ローカルマシンに新しいディレクトリが作成されます。
この新しいディレクトリ内には、リモートリポジトリの全てのファイルとディレクトリ、そして.gitディレクトリ(リポジトリの履歴や設定を含む)が含まれます。
例えば、GitHub上にあるプロジェクトをクローンする場合、以下のようにコマンドを実行します:

とのことです。


ではコマンドを実行するためにターミナルを立ち上げたいので方法を聞いてみます。
次は「@vscode」を追加して質問します


ボタンが生成されてクリックすることでターミナルが表示されました。



「git clone <リポジトリのURL>」を入力して実行したところ、ローカル環境に取り込まれました。


こんな方法もある

コマンドを使うというは初めはハードルが高いと思います。
VS Codeではgit cloneコマンドをGUI操作ですることが可能です。
先ほどは「@terminal」でプロジェクトを取り込む方法を質問しましたが、「@vscode」に変えてみます。
スクリーンショット 2024-07-21 18.01.07.png
ボタンが生成されましたのでクリックします。


スクリーンショット 2024-07-21 18.14.38.png
Git cloneするためのボタンが表示されました。指示通りに進めていくとローカル環境にプロジェクトを取り込むことができます。


2. 環境構築

取り込んだプロジェクトが動かせるようになるところまでやります。
何をすればいいのか分からないので質問します。

次はこのプロジェクトに関わる内容なので「@workspace」を追加して質問してみます。

スクリーンショット 2024-07-21 18.19.04.png
どうやらREADME.mdファイルに環境構築の手順が記載されているようです。
ステップが8まであるので上から順にコマンドを実行していきます。


https://github.com/IkeuchiRyuto/gh_copilot_handson/blob/main/README.md


スクリーンショット 2024-07-21 18.21.16.png
開いたサイトが以下のような見た目になっていれば成功です。


3. UIを作る

ここからいよいよCopilotにコードを生成してもらってアプリを作っていきます。

スクリーンショット 2024-07-21 18.22.54.png
ベースプロジェクトの段階では「/chat」のRequest bodyに何か質問文を入れて「Execute」をクリックすると、Azure OpenAI Serviceにリクエストが飛んで、数秒後にJSON形式で返信が返ってきます。
つまりUI・見た目が整ってないためアプリとしては使いづらいです。

ChatGPTのアプリのようにAIと会話をしているようなUIにしていきたいです。


「@workspace」を追加して要望を伝えます。
スクリーンショット 2024-07-21 18.28.29.png
スクリーンショット 2024-07-21 18.28.48.png
どうやら「Jinja2Template」というものを使うことでレスポンスをHTML形式にすることができるようです。
さらにHTML/CSS/JavaScriptのソースコードも生成してくれました。

生成された手順通りに進めていきます。


スクリーンショット 2024-07-21 18.38.53.png
プロジェクト内に新しく「templates」フォルダを作成して、中に「chat.html」ファイルを作りました。


スクリーンショット 2024-07-21 18.39.12.png
chat.htmlファイルを開いて、Copilotから生成されたコードの右上にあるボタンをクリックすることでファイル内にペースとしてくれます。


スクリーンショット 2024-07-21 18.41.21.png
次にmain.pyにコードを加えます。
先ほどは空のファイルに入れるだけで良かったですが、main.pyはすでにソースコードがあるので注意して入れていってください。


http://127.0.0.1:8000」にアクセスしてみます。
スクリーンショット 2024-07-21 18.42.46.png
入力フォームとボタンが表示されました!


スクリーンショット 2024-07-21 18.42.58.png
こんにちはと送信すると、先ほどのように数秒後にAIから返信が返ってきました。
めちゃくちゃシンプルではあるものの、チャットボットアプリがこんなにも簡単に作成することができました。


4. コードを解説してもらう

ただ一気に大量のソースコードが生成されたため、どこでどのような処理をしているのか追えません。
特にJavaScriptのところのロジックはJSを今まで触ったことない人からしたら難しいと思います。
ですので生成してもらったコードをもっと詳しく解説してもらいましょう。
スクリーンショット 2024-07-21 18.49.22.png
JavaScriptのコードである「sendMessage」関数を選択して、右クリックすることで「Copilot」→「選択内容をチャットに追加」というボタンがあるのでクリック


さらに「/explain」を追加して質問します。

スクリーンショット 2024-07-21 18.53.18.png
コードの解説文が表示されました。
「/explain」という機能は非常に便利で、例えばチーム開発をしている時に別のエンジニアが実装した関数を使わないといけない時、そのエンジニアに聞かなくても、Copilotに質問すれば中身のロジックを詳しく説明してくれたりします。

5. UIをさらにリッチにしていく

先ほど簡単なUIを作ってもらいましたが、もっとCSSとJavaScriptを活用したアプリにブラッシュアップしていきます。

プロジェクトの内容なので「@workspace」を追加して依頼をします。
スクリーンショット 2024-07-21 18.59.57.png
スクリーンショット 2024-07-21 19.00.05.png
CSSとJavaScriptのコードを生成してくれました。


スクリーンショット 2024-07-21 19.01.22.png
サイトを更新すると以下のようなデザインになりました。
ユーザーとAIのメッセージが左右に分かれたり、影が追加されたりしました。


もっと具体的に要望がある場合は以下のように記載します。
スクリーンショット 2024-07-21 19.15.09.png
生成されたコードがうまく反映されない場合、コメントアウト文を見ながら適宜自分で追加していきます。


スクリーンショット 2024-07-21 19.13.59.png
最終的に以下のようなUIのチャットボットが作成できました!


6. 会話履歴を持たせる

先ほどまではUIの実装をしていたのでHTML/CSS/JavaScriptのソースコードをメインに生成してもらいました。
次はPythonのコードを生成してもらいます。


チャットを使っていると分かりますが、会話履歴を保持していないため、一つ前の会話内容について追加で質問することができません。
Copilotに実装してもらいましょう。
スクリーンショット 2024-07-21 19.16.48.png


スクリーンショット 2024-07-21 19.23.15.png
pythonのコードを生成してくれました、反映して動作確認してみます。


スクリーンショット 2024-07-21 19.24.05.png
しかし実行したところエラーが発生してしまいました。


スクリーンショット 2024-07-21 19.25.28.png
エラーの最後数行を選択して、右クリック→「Copilot」→「これを説明する」をクリックします。


スクリーンショット 2024-07-21 19.28.36.png
原因はどうやら先ほどコードを生成した際に「ChatRequest」の中身の属性が変わっているのに古いままになっていたからのようです。
新しい「ChatRequest」に修正して再度実行してみます。


スクリーンショット 2024-07-21 19.30.48.png
次は422エラーとなりました。
もしかしたらPythonのコードとJavaScriptのコードでどこか差異があるのかもしれません。
main.pyとchat.htmlをチャットに追加して、「@workspace」と「/fix」を使って修正箇所を見つけてもらいます。


スクリーンショット 2024-07-21 19.35.44.png
やはりJavaScript側のコードが古いままになっていたためリクエストエラーとなっていたようです。
修正して再度実行してみます。


スクリーンショット 2024-07-21 19.37.08.png
スクリーンショット 2024-07-21 19.37.45.png

1回目は成功しているのに2回目でエラーとなりました。
ログにもエラーが出ています。
先ほどと同じように選択してCopilotに説明してもらっても良いですが、今回はメッセージだけで判断ができそうです。

aiというvalueは間違っていて、サポートしているのはsystemassistantuserfunctionの四つです」

と記載されています。


スクリーンショット 2024-07-21 19.40.10.png
ソースコードを見返してみると確かにaiとなってます。ここではassistantが正しいので修正して再度検証します。


スクリーンショット 2024-07-21 19.41.48.png
会話を続けることができました!

最後に

元々GitHub Copilotはコードの補完機能として登場しましたが、現在はChatを使って対話形式でまとまったソースコードを一括で生成してくれるようになりました。
このことで簡単なアプリの実装のハードルはかなり下がったと思います。

今回のようにコードをただ生成してもらうために使うだけでなく、レベルが上がるとコードレビューをしてもらったり、リファクタリングをしてもらったり、別の言語に書き換えてもらったりとユースケースはまだまだあります。

ヘッドウォータース

Discussion