💎

RubyからGemini(1.5 Pro)を利用する

2024/08/21に公開

Google Cloud Vertex AIのGemini APIをRuby(on Rails)から使うメモ。

前提

  • Ruby 3.3.3
  • Google CloudプロジェクトマネコンよりVertex AI GeminiのAPIを有効化していること
  • Gemini 1.5 Proを利用する

RubyからGeminiのAPIを叩く

SDKはない

https://ai.google.dev/gemini-api/docs/quickstart?hl=ja&lang=android

チュートリアルを見る限り、RubyのSDKは存在しないと思われる。

そのため、SDKを介さずにAPIリクエストを組み立てる。

https://console.cloud.google.com/vertex-ai/publishers/google/model-garden/gemini-1.5-pro-001

上記に次のようなHTTPリクエストする例が載っているため参考にする。

MODEL_ID="gemini-1.5-pro-001"
PROJECT_ID="YOUR_PROJECT_ID"

curl \
  -X POST \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json" \
  https://us-central1-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/us-central1/publishers/google/models/${MODEL_ID}:streamGenerateContent -d \
  $'{
    "contents": {
      "role": "user",
      "parts": [
        {
        "fileData": {
          "mimeType": "image/png",
          "fileUri": "gs://generativeai-downloads/images/scones.jpg"
          }
        },
        {
          "text": "Describe this picture."
        }
      ]
    }
  }'

クレデンシャルの取得

今回はアクセストークンの取得にアプリケーションデフォルトクレデンシャル(ADC)を使用する。

ローカル環境なら、

gcloud auth application-default login

でADCをセットできる。

リージョン

Geminiは東京リージョン( asia-northeast1 )を使うことができる。

パラメータ

渡せるパラメータは次に掲載されている。

https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/inference?hl=ja

よく使いそうなのは

  • max_output_token
  • temperature

また、 response_mime_type: "application/json" を指定することでJSON出力にできるので、これも押さえておくとよさそう。

コード

以上より、以下のRubyコードでGemini 1.5 ProのAPIを叩くことができた。

PROJECT_ID = "your-project-id"
LOCATION = "asia-northeast1".freeze
MODEL = "gemini-1.5-pro-001".freeze
API_URL = "https://#{LOCATION}-aiplatform.googleapis.com/v1/projects/#{PROJECT_ID}/locations/#{LOCATION}/publishers/google/models/#{MODEL}:generateContent".freeze
TEMPERATURE = 0.0
MAX_TOKENS = 512

# アクセストークンの取得にADC(アプリケーションデフォルトクレデンシャル)を使用
credentials = Google::Auth.get_application_default
access_token = credentials.fetch_access_token!["access_token"]

uri = URI(API_URL)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri.request_uri)
request["Authorization"] = "Bearer #{access_token}"
request["Content-Type"] = "application/json; charset=utf-8"

request.body = {
  contents: {
    role: "user",
    parts: [
      {
        text: "こんにちは"
      }
    ],
  },
  generation_config: {
    temperature: TEMPERATURE,
    max_output_tokens: MAX_TOKENS,
    response_mime_type: "application/json" # JSON
  }
}.to_json
response = http.request(request)

if response.code.to_i >= 400
  raise "HTTP Request failed with status code: #{response.code} body: #{response.body}"
end

parsed_body = JSON.parse(response.body)
puts parsed_body["candidates"][0]["content"]["parts"][0]["text"]

参考

https://console.cloud.google.com/vertex-ai/publishers/google/model-garden/gemini-1.5-pro-001

https://console.cloud.google.com/vertex-ai/publishers/google/model-garden/gemini-1.5-flash-001

https://note.com/npaka/n/n0852d542fd43

https://ai.google.dev/gemini-api/docs/json-mode?hl=ja&lang=python

https://ai.google.dev/api/generate-content?hl=ja

https://zenn.dev/tomiyan/articles/a84f8f521b1d3d

Discussion