
GPT-4o-miniをAPIで使う
こんばんは、かーでぃです。
OpenAI APIは、しばらく使っているのですが、いつもgpt-3.5-turboを使ってるんですね。
なぜか?
「モデルを、gpt-4oやgpt-4o-miniに謎のエラーで止まってしまうから」
で、WinActorでAPIまわりの処理を弄っていて、その原因がやっとつかめたので、忘備録として公開します。
プロンプト
以下のプロンプトをそれぞれのモデルで実行させます。
以下のテキストから、郵便番号、住所(県・市、町名・番地、建物名・部屋番号の3つに分ける)、名前(苗字と名前の2つに分ける)に分解してください。
出力は次のJSON形式のみを出力してください。
・yubin = 〒番号
・ken = 県と市
・chou = 町名、番地
・bill = 建物、部屋番号
・first_name = 苗字
・last_name = 名前
テキスト=あいうえおかきくけこ〒4400999愛知県豊橋市渋谷町39-14エメラルドメンション東谷201ささし***鎌田誠
実行結果をテキストに保存したものを、下記に示します。
※恐らく、「JSON形式で出力」と指示した場合だけの問題じゃないかと思います。
gpt-3.5-turbo
{
"id": "chatcmpl-A3KtykR4Lup9IFbElWbXXjFQeSHrG",
"object": "chat.completion",
"created": 1725358694,
"model": "gpt-3.5-turbo-0125",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "{\n \"yubin\": \"〒4400999\",\n \"ken\": \"愛知県豊橋市\",\n \"chou\": \"渋谷町39-14\",\n \"bill\": \"エメラルドメンション東谷201\",\n \"first_name\": \"鎌田\",\n \"last_name\": \"誠\"\n}",
"refusal": null
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 216,
"completion_tokens": 89,
"total_tokens": 305
},
"system_fingerprint": null
}
gpt-4o-mini
{
"id": "chatcmpl-A3DqAtPVQC2wQfwgl1LIFpTgaQ7py",
"object": "chat.completion",
"created": 1725331550,
"model": "gpt-4o-mini-2024-07-18",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "```json\n{\n \"yubin\": \"〒4400999\",\n \"ken\": \"愛知県豊橋市\",\n \"chou\": \"渋谷町39-14\",\n \"bill\": \"エメラルドメンション東谷201\",\n \"first_name\": \"鎌田\",\n \"last_name\": \"誠\"\n}\n```",
"refusal": null
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 178,
"completion_tokens": 79,
"total_tokens": 257
},
"system_fingerprint": "fp_f33667828e"
}
(おまけ)gpt-4o
{
"id": "chatcmpl-A3KslwF2AEthIVdeJKONBwmJnIgua",
"object": "chat.completion",
"created": 1725358619,
"model": "gpt-4o-2024-05-13",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "```json\n{\n \"yubin\": \"〒4400999\",\n \"ken\": \"愛知県豊橋市\",\n \"chou\": \"渋谷町39-14\",\n \"bill\": \"エメラルドメンション東谷201\",\n \"first_name\": \"鎌田\",\n \"last_name\": \"誠\"\n}\n```",
"refusal": null
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 178,
"completion_tokens": 79,
"total_tokens": 257
},
"system_fingerprint": "fp_157b3831f5"
}
比較結果
どうでしょうか?違い、わかりますか?
ポイントは「content」の中です。
3.5-trubo:"content": "{\n \"yubin\": \"〒4400999\",\n \"ken\": \"愛知…
4o-mini:"content": "```json\n{\n \"yubin\": \"〒4400999\",\n \"ken\": \"愛知…
実は、gpt-3.5-turboの際は、余分な情報などなく、素直にJSONが記載されています。
一方、gpt-4oやgpt-4o-miniでは、JSONの前に余分な「```json」が含まれているんです。
何度実行しても、この余分なコレは付いてきてしまうので、JSONとして認識させるには除去するしかありません。
※「json:[~」となっていれば、JSONと認識してくれるハズなのに…
ということで、contentの値を取り出せたなら、冒頭にある余分な「```json」を文字列置換などを使って削除してあげれば、きれいなJSONになるので、中身が取り出せる、ということでした。

もっとスマートなやり方があるのかもしれませんが、試してはみたのですが、自分としてはこれしかなく。検索しても、それらしいことが書かれているブログもなかったので、記載しておきました。
ちなみにこんな動きができます!
ちなみに、JSONで返してもらうと、こんなことができます。
👇プロンプト
以下のテキストから、郵便番号、住所(県・市、町名・番地、建物名・部屋番号の3つに分ける)、名前(苗字と名前の2つに分ける)に分解してください。
出力は次のJSON形式のみを出力してください。
・yubin = 〒番号
・ken = 県と市
・chou = 町名、番地
・bill = 建物、部屋番号
・first_name = 苗字
・last_name = 名前
テキスト=あいうえおかきくけこ〒4400999愛知県豊橋市渋谷町39-14エメラルドメンション東谷201ささし***鎌田誠
JSONで返ってきた結果を各要素に分解して、WinActorでエクセルに転記した結果がこちら。

これすごいのは、住所・名前以外の余分な情報(あいう~けこ、さしし***)を除去してくれているところ。
例えば、AI-OCRで項目指定せず、ざっくり1ページ読み取って、欲しい内容だけ取り出すように指示すれば、不要な情報を除去して必要な情報を構造化データで返してもらう、こともできちゃう。
もちろん、ハルシネーションの恐れもあるので、人間系の目視作業は必要になりますけどね。
追記 - こちらの方がスマートですので、こちら推奨ですw
フォロワーさんから、こんな情報を頂きました。
なるほど、response_formatでJSONモードにしてあげればいいのか。
cohere APIで同じこと悩んでました(;・∀・)
— ささみ@情シス (@sasami_axis) September 3, 2024
WinActorで指定できるのかわからないですが、OpenAI APIでもリクエストに
response_format={ "type": "json_object" }
と応答のフォーマットをjsonに指定するパラメータを入れると```json ~ ``` 無しで出力されるみたいです pic.twitter.com/4KLR28s60t
MS Learnにも下記のような記述を見つけました。
ということで、さっそくWinActorde実装してみましょう!
response_formatは、JSONオブジェクトの指定ですので…
変数「jsonResponseFormat」の値を、下記のように指定します。

HTTPライブラリの要求→ボディに、response_formatを追加し、
型:オブジェクト
値:変数「jsonResponseFormat」
と指定します。

これで実行すると、contents要素の中に、余分な「```json」が無くなっており、形式としてgpt-3.5-truboで出力したときと同じになりました(^^)/
{
"id": "chatcmpl-A3OBnFxAot0d9okTAhFATj6qHsBe0",
"object": "chat.completion",
"created": 1725371331,
"model": "gpt-4o-mini-2024-07-18",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "{\n \"yubin\": \"〒4400999\",\n \"ken\": \"愛知県豊橋市\",\n \"chou\": \"渋谷町39-14\",\n \"bill\": \"エメラルドメンション東谷201\",\n \"first_name\": \"鎌田\",\n \"last_name\": \"誠\"\n}",
"refusal": null
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 178,
"completion_tokens": 75,
"total_tokens": 253
},
"system_fingerprint": "fp_5bd87c427a"
}
いいなと思ったら応援しよう!
