/explain 生成AIに説明するさせる7つのテクニック
はじめに
少し難易度の高い技術書を読むときに、サンプルコードがなかなか理解できずに困ることはありませんか? 時間を溶かしてしまったり、よく分からないまま先に進んでしまったりすることはないでしょうか。最悪の場合、離脱してしまったという経験があるかもしれません。
生成AIの力を借りましょう。
LLMの最も得意なタスクの一つは、何かを説明することです。生成AIを活用することでより効率よく、効果的な学習が可能となります。
この記事では、生成AIにコードをうまく説明させるための7つのテクニックをご紹介します。
本稿では書籍『なっとく!並行処理プログラミング』のGitHubリポジトリで公開されているサンプルコードを生成AIに説明させています。
1. GitHub Copilotに課金する
GitHub社の回し者ではないのですが、GitHub Copilotを課金して利用することをお勧めします。個人向けのCopilot Individualプランならば月額10USDです。1ヶ月の試用期間は無料で利用可能です。
すでにChatGPTやClaudeなどのAIチャットサービス、Cursorなどの生成AIエディタを利用している方にとっても併用する価値があります。なぜかというと、GitHubのWebサイト上で直接Copilotとチャットができるからです。
最近の技術書のサンプルコードはGitHubに公開して提供されていることが多いです。もちろんローカルにクローンしてしまえばCursor等を使って質問することもできます。ですが、ちょっとした質問程度であればブラウザから気軽に行えるのは大変便利なものです。
2. GitHub上で説明させる
ではGitHub上でCopilotに説明させる際のポイントを確認しましょう。
GitHub Copilotを購読している場合、いろいろな場所にCopilotのアイコンが表示されワンクリックでチャットを開始できます。ファイル全体を説明させることもできますし、次の画像のように選択したシンボル(クラスや関数など)を説明させることも可能です。
[Explain]を選ぶとすぐに説明が始まりますが、日本語で回答してほしい場合は、[Attach to current thread]で一度チャットに添付します。その上で日本語で説明を求めれば、回答も日本語で返ってきます。
リポジトリにインデックスを貼ることで精度が上がるという提案が表示さることがありますが注意してください。Individualプランだと上限が5つである上、一度作成したインデックスは簡単に削除できないようです。
複数のファイルをチャットに添付してコンテキストに含めることも可能です。
3. 処理過程を説明させる
生成AIの説明によって概要は把握できたものの、詳細レベルでプログラムを深く理解できていないということがあります。そのような場合、一般化されたコードとして見るだけではなく、具体的な値レベルで処理を追うと理解の手助けとなります。UMLのクラス図だけでなく、実例(インスタンス)ベースで描いたオブジェクト図があった方が理解が進むのと同じです。
プロンプトの例は以下です。
処理内容を説明してください。
具体値を使って処理過程を示し、わかりやすく説明してください。
以下のように具体的でわかりやすい説明をしてくれました。
4. AIコードエディタで説明させる
テクニック4から6までは、AIコードエディタの機能を使ったテクニックです。
ローカル環境でAIコードエディタを使うと、生成AIはプロジェクトに対して作成されたインデックスを利用して回答を行うことができます。必要な情報を選んでコンテキストに含めることで、よりユーザーのニーズに沿った役に立つ回答を出しやすくなるのです。
たとえば、以下のようなプロンプトを入力します。
asynchronous_pizza フォルダ配下の.pyファイルについて、依存関係を解析してください。
結果はmermaid形式で図にしてください。
すると、対象フォルダ配下のファイルを検索し、コンテキストに含めた上で図を作成してくれます。
.mdファイルに貼り付けてプレビューするときちんと図が表示されました。
5. 擬人化して説明させる
振る舞いを実現するプログラム要素の数が多いと、全体像の把握や個々の要素の処理理解が難しいですね。そのような場合には擬人化のテクニックを使ってみるとよいかもしれません。
以下のようなプロンプトを入力します。
プログラム中の以下の要素を擬人化して、それぞれに自分の仕事を説明させてください。
以下のように、登場するプログラム要素を擬人化して解説をしてくれます。このようにしてまずは全体像を把握すると理解が促進するでしょう。
6. ログを出力して説明させる
プログラムの処理を追うには、デバッガーを用いてステップ実行すると便利です。ですが、デバック実行で迷子になることはありませんか? 人間の短期記憶容量は限られているため、処理をあちこち移動するうちに混乱してしまうのです。
そんなときは昔ながらのデバッグログ出力が役に立ちます。
処理の流れを追いやすくするために、printによるデバッグログ出力を追加してください。
プロンプトで指示を出すと、コード修正提案をしてくれるので受け入れます。
プログラムの実行方法も、生成AIに聞けば教えてくれます。コマンドもそのまま統合ターミナルに貼り付けられるので便利ですね。
以下はターミナルに出力された実際のログです。
EventLoop initialized
Starting up at: ('127.0.0.1', 12345)
Server listening for incoming connections
Registered reader: ('127.0.0.1', 12345) with event: 1
Connected to ('127.0.0.1', 54758)
Registered reader: ('127.0.0.1', 12345) with event: 1
Registered reader: ('127.0.0.1', 12345) with event: 1
ログとコードを突き合わせて処理を追ってもいいのですが、せっかくですので生成AIにもうひと仕事やってもらいましょう。
#terminalSelection ログ出力情報を元に、プログラムの処理の流れを分析して
mermaid形式のシーケンス図にしてください。
シーケンス図ができました。
7. AIチャットサービスにしっかり説明させる
最後のテクニックは、AIチャットサービスを使った方法です。この記事ではClaudeを使います。
Claudeでは、最近のアップデートによって回答のスタイルを選択できるようになりました。プリセットの「Explanatory」を指定すると、結構しっかりとした回答を生成してくれます。
ここでは、ブログ記事風にコードを説明してくれるようにカスタマイズするテクニックをご紹介します。
Claudeでは、Project機能を使うとカスタム指示を設定することができます。(カスタム指示の他に、ナレッジを登録してRAGに使うことも可能)。
以下のようなカスタム指示を登録します。
<Role>
あなたはプログラミングに精通した専門家として、ユーザーがコードリーディングを行うのを支援します。
</Role>
<Instruction>
- ユーザーがソースコードを貼り付けて解説を求めたら、ユーザーが理解しやすいように丁寧に解説をしてください。
- ユーザーは対象の言語やフレームワークの初学者であることを想定して回答してください。
- ユーザーの追加質問に対しては、それまでのやり取りを十分考慮して適切なフォローをしてください。
</Instruction>
<Format>
- マークダウン形式
- 前置きの文章は不要。本題から入る
- 技術ブログ記事のようなスタイルでわかりやすく解説する
- トピックごとに見出しを入れること
- 理解促進のためクラス図やシーケンス図などのダイアグラムを必要に応じて活用する
- 具体例や実行例を盛り込む
- トリッキーな実装や複雑な処理については、より詳しく解説をする
- 言語やフレームワーク特有の仕様や機能について補足する
- つまずきそうなポイントや学習のヒントなどをフォローアップとして回答の最後に提示する
</Format>
チャット欄にコードを貼って、説明を求めます。
以下のようにブログ記事風の説明をしてくれました(長いため、冒頭部分のみです)。
全文はGistにアップロードしたのでそちらをご参照ください。
まとめ
生成AI(LLM)はコードリーディング力や説明力に長けています。うまく活用することで、効率的・効果的な学習が可能となるでしょう。
参考情報
本稿で生成AIに説明させるコードには、書籍『なっとく!並行処理プログラミング』のサンプルコードを利用させて頂きました。
題材が並行処理ということで、読み応えのある本です。感想をnoteにまとめたので気になる方はチェックしてくだい。
Discussion