GeminiにJSON出力を命じると、1.0と1.5 Flashで異なるフォーマットで回答が返る件

こんにちは、Rcatです。
DifyがGemini1.5  Flashに対応しましたが、その影響でエラーが出たのでまとめておきます。


概要

最近やっているAIによる自動分析で、AIの出力をPythonに渡したいと思ったので、フォーマットを決めて出力できないか考えていました。
よくChatGPTにコード手伝ってもらうので、そういう系統の指示の仕方をすれば理解してくれるのでは?と思いました。
具体的には"JSON"ですね。この辺もしっかり学習していると思いますし、何より形式が厳密なので、「JSONで出力してください。例は次の通りです」とでも書けば出てくるでしょう。実際ある程度洗練すればフォーマットに沿って出てきます

DIfy系目次記事

問題発生

DifyがGemini1.5 Flashに対応してからエラーが頻発
出力の生データを見ると書式が異なっていました…。

Dify上のログで見るとこんな感じです。
1.0の時はプレーンテキストでJSONを出力してくれているのでそのまま使えますが、1.5になってから表示が変わりました…。JSONと認識していますね?

生データ

ブラウザ上の表示が変わっただけでは分からないので、生データを見てみます。これを見ると一目瞭然、1.0はただのテキストだったものに対して、1.5Flashではいかにも"これはJSONですよ"といった付加部分がある…。

Gemini 1.0

[
{
"name":"nvidia",
"count":891,
"interval":280,
"resun":"コメント数が多く、更新間隔が短い"
},
{
"name":"銘柄XXX",
"count":1213,
"interval":1760,
"resun":"コメント数が多く、更新間隔が比較的短い"
},
{
"name":"銘柄XXX",
"count":188,
"interval":1010,
"resun":"コメント数が比較的多く、更新間隔が短い"
},
{
"name":"銘柄XXX",
"count":686,
"interval":900,
"resun":"コメント数が多く、更新間隔が比較的短い"
},
{
"name":"銘柄XXX",
"count":100,
"interval":2760,
"resun":"コメント数が比較的多く、更新間隔が比較的短い"
}
]

Gemini1.5

```json
[
{
"name": "銘柄XXX",
"count": 698,
"interval": 1890.0,
"resun": "コメント数が多く、更新間隔も比較的短い"
},
{
"name": "銘柄XXX",
"count": 334,
"interval": 1930.0,
"resun": "コメント数が多く、更新間隔も比較的短い"
},
{
"name": "nvidia",
"count": 891,
"interval": 280.0,
"resun": "コメント数が多く、更新間隔が非常に短い"
},
{
"name": "銘柄XXX",
"count": 1213,
"interval": 1760.0,
"resun": "コメント数が多く、更新間隔も比較的短い"
},
{
"name": "銘柄XXX",
"count": 188,
"interval": 1010.0,
"resun": "コメント数が多く、更新間隔も比較的短い"
},
{
"name": "銘柄XXX",
"count": 686,
"interval": 900.0,
"resun": "コメント数が多く、更新間隔も比較的短い"
}
]
```

Gemini1.5系は出力をJSONに強制できるオプションがあるらしいのでそれの影響だろうか?
このフォーマット自体が公式なものなのかどうかはちょっと調べても出てこなかった(調べ方が悪いかな?)が、DifyのログがJSONと認識に使っている以上何かしらの規格に沿ったものであると思われるので、今後は先頭の"'''JSON"部分をカットし、末尾から"}'''"が現れるまでトリムという処理を追加しようと思う。

まとめ

Gemini1.5 Flashにしてからフォーマットが変化したが、逆に必ずあの形で出てくるのでこれはこれで対応さえすれば安定して使えそう。
具体的なJSONプロンプトに関してはAI掲示板要約BOTの記事の方で語る予定。

情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。