Noz

オペレーションズリサーチ出身・田舎在住, データ分析・ツール作成

Geminiの出力形式をJSONに強制

中津市・八面山

背景

OCRの実装で列形式の出力に揃えたかったときに活用した。 OpenAIでいうJsonモードにあたるはず。 ChatGPTは激古、Gemini先生はやや古いバージョンを出力、解説記事も大体ちょい古いのでメモ。

実装のメイン

出力のスキーマはあらかじめ定義しておく。

response_schema = {
        "type": "object",
        "properties": {
            "items": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "date": {"type": "string"},
                        "debit": {"type": "string"},
                        "debit_amount": {"type": "integer"},
                    },
                    "required": ["date", "debit", "debit_amount"]
                }
            }
        },
        "required": ["items"]
    }

例えば以下のようにproperties"列名 : {"type" : "型名"}と設定する。

型名は以下で確認できる。

GenerativeModelでgenerate_contentを使うときに引数generation_config内で指定する

from vertexai.generative_models import GenerationConfig, GenerativeModel

model = GenerativeModel("gemini-1.5-flash")

response = model.generate_content(
   [prompt],
   generation_config=GenerationConfig(
       response_mime_type="application/json", response_schema=response_schema
   )
)

お勉強した順

  1. Gemini API を使用して構造化された出力を生成する  |  Google AI for Developers
  2. GenerationConfig | Google AI for Developers
  3. スキーマ | Google AI for Developers

補足

画像入れるならImageを定義しておいて、promptの隣に含める

from vertexai.generative_models import GenerationConfig, GenerativeModel

model = GenerativeModel("gemini-1.5-flash")

image = Image.load_from_file(image_path)

response = model.generate_content(
   [images, prompt],
   generation_config=GenerationConfig(
       response_mime_type="application/json", response_schema=response_schema
   )
)