メインコンテンツへスキップ
見出し画像

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



    ということでおしまい。

     
     

    bbz

     
     
    フロント、バックエンドから SRE までやってきましたが、最近は AI が好きな人。個人用 note。好きな言葉。シュッと Just Do It。 AX(AI eXperience) AX(AI Transformation)

    あなたへのおすすめ