😸

Function callingでダジャレ評価関数を作る

2023/06/14に公開

Function callingについて

https://openai.com/blog/function-calling-and-other-api-updates

Chat Completions APIにFunction callingという機能が追加されて、入力テキストから実行する関数とパラメーターを生成できるようになった。

これによって開発者は

  1. Completions API(1回目)から返された関数とパラメーターを使って独自の処理を実行する
  2. 処理結果をCompletions API(2回目)にrole=functionにJSONでシリアライズして送信する
  3. APIからの応答テキストをユーザーに返す

というフローが可能になる。

なので、ヘッドレスなChatGPT pluginsのように機能する(LangChainなどで連携方法を試行錯誤していた部分が一部取り込まれたともいえる)。

他の用途としては、「関数とパラメーターを生成」の部分のパラメーターをJSON Schemaとして指定できるので、プロンプトから構造化されたJSONデータで結果を取得できるようになった。

天気情報を応答するサンプル

公式ガイドでは天気情報を取得する外部呼び出しAPIを想定した連携のサンプルがある

https://platform.openai.com/docs/guides/gpt/function-calling

1回目のChat Completion APIで

get_current_weather("Glasgow, Scotland", "celsius")

を取得して、外部呼び出し。

2回目のChat Completion APIで結果を

{ "location": "Glasgow, Scotland", "temperature": "72", "unit": "celsius", "forecast": ["sunny", "windy"] }

として送信することで「Glasgowのtemperature 72です」というテキストを返してくれるようになる。

蛇足: 現時点ではドキュメントのコードにミスがあり、以下のようにStep 3を修正すると動作するはず

arguments = json.loads(message["function_call"]["arguments"])
# Step 3, call the function
# Note: the JSON response from the model may not be valid JSON
function_response = get_current_weather(
    location=arguments.get("location"),
    unit=arguments.get("unit"),
)

DBに実行するSQLを取得して応答するサンプル

またCookbookリポジトリではテキストからSQLを生成して実行するサンプルがある

https://github.com/openai/openai-cookbook/blob/41a5d394ca355e276ba21290696116c33f55ad9f/examples/How_to_call_functions_with_chat_models.ipynb#L209

ダジャレ評価関数

自分は「プロンプトから構造化されたJSONデータで結果を取得できる」という部分を便利に使いたいので、ダジャレを送ると採点と評価をしてくれるプログラムを作ってみた。

(正確には「GPTでダジャレを評価した結果を処理するための関数」ではある)

def run_conversation(input):
    content = f"""
    ダジャレの面白さをAからEに評価して、評価の理由を論理的にコメントします。

    ダジャレ:{input}
    """

    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-0613",
        temperature=0.0,
        messages=[
            {"role": "user", "content": content}],
        functions=[
            {
                "name": "send_dajare_result",
                "description": "ダジャレの面白さをAからEに評価してコメントします",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "comment": {
                            "type": "string",
                            "description": "コメント内容",
                        },
                        "rank": {
                            "type": "string",
                            "enum": ["A", "B", "C", "D", "E"],
                            "description": "評価ラベルです。Aが最高、Eが最低です",
                        },
                    },
                    "required": ["comment", "rank"],
                },
            }
        ],
        function_call={"name": "send_dajare_result"},
    )

    message = response["choices"][0]["message"]
    result = json.loads(message["function_call"]["arguments"])

    print("評価:"+result["rank"])
    print("コメント:"+result["comment"])

https://gist.github.com/laiso/c088a94b8c6c4590743de5600c5d9529

以下のように実行する。ダジャレはダジャレ・ステーションというサイトに投稿されたものを使わせてもらった。

❯ python main.py こっから近いし、国家拉致開始 
評価:A
コメント:このダジャレは、言葉の響きを利用して面白さを生み出しています。『こっから近いし、国家拉致開始』というフレーズは、『こっから近い』という言葉が『国家拉致開始』と韻を踏んでいるため、聞いた人に驚きや笑いを与える効果があります。また、国家拉致という言葉が意外性を持っているため、さらに面白さが増しています。全体的に言葉の組み合わせが巧妙で、聞いた人に印象に残るダジャレです。

References

Discussion