前回のあらすじ
前回は、大学院の講義で学生に配布するための「実習用チャットボット(Liteモデル)」を作りました。
おかげさまで、学生数十人が一斉に使ってもAPI利用料は100円もかからないという、驚異的なコストパフォーマンスで実習を乗り切ることができました。
今回の目的:自分専用の「相棒」を作る
学生用の環境は整いましたが、今度は「教員(自分)用」の環境が欲しくなりました。実習用の「Lite」モデルは安くて良いのですが、研究のアイデア出しや、少し複雑なプログラミングの相談をするには、もう少し「知能」と「速度」のバランスが良いモデルを使いたいところです。そこで今回は、Googleの最新標準モデルである Gemini 2.5 Flash を使用し、自分専用のチャットボットを作成します。
なぜ Gemini 2.5 Flash なのか?
現在、Geminiには主に以下のラインナップがあります。
- Flash Lite(前回使用):圧倒的安さ。実習や単純タスク向け。
- Flash(今回使用):速度・知能・コストのバランスが最強。普段使いの決定版。
- Pro:複雑な推論向け。コストは高め。
自分専用のツールとして使うなら、Flash 一択です。レスポンスが爆速で、ストレスが全くありません。
作成するコード
前回と異なり、今回は最新のライブラリ(google-genai)を使用した、よりモダンでシンプルな書き方を採用します。
手順:
- Google Colabを開く
- APIキーをシークレット(鍵アイコン)に MY_API_KEY として登録
- 以下のコードを実行
# === 1. Simple (2.5 Flash) ===
# 最新のSDKを使用します
!pip install -q -U google-genai gradio
import gradio as gr
from google import genai
from google.colab import userdata
# APIキーの準備
api_key = userdata.get('MY_API_KEY')
if not api_key: raise RuntimeError("APIキーを設定してください")
client = genai.Client(api_key=api_key)
# モデル設定:バランス最高の「Flash」を選択
MODEL_NAME = "gemini-2.5-flash"
def chat(message, history):
chat_history = []
if history is None: history = []
# 1. 過去の会話履歴をGeminiが読める形式に変換
for entry in history:
if isinstance(entry, (list, tuple)):
u, a = entry
if u: chat_history.append(genai.types.Content(role="user", parts=[genai.types.Part.from_text(text=str(u))]))
if a: chat_history.append(genai.types.Content(role="model", parts=[genai.types.Part.from_text(text=str(a))]))
elif isinstance(entry, dict):
# Gradioのバージョンによる形式違いを吸収
role = "user" if entry["role"] == "user" else "model"
if entry["content"]:
chat_history.append(genai.types.Content(role=role, parts=[genai.types.Part.from_text(text=str(entry["content"]))]))
# 2. 今回の質問を追加
chat_history.append(genai.types.Content(role="user", parts=[genai.types.Part.from_text(text=message)]))
try:
# 3. Geminiに送信して回答を得る
response = client.models.generate_content(model=MODEL_NAME, contents=chat_history)
return response.text
except Exception as e:
return f"エラー: {e}"
# UIの起動
gr.ChatInterface(fn=chat, title="Gemini 2.5 Flash").launch(share=True)
技術的なポイント解説
- 新しいSDK google-genai
前回は互換性の高い google-generativeai (v1) を使いましたが、今回は最新の google-genai (v2) ライブラリを使用しています。
client = genai.Client(...) という書き方が特徴で、より直感的に書けるようになっています。 - 履歴(Context)の管理
AIは「記憶」を持っていません。そのため、チャットボットを作る際は「過去の会話履歴も全部まとめて毎回送信する」必要があります。
コードの中のこの部分がそれを行っています:
for entry in history:
# ... (ユーザーの発言とAIの発言を交互にリストに追加) ...
これがないと、AIは「さっきの話」を覚えてくれません。Gradio が管理している履歴(history)を、Geminiが理解できる形式(genai.types.Content)に変換して渡しています。
3. シンプルさの追求
今回は「自分用」なので、前回のLite版にあった「ストリーミング(文字がパラパラ出る演出)」は省き、コードの短さを優先しました。generate_content で一括で答えを受け取っています。
このシンプルさなら、何かエラーが起きてもどこが悪いかすぐに分かります。
まとめ
これで、高速に動作する自分専用のAIチャットボットが完成しました。
Colabは一定時間で接続が切れてしまいますが、このノートブックをブラウザのブックマークに入れておけばOKです。使いたい時に「再生ボタン」を1回押すだけで、数十秒で環境が立ち上がります。
研究の相談や翻訳など、Web版の制限や学習利用を気にせず、セキュアに使い倒せる環境が手に入りました。しかし、使っているうちに新たな欲求が出てきました。
「AIと議論した内容、すごく良いアイデアが出たのに、ブラウザを閉じると消えちゃうのが勿体ない……」
Web版のChatGPTなどには履歴機能がありますが、自作アプリだとColabを閉じた瞬間に会話が消えてしまいます。そこで次回は、このチャットボットに「自動ログ保存機能」を追加し、会話内容をCSVファイルとして蓄積する方法を紹介します。
【連載予定】
- 配布編:ColabとLiteモデルで実習環境をバラ撒く
- 基本編(今回):自分専用のGemini 2.5 Flashチャットを作る
- ログ収集・人格設定版編(今回):チャットの内容をCSVに裏でこっそり保存する。&人格設定編:システムプロンプトで「メンタルトレーナー」を作る**
ライセンス表記
本記事のコードはオープンソースです。授業や勉強会などで自由に改変・再配布してご活用ください。