nikkie-ftnextの日記

イベントレポートや読書メモを発信

OpenAI DevDayで発表された「Parallel function calling」の例をPythonとopenaiライブラリで素振り

はじめに

ダーク・コーリング! nikkieです。

OpenAI DevDayのキーノートを見て、めちゃめちゃ可能性を感じました1

今回はDevDayでリリースされたアップデートの1つ「Parallel function calling」について素振りの模様をお届けします

目次

Parallel function calling

DevDayでのリリース

New models and developer products announced at DevDay

「GPT-4 Turbo with 128K context」>「Function calling updates」

We’re releasing several improvements today, including the ability to call multiple functions in a single message

単一のメッセージの中で複数回のfunction callingが行えるようになったんです!

ドキュメントはこちら:Parallel function calling

そもそもFunction callingとは

過去のエントリでも取り上げました。

GPTへのリクエストに「こんな関数を使うこともできるよ」と関数の概要や引数の説明を含めておきます。
GPTはチャットに応答する上で必要に応じて関数を呼び出します。

Function callingで以下のようなことが可能になります。

  • この関数呼び出しはJSON形式になるので、チャット(自然言語)をパースする目的で使うこともできます
  • 関数呼び出しの結果を元にチャットに応じることができます
    • 上記エントリで素振りした、天気を返す例
  • また、関数呼び出しによってアプリケーション(特にUI)を変化させることで、あたかもGPTがアプリケーションを操作しているかのような体験をもたらせます

Parallel function callingの例を動かす

上記ドキュメントの「Example with one function called in parallel」を見ていきます

  • Python 3.11.4
  • pip install openai termcolor

ライブラリバージョン

annotated-types==0.6.0
anyio==3.7.1
certifi==2023.7.22
distro==1.8.0
h11==0.14.0
httpcore==1.0.1
httpx==0.25.1
idna==3.4
openai==1.1.1
pydantic==2.4.2
pydantic_core==2.10.1
sniffio==1.3.0
termcolor==2.3.0
tqdm==4.66.1
typing_extensions==4.8.0

2つのモデルで動かしました2

  • gpt-3.5-turbo-0613(parallelは非サポート)
  • gpt-3.5-turbo-1106(parallelをサポート)

「ボストンの天気は?」のように1つの都市の天気を聞いたときの動きは同様です。
「ボストンと東京の天気を教えてください」と複数都市について質問したときの回答が違います。
MODEL_NAMEコメントアウトを切り替えて動作確認しています。

gpt-3.5-turbo-0613「ボストンの現在の天気は72°Fです。」

ボストンしか答えられていません。
function callingは1回で、ボストンについてだけでした(GPTが呼び出した関数の返り値をprintしています)。

{"location": "Boston, MA", "temperature": "72", "unit": "fahrenheit"}

gpt-3.5-turbo-1106「ボストンの現在の気温は華氏72度です。一方、東京の現在の気温は摂氏10度です。」

両方の都市の気温を答えられています!! 2回function callingされているんですね!

{"location": "Boston, MA", "temperature": "72", "unit": "fahrenheit"}
{"location": "Tokyo, Japan", "temperature": "10", "unit": "celsius"}

2023/06に動かしたときからの変更点

openaiライブラリのメジャーバージョンアップ(v1)による変更点

DevDayに合わせて11/7にv1がリリースされています🎉
Release v1.0.0 · openai/openai-python · GitHub

See the v1.0.0 discussion for a list of breaking changes and migration guide.

からリンクされている破壊的変更を見ると

  • openai.OpenAI()とクライアントをインスタンス化して使うようになった

  • Response objects are now pydantic models

    • これまでは辞書を継承していた3のでresponse["awesome"]ともアクセスできましたが、今後はresponse.awesomeというアクセスに限られます
    • model_dump_jsonメソッドが生えているらしい

他にも破壊的変更が目白押しですが、openai migrateで移行できるらしいです。便利そう!(未検証)

OpenAIのAPIの変更点

functionからtoolと名称が変わっています。
toolの中の1つがfunctionという世界観なんでしょうか。

    response = client.chat.completions.create(
        model=MODEL_NAME,
        messages=messages,
        temperature=0,
        tools=tools,
        tool_choice="auto",
    )

APIの返り値も変わっています。
https://platform.openai.com/docs/api-reference/chat/object

  • function_call -> tool_calls
    • tool_callsはarrayがデフォルト(出力を観察すると、要素が1個のときや、arrayでなくNoneのときもありました)
    • 要素
      • id
        • parallel callingでは、function callingの結果にtool_call_idを付与してGPTに送信
      • type
      • function
        • name
        • arguments
          • APIを呼び出したプログラムで定義されている関数に渡せる引数

余談:久々にAPI呼び出ししたら、429が返って困った!

openai.RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}

https://http.cat/429

端的に言うと、課金して解決しました!

どうやらFree Tierにいて、アカウント作成時に付与されたクレジットでこれまでAPIを叩いていたようです。
このクレジットがexpireしていて残金0円。
1回も叩けないのにリクエストしたのでToo Many Requestsと返ったと理解しています。

上記のヘルプからクレジットは最低5ドルとわかり、それをチャージしたところ叩けるようになりました。
ミリシタより先にOpenAIに課金しちゃった!

終わりに

リリースされた「Parallel function calling」の素振り録でした。
キーノート中の旅行サイトの例はめちゃめちゃすごいと思っていて、その中で使われている技術の1つ、「Parallel function calling」は完全に理解したと思います。
引き続き素振りしていくぞ〜


  1. 特に旅行アプリの例 https://www.youtube.com/live/U9mJuUkhUzk?si=5w6Jg7_Vohx7Wo8Z&t=2028 がすごいと思うんですよ!
  2. gpt-4も叩きたいのですが、友達料を払っていない期間が長すぎたため、いつ使えるようになるのかさっぱりわかりません
  3. v0.27.8では辞書でした
  4. If you want to force the model to call a specific function you can do so by setting tool_choice with a specific function name. ref: https://platform.openai.com/docs/guides/function-calling/parallel-function-calling