0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

5分で構築!Gemini 2.5 Flashを使った自分専用「爆速AIチャットボット」の作り方【その2:基本編】

Last updated at Posted at 2025-12-08

前回のあらすじ
前回は、大学院の講義で学生に配布するための「実習用チャットボット(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 として登録
  • 以下のコードを実行
gemini_simple_flash.py
# === 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)

技術的なポイント解説

  1. 新しいSDK google-genai
    前回は互換性の高い google-generativeai (v1) を使いましたが、今回は最新の google-genai (v2) ライブラリを使用しています。
    client = genai.Client(...) という書き方が特徴で、より直感的に書けるようになっています。
  2. 履歴(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に裏でこっそり保存する。&人格設定編:システムプロンプトで「メンタルトレーナー」を作る**

ライセンス表記
本記事のコードはオープンソースです。授業や勉強会などで自由に改変・再配布してご活用ください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?