LoginSignup
5
0

みなさんGemini使ってますか?

入力トークンが100万トークンを入れられるGemini-1.5-flashやGemini-1.5-pro、しかもGPT-4に比べて安価に使えるということで最近Googleの渾身のLLM・Geminiを重宝しています。GPT-3.5をファインチューニングするよりも入力トークンにデータを乗っけてしまった方が精度が良くなったという経験もあり、入力トークンが大きいモデルを最近は使っています。

GeminiをVertex AIで使う場合は、ユーザーの入力を学習データには利用しない旨が書かれているので、安心して利用できます。

gradioとは

機械学習モデルのアプリを公開・シェアするのに便利なwebインターフェースを作成します。デモアプリを作るのに便利です。ChatInterfaceというものがあり、数行のコードで、チャット画面(Retry/Undo/Clearボタン付き)を立ち上げることができます。

今回紹介するプログラムの特徴

ストリーミング対応・会話履歴ありというプログラムになっています。ストリーミング対応なので、長い出力を待たなくて良いし、会話履歴を保持しているため、「続きを生成」することも可能です。手元でパッとGeminiのテキスト生成を試したい時に便利です。

コードを動かす前に実行するコマンド

GCPのプロジェクトを先に作成して、課金方法を設定しておいてください。
Vertex AIはAPIの認証にGoogle Cloudサービスアカウントを使用するので、以下のコマンドを実行して認証を通します。

pip install gradio
pip install --upgrade google-cloud-aiplatform
gcloud auth application-default login

コードの紹介

認証が終わったら以下のコードをコピペして実行してください。

import gradio as gr
import vertexai
from vertexai.generative_models import GenerativeModel, Part, Content
import vertexai.preview.generative_models as generative_models

# モデルを定義する関数
def create_vertex_ai_client(model_name):
    vertexai.init(project="<プロジェクトIDを入力>", location="asia-northeast1")
    system_prompt = "あなたはアシスタントAIです。"
    generation_config = {
        "max_output_tokens": 8192,
        "temperature": 1.0,
        "top_p": 0.95,
        "top_k": 20,
    }

    safety_settings = {
        generative_models.HarmCategory.HARM_CATEGORY_HATE_SPEECH: generative_models.HarmBlockThreshold.BLOCK_NONE,
        generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: generative_models.HarmBlockThreshold.BLOCK_NONE,
        generative_models.HarmCategory.HARM_CATEGORY_HARASSMENT: generative_models.HarmBlockThreshold.BLOCK_NONE,
        generative_models.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: generative_models.HarmBlockThreshold.BLOCK_NONE,
        generative_models.HarmCategory.HARM_CATEGORY_UNSPECIFIED: generative_models.HarmBlockThreshold.BLOCK_NONE,
    }

    model = GenerativeModel(
        model_name=model_name,
        system_instruction=[system_prompt],
        generation_config=generation_config,
        safety_settings=safety_settings,
    )

    return model

# チャットの応答を取得する関数、会話の履歴も送信する
def get_chat_response_vertex_ai(model, input, history):
    gemini_history = []
    for row in history:
        input_from_user = Part.from_text(row[0])
        input_from_model = Part.from_text(row[1])

        gemini_history.append(Content(role="user", parts=[input_from_user]))
        gemini_history.append(Content(role="model", parts=[input_from_model]))
    
    chat = model.start_chat(history=gemini_history)
    try:
        responses = chat.send_message(input ,stream=True)
        for response in responses:
            yield response.text
    except Exception as e:
        print(f"Error: {e}")
        yield ""

# チャットの応答をストリーミングする関数
def stream_response(input, history, model_name):
    if input is not None:
        partial_message = ""
        model = create_vertex_ai_client(model_name)
        for response in get_chat_response_vertex_ai(model, input, history):
            partial_message += response
            yield partial_message 

css ="""
.contain { display: flex; flex-direction: column; }
.gradio-container { height: 100vh !important; }
#component-0 { height: 100%; }
#chatbot { flex-grow: 1; overflow: auto;}
"""

# チャットインターフェースを作成
with gr.Blocks(css=css) as demo:
    chatbot = gr.ChatInterface(
        stream_response,
        additional_inputs=[
            gr.Radio(["gemini-1.5-flash-preview-0514", "gemini-1.5-pro-preview-0514"], value="gemini-1.5-pro-preview-0514" ,label="model_name", info="モデルを選択"),
        ],
    )
    
demo.queue().launch(debug=True)

実行結果

スクリーンショット 2024-05-22 14.45.13.png

このようにモデルを選択するラジオボタンと、チャットインターフェースが表示されます。
会話履歴を送信するのでしりとりも可能です。

Geminiの微妙なところ

実際に長文の生成で使っているのですが、セーフティーフィルターが邪魔をする時があります。

こちらのようになんでもない文字列なのにフィルターにかかってしまって、テキストの生成がストップすることに悩まされています。早く解決してほしいところです。

まとめ

以上、Gemini-1.5-flashとproを動かすgradioサンプルコードの紹介でした。
このようにAIを使った記事を月1回は書いていますので、フォロー・いいねよろしくお願いいたします。

過去記事

5
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
5
0