見出し画像

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になるので、中身が取り出せる、ということでした。

WinActorだと、こんな感じ

もっとスマートなやり方があるのかもしれませんが、試してはみたのですが、自分としてはこれしかなく。検索しても、それらしいことが書かれているブログもなかったので、記載しておきました。

ちなみにこんな動きができます!

ちなみに、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モードにしてあげればいいのか。

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"
}

いいなと思ったら応援しよう!