Gemini API でフィルター設定を変更する
※ AI関連の仕様は変更が多いため、常に最新の情報を参照下さい。
背景
Gemini API のコンテンツ セーフティ フィルタリング
Gemini API は入力に対して不適切な応答を返す恐れのある単語が含まれていないかをチェックしています。ただし、このフィルタリングは万能ではなく、必要以上の文字列もフィルタリングしてしまう場合があります。
過剰なフィルタリング例
例えばGemini APIに渡す文字列に"チンチラ"を入れてみましょう。そして応答の中身を見るとこう書いてありました。
{"category":"HARM_CATEGORY_SEXUALLY_EXPLICIT","probability":"MEDIUM","blocked":true}
つまり、文字列"チンチラ"は、HARM_CATEGORY_SEXUALLY_EXPLICIT において、危険度が MEDIUM なのでブロックされたわけです。当然"チンチラ"はセクシャルな単語ではないため、これはどうにか対処したいです。
対応内容
安全性設定を追加する
GeminiAPIへ送信する内容に”safetySettings”を設定してやります。
ドキュメントはこちら
安全性設定では、HARM_CATEGORY_HARASSMENT、HARM_CATEGORY_HATE_SPEECH、HARM_CATEGORY_SEXUALLY_EXPLICIT、HARM_CATEGORY_DANGEROUS_CONTENの4つのカテゴリに対して調整が行えます。フィルタリングレベルとしては、BLOCK_NONE、BLOCK_ONLY_HIGH、BLOCK_MEDIUM_AND_ABOVE、BLOCK_LOW_AND_ABOVE、HARM_BLOCK_THRESHOLD_UNSPECIFIEDの5つを指定できます。
実際に設定してみる
Node.jsでは下記のように作成しました。
// 安全性設定
// BLOCK_LOW_AND_ABOVE NEGLIGIBLE を含むコンテンツは許可されます。
// BLOCK_MEDIUM_AND_ABOVE NEGLIGIBLE と LOW のコンテンツは許可されます。
// BLOCK_ONLY_HIGH NEGLIGIBLE、LOW、MEDIUM のコンテンツは許可されます。
// BLOCK_NONE すべてのコンテンツが許可されます。
const safetySetting = [
{
// 嫌がらせ
category: HarmCategory.HARM_CATEGORY_HARASSMENT,
threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH,
},
{
// 露骨な性表現
category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH,
},
{
// ヘイトスピーチ
category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH,
},
{
// 危険
category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH,
},
];
const chatSession = model.startChat({
generationConfig,
safetySettings: safetySetting,
history: history,
});
とりあえず、設定できる4項目を全て BLOCK_ONLY_HIGH と設定しました。これで"チンチラ"と入力してもブロックされることはなくなりました。良かったですね。
ただし、当然ながら本来必要とされる部分のフィルターレベルも弱くなっているため注意して下さい。
捕捉
BLOCK_NONE(ブロックなし)について
safetySettings設定では、BLOCK_NONEは一般的には使用できなくなっております。理由があり使用したい場合は、GoogleCloudeへ直接連絡し妥当性が認められる必要があるようです。
過去には申請フォームがありましたが、現在は利用不可となっているので、有料のサポートを使用する必要があるのかもしれません。