生成AIでプログラミングの学習効率を5倍アップさせる（初級編）

こんにちは！

この記事を読む方は、普段からプログラミングについて学習されている方が多いかと思います。
プライベートな時間を費やすため、もっと効率化したいですよね。

今回は、生成AIを活用した学習の効率化について記事にします。

# AIを使うと、何がいいのか
書籍や学習コンテンツは、執筆者が決めた内容で学習します。
もちろん、それも全く問題ありません。

しかしAIを使うと、もっと自由です。
自分が作りたい内容で学習ができます。

そして、いくらでも質問に答えてくれます。
エラーが発生しても、何も文句を言わず、一緒に解決してくれます。

「どのように使うか」

がとても大事なので、まずは使ってみて、少しでも学習効率をアップさせましょう。
タイトルでは5倍と書きましたが、使いこなすと10倍、20倍の効率化も夢ではありません。

# どのAIを使うべきか
生成AIを利用するにあたり、最初に考えるのがこれだと思います。
私のおすすめは「Gemini 1.5 Pro 002」です。（2024年11月時点）

もう少し詳しく言うと、「[Google AI Studio](https://aistudio.google.com/)」の「Gemini 1.5 Pro」です。

# なぜ Gemini なのか
### 安いから（無料だから）
ChatGPT、Claude など、サブスクで20ドルほどかかりますよね。

しかし、Gemini（Google AI Studio）は無料で利用できます。

200万トークンのAIを使えて、無料。
最新版をすぐに利用できます。

さらに、プロンプトのスレッドはいくらでも立てられます。
よほどヘビーな使い方をしない限り、通常は100万トークンも必要ありません。

これで無料なので、使わないという選択肢は無いですよね。

### 無料版だと、学習に利用されたりすることは無いの？
あります。
しかし、今回は学習目的のため、そのような心配は不要です。
APIキーやパスワードなど、秘匿情報を貼り付けたりしない、という部分だけ気を付けてください。

念のため[利用規約](https://ai.google.dev/gemini-api/terms?hl=ja)の一部を貼ります。
![スクリーンショット 2024-11-12 8.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/d789b603-4241-995c-86e9-4bae78218f94.png)

![スクリーンショット 2024-11-12 8.54.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/3896e3d0-11b1-4d6c-0b49-1a51ac03baf8.png)

# Google AI Studio で Gemini を使ってみる
# 入力欄や設定欄を紹介
今回は、主要な入力欄および設定欄である①〜④について説明します。
![スクリーンショット 2024-11-13 0.15.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/39040dec-b0e3-7810-f977-d3af88fad97e.png)

### ① System Instructions
このスレッドにおけるAIの役割や前提条件、背景などを記述します。
例えば、「あなたは優秀なプログラマーです。」「あなたは弁護士です。」など、AIの役割を定義しておくと、スレッド全体を通してその役割でやりとりをしてくれます。

開発環境なども、Reactでjavascriptを使うのか、TypeScriptを使うのかでコードが異なるので、前提条件として書いておくと、あまりブレずにコードを書いてくれます。

### ② Model
Geminiのモデルを選びます。
基本的に高性能かつ最新版を選ぶといいです。
2024年11月現在では、「Gemini 1.5 Pro 002」を選んでおくと間違いないです。

### ③ Temparature
プロンプトに対する忠実度です。
一番忠実なのが「0」、バランスがいい「1」、最も創造的な「2」。

基本的には「1」でいいです。
慣れてきたら、値を変えて試してみましょう。

### ④ プロンプト入力欄
ここでAIに対して様々な指示（プロンプト）を書きます。
書き方によってAIからの回答が異なるので、ある程度の試行錯誤は必要です。

# 実際に使ってみる
今回は、Pythonで月の位置を教えてくれるコードを書いてもらいましょう。
AIは構造化された文章の方が理解すやすいと聞いたので、YAML形式で書いてみます。

### System Instructions の内容
以下の内容を「System Instructions」に書きます。
この書き方が正解というわけではないので、ご自身でも工夫してみてください。
```text
あなたの役割:
 - 優秀なプログラマー
 - Pythonが得意

お願いしたいこと:
 - Pythonでスクリプトを書いて
 - venvを使った環境構築の作り方も教えて
 - そのまま実行できる完全なコードを書いて
 - 実行コマンドも教えて

前提条件:
 - 開発環境: macOS
```

### プロンプトを書く
前提条件で色々と書いたので、プロンプトは非常にシンプルです。
```
月の位置を教えてくれるスクリプトを書いて
```

### 実行結果
ちゃんと書いてくれましたね。
![スクリーンショット 2024-11-13 0.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/164ab383-1b1f-aa99-fc3a-dffea5e65c7a.png)
画面上部のタイトルは、内容に合わせて自動で書いてくれます。
編集できるので、自分で分かりやすいものに変更することもできます。

コード以外にも、環境構築方法、実行方法なども書いてくれました。
![スクリーンショット 2024-11-13 0.52.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/72db7804-3e40-cafa-3883-505767a3ae32.png)

# ローカルで試してみる
教えてもらった通りにPythonの仮想環境であるvenvを利用し、pip installでライブラリをインストール。
今回は、実行コマンドにあった「moon_position.py」という名前でスクリプトを保存しました。

いざ、実行します！
```
$ python moon_position.py
月の方位角: 257.17 度
月の高度: 20.05 度
次の月の出: 2024/11/13 05:43:35
次の月の入り: 2024/11/12 17:44:43
次の南中時刻: 2024/11/13 12:14:45
月齢: 0.86
```

計算結果が出力されました！

合っているか、[こちらのサイト](https://keisan.casio.jp/exec/system/1239785915)で調べてみました。
以下は1時間おきのデータです。

```text
月の方位角：257.8255
月の高度：19.2816
```

おおよそ合ってますね！
スクリプトは実行した時点のデータなので、1時間おきのデータとは少しずれます。

かなり精度の高い計算ができているのではないでしょうか。

# ここからが大事
要件を伝え、スクリプトを書いてもらって、動きました。
でも大事なのは、ここからです。

## スクリプトを理解する
AIが書くコードは、ほとんどの場合、非常にシンプルです。
動かすだけだと学習にならないので、きちんと理解しましょう。

では、どのような方法で理解したらいいのでしょうか。

### コメントを書いてもらう
AIが書いたコードを貼り付けて、以下のプロンプトで依頼しましょう。

```text
ありがとう。

〜〜スクリプトを貼り付ける〜〜

このスクリプトを理解したいので、コメントをできるだけ細かく丁寧に書いて。
```

Before
![スクリーンショット 2024-11-13 1.23.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/3d53979c-cf32-bf30-7f7b-54cdca0c559d.png)

After
![スクリーンショット 2024-11-13 1.23.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/f2eeb36b-2a1e-b0e8-f30d-ed164c71864e.png)

コメントがあるか無いかで、全然違いますね。
これで一気に理解が深まります。

もし、コメントが理解しにくいな、と思ったら、プロンプトを以下のように変更してみましょう。

```text
ありがとう。

〜〜スクリプトを貼り付ける〜〜

このスクリプトを理解したいので、コメントをできるだけ細かく丁寧に書いて。
コメントは、プログラミング初心者向けに分かりやすく書いてください。
```

これをやると、かなり分かりやすく書いてくれます。

### デバッグログを仕込んでみる
あちこちにログを仕込むと、理解が深まります。
全体を理解するまでログを出してみましょう。

例えば、以下のようにすると observer の中身が分かります。
```
    # 観測地の設定
    observer = ephem.Observer()
    observer.lat = observer_latitude
    observer.lon = observer_longitude
    observer.elevation = observer_elevation
    observer.date = date or datetime.datetime.utcnow()

    # デバッグログ
    print(observer)    
```

デバッグログの出力結果
```text
<ephem.Observer date='2024/11/12 16:50:51' epoch='2000/1/1 12:00:00' lon='139:45:36.0' lat='35:41:24.0' elevation=0.0m horizon=0:00:00.0 temp=15.0C pressure=1010.0mBar>
```

### よく分からないロジックはAIに聞いてみる
例えば、よく分からない箇所のコードを貼って、

```text
observer.next_rising(ephem.Moon())

このロジックがよく分からないから教えて
```

と聞くと、何度でも教えてくれます。

### カスタマイズしてみる
ある程度理解できたら、今度はカスタマイズしてみましょう。
今回作ったスクリプトでは、東京の緯度と経度を設定したので、別の都市にしてみたり、1ヶ月後の位置も出力してみる等、色々とカスタマイズできます。

自分で手を入れた方が理解が深まるので、チャレンジしてみましょう。

### エラーの改修をしてもらう
今回は一発で動きましたが、エラーが発生することもあります。
そんなときは、エラーログや該当行のコードを貼り付けて解決を依頼してみましょう。

エラー画面のスクショも認識してくれるので、先輩にお願いするのと同じように、渡せる情報は全て渡してみましょう。（秘匿情報は除く）

# その他
Geminiのスレッドは、編集、削除、リトライができます。
不要なものは削除したり、プロンプトを修正してリトライする等、有効に使いましょう。

# さいごに
今回は、AIを活用した学習方法について、一部をお伝えしました。
AIの活用方法は、まだまだあります。そして、常に進化を続けてます。

学習で活用できたら業務でも活用できるようになるので、
職場で定められたルールを守りながら、効率化を目指しましょう！