前回の概要
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のキーも英語の名前ではなくて日本語になっています。
悪い結果とは言えないけど、気をつけてつか言わないといけないですね。