0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GPT関数呼び出すの2:ArrayとObjectsのような高度な出力制御

Posted at

前回の概要

GPTの新機能の説明

GPTの関数呼び出し(function calling)で、文章からSQL文を生成

ユーザープロンプト

prompt_user = '''
2023年5月31日に、商品価格が1,000円以上の売上を出してください
'''

アウトプット

{'month': 5, 'day': 31, 'price': 1000}

前回は数字だけの生成ができましたけど、実際はいろいろの形も生成できます。

今回の概要

より活用できるように、今回は数字・文字列の出力と、Array・Objectsと合わせて出力したいと思います。

文章から名前と年齢を出力、ただし1個ではなく、リストで返す

イメージ

このような文章から

司会は3年連続の俳優、大泉洋(49)と初司会の女優、橋本環奈(23)、そして桑子真帆アナウンサー(35)が務める。
また、嵐・櫻井翔(40)が新設のスペシャルナビゲーターに就任した。

このような出力にしたい

大泉洋, 49
橋本環奈, 23
桑子真帆, 35
櫻井翔, 40

関数

prompt_function = [
    {
        "name": "get_name_and_age",
        "description": "get name and age from people",
        "parameters": {
            "type": "object",
            "properties": {
                "peopleInfo": {
                    # Array型の出力を指定
                    "type": "array",
                    "description": "An array of objects representing key and values",
                    # さらにObjects型の出力を指定
                    "items": {
                        # 名前(文字列)の出力
                        "name": {
                            "type": "string",
                            "description": "name of the person"
                        },
                        # 年齢(数字)の出力
                        "age": {
                            "type": "integer",
                            "description": "age of the person"
                        }
                    }
                }
            },
            # 出力の指定は"name"と"age"
            "required": ["name", "age"],
        },
    }
]

少し複雑だけど、これで関数の定義ができました。

ユーザープロンプト

prompt_user = '''
こちらの情報から名前と年齢をテーブルで出してください

司会は3年連続の俳優、大泉洋(49)と初司会の女優、橋本環奈(23)、そして桑子真帆アナウンサー(35)が務める。
また、嵐・櫻井翔(40)が新設のスペシャルナビゲーターに就任した。
'''

実行してみる

import openai
import json

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0613",
    messages=[
        {"role": "user", "content": prompt_user},
    ],
    functions=prompt_function,
    function_call="auto",
)

for i in json.loads(response["choices"][0]["message"]["function_call"]["arguments"])["peopleInfo"]:
    print(i)

アウトプット結果

{'name': '大泉洋', 'age': 49}
{'name': '橋本環奈', 'age': 23}
{'name': '桑子真帆', 'age': 35}
{'name': '櫻井翔', 'age': 40}

無事変換と出力できます。

予想外のアウトプット結果

少し指示の部分を編集してみました。

prompt_user = '''
こちらの情報から役職を除いた名前と年齢をテーブルで出してください

総裁の菅義偉は71歳、
幹事長の二階俊博は81歳、
総務会長の佐藤勉は68歳、
政調会長の下村博文は66歳、
選挙対策委員長の山口泰明は71歳です。
'''

実行してみたら、

import openai
import json

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0613",
    messages=[
        {"role": "user", "content": prompt_user},
    ],
    functions=prompt_function,
    function_call="auto",
)

アウトプット結果

{'役職': '総裁', '名前': '菅義偉', '年齢': 71}
{'役職': '幹事長', '名前': '二階俊博', '年齢': 81}
{'役職': '総務会長', '名前': '佐藤勉', '年齢': 68}
{'役職': '政調会長', '名前': '下村博文', '年齢': 66}
{'役職': '選挙対策委員長', '名前': '山口泰明', '年齢': 71}

定義していなかった「役職」が出てきました。しかもObjectsのキーも英語の名前ではなくて日本語になっています。

悪い結果とは言えないけど、気をつけてつか言わないといけないですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?