見出し画像

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 の動き的には




  1. 普通に ChatGPT にリクエスト

  2. ChatGPT 側で次の処理に使いそうな function が渡されているか確認

  3. 存在したらそいつに引数を渡して処理実行




と、なるわけですな (/・ω・)/



つまり今回は


  1. スナックバス江の情報から特徴を抽出する

  2. function として特徴を JSON 化するという架空の処理を作る

  3. この処理に渡す引数が構造化された状態で返ってくる


っていうのを確認するでござる~ ( ・ω・)



詳しくはこちらをどぞ~




評価の方法はいつも通りでござんす

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 回やったのでまぁそこそこ安心できるやろ



ということでおしまい。

この記事が気に入ったらサポートをしてみませんか?