改めて Function Calling に複数 function を渡した場合の挙動をシュッと確認してみるわよ
ちゃっす(/・ω・)/
タイトルの通り ChatGPT の Function Calling に複数 function を渡した場合の挙動をシュッと確認してみるわよ(/・ω・)/
そもそも Function Calling ってなんやねん?( ・ω・)
という人は公式のドキュメントとかみてね☆
さて、今回は Function Calling に複数の function を渡した場合にどういう動きをするか改めて確かめてみた。
という話。
ざくっというと ChatGPT にリクエストパラメーターとして functions を渡した場合、ChatGPT の回答内容に応じて適当な function が次の処理として実行されるって感じ(/・ω・)/
ほいで今回は以下のような定義をしてみる
from tenacity import retry, stop_after_attempt, wait_exponential
def add_num(number):
print("add")
return number + 1
def multiply_num(number):
print("multiply")
return number * 2
@retry(stop=stop_after_attempt(10), wait=wait_exponential(multiplier=1, max=10))
def chat(messages, model="gpt-3.5-turbo-0613"):
response = openai.ChatCompletion.create(
model=model,
temperature=0,
messages=messages,
functions=[
{
"name": "add_num",
"description": "Add number",
"parameters": {
"type": "object",
"properties": {
"number": {
"type": "integer" },
},
},
},
{
"name": "multiply_num",
"description": "Multiply number",
"parameters": {
"type": "object",
"properties": {
"number": {
"type": "integer" },
},
},
}
],
function_call="auto"
)
return response
これで ChatGPT に対して何かしら数字を答えさせるとその内容に合致する処理 add_num か multiply_num が呼ばれるはず(/・ω・)/
では、確認していくのだ(/・ω・)/
ChatGPT に対して明示的に数字の2に何か足してくださいな(/・ω・)/
と、お願いしてみる
messages = [
{"role": "user", "content": 'Add something to the number 2.'},
]
chat_response = chat(messages)
print(chat_response["choices"][0]["message"])
結果足し算がされる(/・ω・)/
{
"role": "assistant",
"content": null,
"function_call": {
"name": "add_num",
"arguments": "{\n \"number\": 2\n}"
}
}
では今度は掛け算をお願いしてみよう
messages = [
{"role": "user", "content": 'Multiply the number 2 by something.'},
]
chat_response = chat(messages)
print(chat_response["choices"][0]["message"])
掛け算が実行される(/・ω・)/
{
"role": "assistant",
"content": null,
"function_call": {
"name": "multiply_num",
"arguments": "{\n \"number\": 2\n}"
}
}
では曖昧な指示をすると?( ・ω・)
messages = [
{"role": "user", "content": 'Please make any changes to the number 2'},
]
chat_response = chat(messages)
print(chat_response["choices"][0]["message"])
なにすんねん?( ・ω・)
って聞かれる
{
"role": "assistant",
"content": "Sure, what changes would you like to make to the number 2?"
}
ほいだらさらに微妙な指示に変えてみる(/・ω・)/
messages = [
{"role": "user", "content": 'Give some random change to the number 2.'},
]
chat_response = chat(messages)
print(chat_response["choices"][0]["message"])
足し算が選択された(/・ω・)/
{
"role": "assistant",
"content": null,
"function_call": {
"name": "add_num",
"arguments": "{\n \"number\": 2\n}"
}
}
10 回くらいやっても結果は同じであった(/・ω・)/
では引数として与える順番を変えてみるぞい☆
def chat(messages, model="gpt-3.5-turbo-0613"):
response = openai.ChatCompletion.create(
model=model,
temperature=0,
messages=messages,
functions=[
{
"name": "multiply_num",
"description": "Multiply number",
"parameters": {
"type": "object",
"properties": {
"number": {
"type": "integer" },
},
},
},
{
"name": "add_num",
"description": "Add number",
"parameters": {
"type": "object",
"properties": {
"number": {
"type": "integer" },
},
},
}
],
function_call="auto"
)
return response
再度実行☆
messages = [
{"role": "user", "content": 'Give some random change to the number 2.'},
]
chat_response = chat(messages)
print(chat_response["choices"][0]["message"])
やはり足し算である( ・ω・)
{
"role": "assistant",
"content": null,
"function_call": {
"name": "add_num",
"arguments": "{\n \"number\": 2\n}"
}
}
微妙にプロンプトを変えてみるぞ☆
(変化を大きくしてねとしてみている)
messages = [
{"role": "user", "content": 'Give something big at random for the number 2.'},
]
chat_response = chat(messages)
print(chat_response["choices"][0]["message"])
すると掛け算に反応する(/・ω・)/
{
"role": "assistant",
"content": null,
"function_call": {
"name": "multiply_num",
"arguments": "{\n \"number\": 2\n}"
}
}
というわけで function を複数与えた場合でも選択されるのは ChatGPT に与えた指示によるわけですな(/・ω・)/
ちなみに function_call パラメーターをいじるとまた違ってくるぞ☆
from tenacity import retry, stop_after_attempt, wait_exponential
def add_num(number):
print("add")
return number + 1
def multiply_num(number):
print("multiply")
return number * 2
@retry(stop=stop_after_attempt(10), wait=wait_exponential(multiplier=1, max=10))
def chat(messages, model="gpt-3.5-turbo-0613"):
function_call="none"
)
return response
function_call="none" だと同じ指示でも、、、
messages = [
{"role": "user", "content": 'Give something big at random for the number 2.'},
]
chat_response = chat(messages)
print(chat_response["choices"][0]["message"])
function を実行しない(/・ω・)/
{
"role": "assistant",
"content": "{\n \"number\": 2\n}"
}
明示的に function を宣言すると、、、
from tenacity import retry, stop_after_attempt, wait_exponential
def add_num(number):
print("add")
return number + 1
def multiply_num(number):
print("multiply")
return number * 2
@retry(stop=stop_after_attempt(10), wait=wait_exponential(multiplier=1, max=10))
def chat(messages, model="gpt-3.5-turbo-0613"):
response = openai.ChatCompletion.create(
function_call={"name": "add_num"}
)
return response
messages = [
{"role": "user", "content": 'Give something big at random for the number 2.'},
]
chat_response = chat(messages)
print(chat_response["choices"][0]["message"])
さっきまで掛け算してたのに足し算になったぞ(/・ω・)/
{
"role": "assistant",
"content": null,
"function_call": {
"name": "add_num",
"arguments": "{\n \"number\": 2\n}"
}
}
まぁちゃんと調べたい方は OpenAI Cookbook でもご覧あれ(/・ω・)/
はい、というわけでシュッと整理してみたのでおしまい。
この記事が気に入ったらサポートをしてみませんか?