Python Tips: Google Gemini で Python コードを実行したい

2024 年 7 月 27 日にリリースされていた Google Gemini のコード実行( code execution )機能の使い方をかんたんにまとめました。

コード実行機能とは?

Gemini API のコード実行機能とは、 LLM モデルが Python コードを生成・実行し、実行結果から繰り返し学習して最終結果を得られる機能です。

The Gemini API code execution feature enables the model to generate and run Python code and learn iteratively from the results until it arrives at a final output. You can use this code execution capability to build applications that benefit from code-based reasoning and that produce text output. For example, you could use code execution in an application that solves equations or processes text.

OpenAI GPT モデルの Code Interpreter の Gemini 版という捉え方をするとわかりやすいかもしれません。

Function calling とコード実行機能の違いは、 Function calling がユーザー側で関数を用意して実行するのに対し、コード実行はモデル側でコードを用意して実行してくれることです。

機能 コード生成主体 コード実行主体
Function calling ユーザー ユーザー
コード実行 LLM LLM

課金と制約について公式ドキュメンテーションには以下のように書かれています(意訳)。

課金

  • コード実行に別途料金はかからない(入出力トークンにのみ課金される)

制約

  • テキストの処理のみ可。ファイル入出力は不可。
  • タイムアウトは 30 秒
  • コード実行を有効にすると別の領域での出力でリグレッションが起こる場合がある
  • モデルによって( Gemini 1.5 Pro か Flash かで)コード実行に成功する能力には差がある

なお、ライブラリは NumPy と SymPy がプリインストールされていますが、追加のインストールはできません。 また、外部への HTTP リクエストなども行えません。

以下サンプルを使って使い方を説明します。

前提

  • Python >=3.12
  • Gemini API キーを取得済み

準備

venv を作って PyPI パッケージ google-generativeaiclick をインストールします。

# venv を作成して有効化:
python -m venv .venv
. .venv/bin/activate

# `google-generativeai` と `click` をインストール:
pip install 'google-generativeai~=0.8.2' 'click~=8.1' 

click は CLI 作成をかんたんにするためだけにインストールするものです。

スクリプト作成

スクリプトを作成します。 名前は何でもよいですが仮に main.py とします。

main.py:

"""Gemini 1.5 のコード実行( code execution )機能を使う"""
import os
import sys

import click
import google.generativeai as genai

MODEL_NAME = "gemini-1.5-pro-002"
SYSTEM_INSTRUCTION = """
Generate and run code to answer questions. Respond in Japanese.
""".strip()


@click.command()
@click.argument("message", required=True)
def main(message: str):
    api_key = os.getenv("GEMINI_API_KEY")
    if not api_key:
        sys.exit("Environment variable `GEMINI_API_KEY` not set.")

    genai.configure(api_key=api_key)

    model = genai.GenerativeModel(
        model_name=MODEL_NAME,
        tools="code_execution",
        system_instruction=SYSTEM_INSTRUCTION,
    )

    response = model.generate_content(message)

    print(response.text)


if __name__ == "__main__":
    main()

コード実行機能を使うには GenerativeModel のインスタンス生成時に tools="code_execution" を渡せば OK です。 tools の指定は、次のような感じでリクエスト作成時に行うことも可能です。

# ワンショットのリクエスト:
response = model.generate_content(message, tools="code_execution")
print(response.text)

# チャットでのリクエスト:
chat = model.start_chat()
response = chat.send_message(message, tools="code_execution")
print(response.text)

実行

環境変数 GEMINI_API_KEY に API キーをセットした上でスクリプトを実行します。

# 環境変数に API キーをセット:
export GEMINI_API_KEY=...

# スクリプトを実行:
python main.py '9.11 と 9.9 はどちらが大きいですか?'

出力サンプル:

9.11 と 9.9 のどちらが大きいかを判断するために、簡単な比較を行います。


``` python
print(9.11 > 9.9)
print(9.9 > 9.11)

```
```
False
True

```
最初の比較(9.11 > 9.9) は `False` を返し、二番目の比較 (9.9 > 9.11) は `True` を返しました。

よって、9.9 の方が 9.11 より大きいです。

答え:9.9 の方が大きいです。

別のプロンプトを試します。

main.py '32768 x 580 はいくらになりますか?'

出力サンプル:

計算してみます。


``` python
print(32768 * 580)

```
```
19005440

```
32768 × 580 = 19005440 です。

もう一つ別のプロンプトを試します。

python main.py "How many 'r's in 'strawberry'?"
質問は「'strawberry' には何個の 'r' が含まれていますか?」ですね。


``` python
word = "strawberry"
count = word.count('r')
print(f'{count=}')

```
```
count=3

```
'strawberry' には 3 つの 'r' が含まれています。

いい感じに実行できました。

私が手元で確認したかぎり、次のようなメッセージを system_instruction に含めておくと、使える場面では極力コード実行を使ってくれました。

Generate and run code to answer questions.

参考