🗒️

Gemini APIのメモ(REST API利用)

2024/04/30に公開

Gemini APIのREST APIを触ってみた。自分用にメモ。

ドキュメント

API利用方法

VS CodeのREST Clientを利用したので、その際の記述を記載していきます。
{{apikey}}には、APIキーが入ります。

モデル一覧を取得する

APIで利用する際のモデル名やトークンの制限、利用できるメソッドが取得できます。

GET https://generativelanguage.googleapis.com/v1beta/models?key={{apikey}}
Content-Type: application/json
レスポンス
resonse
{
  "models": [
    {
      "name": "models/gemini-1.5-pro-latest",
      "version": "001",
      "displayName": "Gemini 1.5 Pro",
      "description": "Mid-size multimodal model that supports up to 1 million tokens",
      "inputTokenLimit": 1048576,
      "outputTokenLimit": 8192,
      "supportedGenerationMethods": [
        "generateContent",
        "countTokens"
      ],
      "temperature": 1,
      "topP": 0.95
    },...
}

Gemini 1.5 Proを利用する

まずはシンプルに

POST https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?key={{apikey}}
Content-Type: application/json

{
  "contents": [{
    "parts":[{
      "text": "こんにちは"
    }],
  }]
}
レスポンス
resonse
{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "こんにちは! 😊\n\n今日はどうされましたか? \n"
          }
        ],
        "role": "model"
      },
      "finishReason": "STOP",
      "index": 0,
      "safetyRatings": [
        {
          "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"
        }
      ]
    }
  ]
}

役割を指定する

ChatGPTでいうところのrole=systemをプロンプトとは別に指定することができます。
この機能は1.5から利用できます。 systemInstructionで役割を定義することができます。
URLは同じなので、JSONのみを記載します。

request
{
  "contents": [{
    "parts":[{
      "text": "東京都新宿区大京町22-1 グランファースト新宿御苑3F/4F"
    }],
    "role": "user"
  }],
  "systemInstruction": {
    "parts":[{
      "text": "与えられた住所を、都道府県、市区町村、番地、建物名の4つに分解してください。"
    }],
    "role": "model"
  }
}
レスポンス
resonse
{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "都道府県:東京都\n市区町村:新宿区\n番地:大京町22-1\n建物名:グランファースト新宿御苑3F/4F \n"
          }
        ],
        "role": "model"
      },
      "finishReason": "STOP",
      "index": 0,
      "safetyRatings": [
        {
          "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"
        }
      ]
    }
  ]
}

レスポンスのJSONフォーマットを指定する

response_mime_type を利用することでレスポンスのJSONの形式を指定することができます。
https://ai.google.dev/gemini-api/docs/api-overview?hl=ja#json

同じように住所分割してもらいますが、以下のようなJSONで出力してもらいましょう。

{
  "都道府県": "東京都",
  "市区町村": "新宿区",
  "番地"   : "大京町22-1",
  "建物名": "グランファースト新宿御苑3F/4F"
}

JSONスキーマを以下のように定義します。

スキーマ
{
  "type": "object",
  "properties": {
    "都道府県": {
      "type": "string"
    },
    "市区町村": {
      "type": "string"
    },
    "番地": {
      "type": "string"
    },
    "建物名": {
      "type": "string"
    }
  }
}

あとは、これをsystemInstruction内に記述し、generationConfig内にJSON形式でレスポンスするように指定します。具体的には以下のようになります。

request
{
  "contents": [{
    "parts":[{
      "text": "東京都新宿区大京町22-1 グランファースト新宿御苑3F/4F"
    }],
    "role": "user"
  }],
  "systemInstruction": {
    "parts":[{
      "text": "与えられた住所を、都道府県、市区町村、番地、建物名の4つに分解してください。次のJSON Schemaで出力してください。{\"type\":\"object\",\"properties\":{\"都道府県\":{\"type\":\"string\"},\"市区町村\":{\"type\":\"string\"},\"番地\":{\"type\":\"string\"},\"建物名\":{\"type\":\"string\"}}}"
    }],
    "role": "model"
  },
  "generationConfig": {
    "responseMimeType": "application/json"
  }
}

意図した形でデータが生成されています。

レスポンス
resonse
{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "{\"都道府県\":\"東京都\",\"市区町村\":\"新宿区\",\"番地\":\"大京町22-1\",\"建物名\":\"グランファースト新宿御苑3F/4F\"}\n\n"
          }
        ],
        "role": "model"
      },
      "finishReason": "STOP",
      "index": 0,
      "safetyRatings": [
        {
          "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"
        }
      ]
    }
  ]
}

まとめ

  • Gemini APIで役割をプロンプトとは別に指定することができる
    • promptとは別になるので、役割の定義についてはトークンのカウントに入らなそう。(トークンの節約になる
  • レスポンスのJSONのフォーマットを指定することで、その後の処理で扱いやすくなる

Discussion