改めて 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 でもご覧あれ(/・ω・)/


https://github.com/openai/openai-cookbook/blob/main/examples/How_to_call_functions_with_chat_models.ipynb

はい、というわけでシュッと整理してみたのでおしまい。


この記事が気に入ったらサポートをしてみませんか?