Gemini APIのパラメータについて詳しく解説【Next.js】

開発

はじめに

Geminiとは、Googleの開発した生成AIです。
2024年3月現在、GeminiのAPIは無料で使用することができます。
APIを使う上で、AIの性格?のようなものをパラメータで変更することが可能です。
各パラメータについて、その変更方法について解説していきます。
基本的にこちらの公式ドキュメントを参考にしています。

Next.jsの環境やGeminiの基本的な使用まではできているものとして解説します。
もし、Next.jsの環境構築や、Geminiの使用方法について知りたい場合は過去の記事を参考にしてください。

Gemini APIのパラメータ

Geminiの使い方について簡単におさらい

以下のコマンドでGeminiのライブラリをインストール

npm install @google/generative-ai --save

.env.localなどにAPIキーを記述し、以下のようにAPIエンドポイントを作成する。

import { GoogleGenerativeAI } from "@google/generative-ai";
import { NextResponse } from "next/server";

export async function POST(req: Request) {
    const { prompt_post } = await req.json();
    const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY || '');

    const model = genAI.getGenerativeModel({ model: "gemini-pro"});

    const result = await model.generateContentStream({contents:[{role:'USER',parts:[{text:prompt_post}]}],generationConfig:{temperature:1,topP:1,topK:40},});
    const response = await result.response


    return NextResponse.json({
        message: response.text()
    })
}

以下のようにプロンプトをfetchで投げてあげれば使用可能です。

const response = await fetch('/api/gemini-api-vision', {
        method: 'POST',
        headers: {
        'Content-Type': 'application/json',
        },
        body: JSON.stringify({ prompt_post:prompt }),
    });

と、ここまでが簡単な使い方になります。
実際に上のプログラムの場合、

const result = await model.generateContentStream({contents:[{role:'USER',parts:[{text:prompt_post}]}],generationConfig:{temperature:1,topP:1,topK:40},});

ここでパラメータを指定しています。
このパラメータの細かい使い方や指定の方法についてまとめます。

Gemini APIのパタメータ

それでは、チューニング用のパラメータについて解説します。
わかりやすいように実際の構造に則して記載し、色分けしました。

パラメータ詳細
contentsテキストや画像、動画などのコンテンツ
roleテキストがユーザ側の入力か、AIの返答かの区別をします。
USER:ユーザ  MODEL:AIの返答
partテキストなどのデータを格納
textAIに投げるプロンプト
inlineData画像または動画のシリアル化されたデータ(1個まで)
mimeType入力する画像や動画の拡張子(例:image/png)
database64エンコードされた画像または動画
fileData画像または動画のシリアル化されたデータ(16個まで)
mimeType入力する画像や動画の拡張子(例:image/png)
fileUriプロンプトに含める画像または動画の Cloud Storage URI
videoMetadata動画のメタデータ、省略可能
startOffset開始時間
seconds開始時間の秒。整数で指定
nanos開始時間のnano秒?(使用したことないので不明・・・
endOffset
seconds終了時間の秒。整数で指定
nanos終了時間のnano秒?(使用したことないので不明・・・)
tools外部ツールの呼び出し
functionDeclarations関数の詳細
name関数の名前(先頭は英字またはアンダースコア)
description関数の説明
parameters関数のパラメータ(記述方法はこちらを参照)
safetySettingsコンテンツの安全性のパラメータ
category安全性カテゴリ1(危険なコンテンツを出力しない)
threshold危険なコンテンツをどの程度ブロックするか2
generationConfigAIのレスポンスのパラメータ(性格のようなもの)
temperatureレスポンスのランダム性
範囲:確定的 0.0〜1.0 ランダム
topP上位何%のワードから選択するか
範囲:0.0〜1.0
例:次のワードの選択確率[A:30%,B:20%,C:10%・・・]でtopP=0.5(50%)の場合Cが候補から外されて、A,Bから選択される
topK上位何個のワードから選択するか
範囲:0.0〜1.0
例:topK=3で、次のワードの候補(確率順)が[A,B,C,D]の場合[A,B,C]から選択される
candidateCount返すレスポンスのバリエーション?詳細不明
maxOutputTokensアウトプットの最大トークン数
stopSequences指定した文字列が出力されたらレスポンスを止める
最大5個まで指定可能
例:stopSequences=[pen]の場合
I’am a pen
というレスポンスがあった場合に
I’am a

で止まる
  1. カテゴリの指定は以下
    HARM_CATEGORY_SEXUALLY_EXPLICIT
    HARM_CATEGORY_HATE_SPEECH
    HARM_CATEGORY_HARASSMENT
    HARM_CATEGORY_DANGEROUS_CONTENT ↩︎
  2. thresholdの値は以下
    BLOCK_NONE
    BLOCK_LOW_AND_ABOVE
    BLOCK_MED_AND_ABOVE
    BLOCK_ONLY_HIGH
    ↩︎

パラメータの構造

実際の構造は以下のようになります。
基本的には省略可能なので、textのみでも通ります。
パラメータをいじりたい場合は以下の構造で追加してみてください。

{
  "contents": [
    {
      "role": string,
      "parts": [
        {
          // Union field data can be only one of the following:
          "text": string,
          "inlineData": {
            "mimeType": string,
            "data": string
          },
          "fileData": {
            "mimeType": string,
            "fileUri": string
          },
          // End of list of possible types for union field data.

          "videoMetadata": {
            "startOffset": {
              "seconds": integer,
              "nanos": integer
            },
            "endOffset": {
              "seconds": integer,
              "nanos": integer
            }
          }
        }
      ]
    }
  ],
  "tools": [
    {
      "functionDeclarations": [
        {
          "name": string,
          "description": string,
          "parameters": {
            object (OpenAPI Object Schema)
          }
        }
      ]
    }
  ],
  "safetySettings": [
    {
      "category": enum (HarmCategory),
      "threshold": enum (HarmBlockThreshold)
    }
  ],
  "generationConfig": {
    "temperature": number,
    "topP": number,
    "topK": number,
    "candidateCount": integer,
    "maxOutputTokens": integer,
    "stopSequences": [
      string
    ]
  }
}

最後に

以上Geminiのパラメータの解説になります。
正直細いところは全く試せていないので、一部ざっくり解説になってしまいましたが、少しでも参考になればと思います。

実際の使い方としては、回答の生成をあまりブレさせたくない場合はtemperatureを0.0にしたり、topKを小さくします。
逆に創造性に富んだ回答が欲しい場合は、temperatureを1.0にして、topK,topPを最大にするなどすると良いでしょう。
プロンプトである程度は思った回答が得られるかと思いますが、どうしてもあと一歩という場合にこちらのパラメータで調整していただければと思います。
私がやった時は案外結果が変わった気がします。(完全に主観です)

では!

コメント

タイトルとURLをコピーしました