ChatGPT の Function calling で確実に JSON 形式で出力できるのかシュッと確認してみた
はい。
今日は朝から ChatGPT の更新でお祭り騒ぎですね。
はい。
追加機能の目玉として Function calling ってのがありましたね。
はい。
まぁ ChatGPT API の Plugin みたいな処理がシュッと作れるようになったわけですよ。
そして、プロンプトに JSON で出力してくれ、、、絶対、、、絶対だぞ、、、!!
とか言わなくても良くなりました。
駄菓子菓子
ホントにプロンプトに JSON 出力を明示なくともカッチリと JSON になってくれるのか??
疑り深い私は 100 のリクエストをもってその堅牢性を測るのであった。
シュッと確認
いつものごとく Google Colab でシュッと
プロンプトには JSON とは一切記載しておりません!!
import openai
import json
openai.api_key = open_ai_api_key
def run_conversation():
content = f"""
以下の ``` で括られた内容をから特徴を抽出してください。
```
『スナックバス江』(スナックバスえ)は、フォビドゥン澁川による日本の漫画。
『週刊ヤングジャンプ』(集英社)にて、2017年33号より連載中[1]。
札幌市の北24条にある場末のスナック「スナックバス江」を舞台にしたギャグ漫画である[1]。
話数カウントは『第○夜』。
2020年、『週刊ヤングジャンプ』の増刊『ヤングジャンプスポーツ』(集英社)にて、
元ラグビー選手の福岡堅樹とコラボレートし、本作の番外編が掲載された[2]。
2023年6月、公式Twitterアカウントにてアニメ化が発表されている[3]。
参照: https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%8A%E3%83%83%E3%82%AF%E3%83%90%E3%82%B9%E6%B1%9F
```
"""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
temperature=0.0,
messages=[
{"role": "user", "content": content}],
functions=[
{
"name": "i_am_json",
"description": "抽出された特徴を JSON として処理します。",
"parameters": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "書籍のタイトルです",
},
"author": {
"type": "string",
"description": "書籍の著者です",
},
"reference": {
"type": "string",
"description": "情報の参照元 URL です",
},
},
},
}
],
function_call={"name": "i_am_json"},
)
message = response["choices"][0]["message"]
return json.loads(message["function_call"]["arguments"])
んで、Function として架空の i_am_json を作る
Function Calling の動き的には
普通に ChatGPT にリクエスト
ChatGPT 側で次の処理に使いそうな function が渡されているか確認
存在したらそいつに引数を渡して処理実行
と、なるわけですな (/・ω・)/
つまり今回は
スナックバス江の情報から特徴を抽出する
function として特徴を JSON 化するという架空の処理を作る
この処理に渡す引数が構造化された状態で返ってくる
っていうのを確認するでござる~ ( ・ω・)
詳しくはこちらをどぞ~
評価の方法はいつも通りでござんす
import os
import csv
output_csv_file = 'open_ai_chatgpt_3.5_turbo_response_json_cheker.csv'
num_requests = 100
def has_properties(data, property_names):
try:
data
return all(prop in data for prop in property_names)
except ValueError:
return False
with open(output_csv_file, 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(["Request Number", "Title", "Author", "Reference", "Has All Property"])
for i in range(num_requests):
result = run_conversation()
has_all_property = has_properties(result, ["title", "author", "reference"])
writer.writerow([i+1, result["title"], result["author"], result["reference"], has_all_property])
print(f"Request {i+1}")
100 回同じ内容リクエストして全部 JSON 化されるか?
期待されるプロパティを毎回設定できているか?
ですな(/・ω・)/
結果
Perfect !! (*´▽`*)
全て完璧な回答であった。
とりあえず 100 回やったのでまぁそこそこ安心できるやろ
ということでおしまい。
この記事が気に入ったらサポートをしてみませんか?