本サイトはアフィリエイト広告を利用しています

Gemini APIを利用してWeb UIのチャットBOTを作成してみる

背景

前回はGemini APIをpythonで制御することができるようになりました。今回はWeb UIのチャットBOTを作成に挑戦します。

前回の記事はこちら。

Chainlitをインストール

まず、以下コマンドでChainlitをインストールします。

$pip install chainlit

Chainlitを制御するpythonスクリプトを実装

ソースコードはこちらです。

import os
import google.generativeai as genai
import chainlit as cl

# Google Gemini APIの設定
genai.configure(api_key=os.environ["GEMINI_API_KEY"])

# モデルの生成設定
generation_config = {
    "temperature": 1,
    "top_p": 0.95,
    "top_k": 64,
    "max_output_tokens": 8192,
    "response_mime_type": "text/plain",
}

# モデルの初期化
model = genai.GenerativeModel(
    model_name="gemini-1.5-flash",
    generation_config=generation_config,
    #system_instruction="あなたは優秀なアシスタントです"
)

# チャットセッションの開始
chat_session = model.start_chat(
  history=[]
)

@cl.on_message
async def on_message(message: cl.Message):
    user_message = message.content
    response = chat_session.send_message(user_message)

    # 応答からテキストを抽出するための処理
    if hasattr(response, '_done') and response._done:
        # 応答の詳細を表示して、構造を確認
        print(response)  # デバッグ用: 応答の構造を表示
        
        # _result 属性を使ってテキストを抽出
        if hasattr(response, '_result'):
            result = response._result
            candidates = result.candidates
            if candidates:
                content = candidates[0].content
                parts = content.parts
                if parts:
                    response_text = parts[0].text
                else:
                    response_text = "No text found in parts."
            else:
                response_text = "No candidates found."
        else:
            response_text = "No result found."
    else:
        response_text = "Response not done or incomplete."

    await cl.Message(content=response_text).send()

# Chainlitのアプリケーションを起動
if __name__ == "__main__":
    cl.run()

実行結果

実行結果はこちらです。

Web UIのチャットBOTができました!ついでにもう1つ質問してみます。

先ほどの質問内容(犬と猫の話)を覚えてくれています。

Gemini APIの応答内容について

ソースコードの中で、Gemini APIの応答を分析して本文のみを抽出しChainlitに渡すようにしています。

その応答内容は以下のような構造になっていました。

response:
GenerateContentResponse(
    done=True,
    iterator=None,
    result=protos.GenerateContentResponse({
      "candidates": [
        {
          "content": {
            "parts": [
              {
                "text": "\u72ac\u3068\u732b\u3001\u3069\u3061\u3089\u304c\u304a\u3059\u3059\u3081\u304b\u306f\u3001\u3042\u306a\u305f\u306e\u30e9\u30a4\u30d5\u30b9\u30bf\u30a4\u30eb\u3084\u6027\u683c\u3001\u597d\u307f\u306b\u3088\u3063\u3066\u5927\u304d\u304f\u5909\u308f\u308a\u307e\u3059\u3002\u3069\u3061\u3089\u304c\u826f\u3044\u304b\u4e00\u6982\u306b\u65ad\u8a00\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002\n\n\u72ac\u3068\u732b\u306e\u305d\u308c\u305e\u308c\u306e\u30e1\u30ea\u30c3\u30c8\u3068\u30c7\u30e1\u30ea\u30c3\u30c8\u3092\u6bd4\u8f03\u3057\u3066\u3001\u3042\u306a\u305f\u306b\u5408\u3063\u305f\u30da\u30c3\u30c8\u3092\u9078\u3093\u3067\u304f\u3060\u3055\u3044\u3002\n\n**\u72ac\u306e\u30e1\u30ea\u30c3\u30c8:**\n\n* **\u611b\u60c5\u6df1\u304f\u3001\u98fc\u3044\u4e3b\u3068\u5f37\u3044\u7d46\u3092\u7bc9\u304f:** \u72ac\u306f\u98fc\u3044\u4e3b\u3078\u306e\u611b\u60c5\u8868\u73fe\u304c\u8c4a\u304b\u3067\u3001\u5e38\u306b\u305d\u3070\u306b\u3044\u3066\u304f\u308c\u308b\u5b58\u5728\u3067\u3059\u3002\n* **\u904b\u52d5\u4e0d\u8db3\u89e3\u6d88\u306b\u5f79\u7acb\u3064:** \u72ac\u3068\u6563\u6b69\u3084\u904a\u3073\u3092\u3059\u308b\u3053\u3068\u3067\u3001\u98fc\u3044\u4e3b\u81ea\u8eab\u306e\u904b\u52d5\u4e0d\u8db3\u89e3\u6d88\u306b\u3082\u7e4b\u304c\u308a\u307e\u3059\u3002\n* **\u9632\u72af\u52b9\u679c\u304c\u3042\u308b:** \u72ac\u306e\u9cf4\u304d\u58f0\u306f\u9632\u72af\u52b9\u679c\u3082\u671f\u5f85\u3067\u304d\u307e\u3059\u3002\n* **\u5bb6\u65cf\u306e\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4fc3\u9032:** \u72ac\u3092\u4ecb\u3057\u3066\u5bb6\u65cf\u9593\u306e\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u304c\u5897\u3048\u308b\u3053\u3068\u3082\u671f\u5f85\u3067\u304d\u307e\u3059\u3002\n\n**\u72ac\u306e\u30c7\u30e1\u30ea\u30c3\u30c8:**\n\n* **\u4e16\u8a71\u306b\u6642\u9593\u304c\u304b\u304b\u308b:** \u72ac\u306f\u6563\u6b69\u3084\u98df\u4e8b\u3001\u30c8\u30a4\u30ec\u306e\u4e16\u8a71\u306a\u3069\u3001\u6bce\u65e5\u306e\u4e16\u8a71\u304c\u5fc5\u8981\u3067\u3059\u3002\n* **\u304a\u91d1\u304c\u304b\u304b\u308b:** \u98df\u4e8b\u4ee3\u3001\u533b\u7642\u8cbb\u3001\u30da\u30c3\u30c8\u7528\u54c1\u4ee3\u306a\u3069\u3001\u72ac\u3092\u98fc\u80b2\u3059\u308b\u306b\u306f\u305d\u308c\u306a\u308a\u306e\u304a\u91d1\u304c\u304b\u304b\u308a\u307e\u3059\u3002\n* **\u98fc\u80b2\u30b9\u30da\u30fc\u30b9\u304c\u5fc5\u8981:** \u72ac\u306f\u732b\u3088\u308a\u3082\u98fc\u80b2\u30b9\u30da\u30fc\u30b9\u3092\u5fc5\u8981\u3068\u3059\u308b\u5834\u5408\u304c\u591a\u3044\u3067\u3059\u3002\n* **\u3057\u3064\u3051\u304c\u5fc5\u8981:** \u72ac\u306f\u3057\u3064\u3051\u3092\u3057\u306a\u3051\u308c\u3070\u3001\u5420\u3048\u305f\u308a\u3001\u565b\u3093\u3060\u308a\u3059\u308b\u306a\u3069\u306e\u554f\u984c\u884c\u52d5\u3092\u8d77\u3053\u3059\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\n\n**\u732b\u306e\u30e1\u30ea\u30c3\u30c8:**\n\n* **\u4e16\u8a71\u304c\u6bd4\u8f03\u7684\u697d:** \u732b\u306f\u72ac\u3068\u6bd4\u3079\u3066\u4e16\u8a71\u304c\u6bd4\u8f03\u7684\u697d\u3067\u3001\u4e00\u4eba\u3067\u904e\u3054\u3059\u6642\u9593\u3082\u6bd4\u8f03\u7684\u9577\u3044\u306e\u3067\u3001\u5fd9\u3057\u3044\u4eba\u3067\u3082\u98fc\u80b2\u3057\u3084\u3059\u3044\u3067\u3059\u3002\n* **\u72ec\u7acb\u5fc3\u304c\u5f37\u304f\u3001\u98fc\u3044\u4e3b\u306e\u675f\u7e1b\u3092\u611f\u3058\u3055\u305b\u306a\u3044:** \u732b\u306f\u72ac\u3068\u6bd4\u3079\u3066\u72ec\u7acb\u5fc3\u304c\u5f37\u304f\u3001\u98fc\u3044\u4e3b\u306e\u675f\u7e1b\u3092\u611f\u3058\u3055\u305b\u306a\u3044\u305f\u3081\u3001\u81ea\u5206\u306e\u6642\u9593\u3092\u5927\u5207\u306b\u3057\u305f\u3044\u4eba\u306b\u5411\u3044\u3066\u3044\u307e\u3059\u3002\n* **\u7652\u3084\u3057\u52b9\u679c\u304c\u9ad8\u3044:** \u732b\u306e\u53ef\u611b\u3089\u3057\u3044\u59ff\u3084\u4ed5\u8349\u306f\u3001\u98fc\u3044\u4e3b\u306e\u5fc3\u3092\u7652\u3084\u3057\u3066\u304f\u308c\u307e\u3059\u3002\n* **\u98fc\u80b2\u30b9\u30da\u30fc\u30b9\u304c\u5c0f\u3055\u3044:** \u732b\u306f\u72ac\u3068\u6bd4\u3079\u3066\u98fc\u80b2\u30b9\u30da\u30fc\u30b9\u304c\u5c0f\u3055\u304f\u3066\u3082\u98fc\u80b2\u3067\u304d\u307e\u3059\u3002\n\n**\u732b\u306e\u30c7\u30e1\u30ea\u30c3\u30c8:**\n\n* **\u611b\u60c5\u8868\u73fe\u304c\u308f\u304b\u308a\u306b\u304f\u3044:** \u732b\u306f\u72ac\u3068\u6bd4\u3079\u3066\u611b\u60c5\u8868\u73fe\u304c\u308f\u304b\u308a\u306b\u304f\u3044\u305f\u3081\u3001\u98fc\u3044\u4e3b\u304b\u3089\u3059\u308b\u3068\u611b\u60c5\u3092\u611f\u3058\u306b\u304f\u3044\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002\n* **\u30c8\u30a4\u30ec\u306e\u3057\u3064\u3051\u304c\u96e3\u3057\u3044:** \u732b\u306f\u72ac\u3068\u6bd4\u3079\u3066\u30c8\u30a4\u30ec\u306e\u3057\u3064\u3051\u304c\u96e3\u3057\u3044\u5834\u5408\u304c\u3042\u308a\u3001\u30c8\u30a4\u30ec\u306e\u5931\u6557\u306b\u60a9\u307e\u3055\u308c\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002\n* **\u629c\u3051\u6bdb\u304c\u591a\u3044:** \u732b\u306f\u72ac\u3068\u6bd4\u3079\u3066\u629c\u3051\u6bdb\u304c\u591a\u3044\u306e\u3067\u3001\u6383\u9664\u304c\u5927\u5909\u3067\u3059\u3002\n* **\u591c\u884c\u6027:** \u732b\u306f\u591c\u884c\u6027\u306a\u306e\u3067\u3001\u591c\u306b\u9a12\u304c\u3057\u3044\u5834\u5408\u304c\u3042\u308a\u3001\u7761\u7720\u3092\u59a8\u3052\u3089\u308c\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\n\n**\u6700\u7d42\u7684\u306b\u306f\u3001\u3042\u306a\u305f\u81ea\u8eab\u306e\u30e9\u30a4\u30d5\u30b9\u30bf\u30a4\u30eb\u3084\u6027\u683c\u3001\u597d\u307f\u3092\u8003\u616e\u3057\u3066\u3001\u72ac\u3068\u732b\u3069\u3061\u3089\u304c\u3042\u306a\u305f\u306b\u5408\u3063\u3066\u3044\u308b\u304b\u3092\u5224\u65ad\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002**\n\n**\u72ac\u3068\u732b\u3069\u3061\u3089\u306b\u3059\u308b\u304b\u60a9\u3093\u3067\u3044\u308b\u5834\u5408\u306f\u3001\u4ee5\u4e0b\u306e\u8cea\u554f\u3092\u81ea\u5206\u306b\u554f\u3044\u304b\u3051\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002**\n\n* **\u3042\u306a\u305f\u306f\u3069\u306e\u304f\u3089\u3044\u306e\u6642\u9593\u3001\u30da\u30c3\u30c8\u306e\u4e16\u8a71\u306b\u8cbb\u3084\u305b\u308b\u304b\uff1f**\n* **\u3042\u306a\u305f\u306f\u3069\u306e\u304f\u3089\u3044\u306e\u30b9\u30da\u30fc\u30b9\u3092\u30da\u30c3\u30c8\u306e\u305f\u3081\u306b\u78ba\u4fdd\u3067\u304d\u308b\u304b\uff1f**\n* **\u3042\u306a\u305f\u306f\u30da\u30c3\u30c8\u306b\u3069\u3093\u306a\u6027\u683c\u3092\u6c42\u3081\u308b\u304b\uff1f**\n* **\u3042\u306a\u305f\u306f\u30da\u30c3\u30c8\u3068\u3069\u3093\u306a\u3053\u3068\u3092\u3057\u305f\u3044\u304b\uff1f**\n\n\u3053\u308c\u3089\u306e\u8cea\u554f\u306b\u7b54\u3048\u308b\u3053\u3068\u3067\u3001\u3042\u306a\u305f\u306b\u5408\u3063\u305f\u30da\u30c3\u30c8\u9078\u3073\u304c\u3067\u304d\u308b\u306f\u305a\u3067\u3059\u3002"
              }
            ],
            "role": "model"
          },
          "finish_reason": "STOP",
          "index": 0,
          "safety_ratings": [
            {
              "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
              "probability": "NEGLIGIBLE"
            },
            {
              "category": "HARM_CATEGORY_HATE_SPEECH",
              "probability": "NEGLIGIBLE"
            },
            {
              "category": "HARM_CATEGORY_HARASSMENT",
              "probability": "NEGLIGIBLE"
            },
            {
              "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
              "probability": "NEGLIGIBLE"
            }
          ]
        }
      ],
      "usage_metadata": {
        "prompt_token_count": 12,
        "candidates_token_count": 650,
        "total_token_count": 662
      }
    }),
)

“text”:の部分を抽出した形です。

2 COMMENTS

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です