はじめに
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 | テキストなどのデータを格納 | ||||
text | AIに投げるプロンプト | ||||
inlineData | 画像または動画のシリアル化されたデータ(1個まで) | ||||
mimeType | 入力する画像や動画の拡張子(例:image/png) | ||||
data | base64エンコードされた画像または動画 | ||||
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 | ||||
generationConfig | AIのレスポンスのパラメータ(性格のようなもの) | ||||
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 で止まる |
- カテゴリの指定は以下
HARM_CATEGORY_SEXUALLY_EXPLICIT
HARM_CATEGORY_HATE_SPEECH
HARM_CATEGORY_HARASSMENT
HARM_CATEGORY_DANGEROUS_CONTENT
↩︎ - 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を最大にするなどすると良いでしょう。
プロンプトである程度は思った回答が得られるかと思いますが、どうしてもあと一歩という場合にこちらのパラメータで調整していただければと思います。
私がやった時は案外結果が変わった気がします。(完全に主観です)
では!
コメント