はじめに
ダーク・コーリング! nikkieです。
OpenAI DevDayのキーノートを見て、めちゃめちゃ可能性を感じました1。
今回はDevDayでリリースされたアップデートの1つ「Parallel function calling」について素振りの模様をお届けします
目次
- はじめに
- 目次
- Parallel function calling
- Parallel function callingの例を動かす
- 2023/06に動かしたときからの変更点
- 余談:久々にAPI呼び出ししたら、429が返って困った!
- 終わりに
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()
とクライアントをインスタンス化して使うようになった- 環境変数
OPENAI_API_KEY
が参照される
- 環境変数
Response objects are now pydantic models
- これまでは辞書を継承していた3ので
response["awesome"]
ともアクセスできましたが、今後はresponse.awesome
というアクセスに限られます model_dump_json
メソッドが生えているらしい
- これまでは辞書を継承していた3ので
他にも破壊的変更が目白押しですが、openai migrate
で移行できるらしいです。便利そう!(未検証)
OpenAIのAPIの変更点
functionからtoolと名称が変わっています。
toolの中の1つがfunctionという世界観なんでしょうか。
- functions -> tools
- https://platform.openai.com/docs/api-reference/chat/create#chat-create-tools
- toolの1つ1つの指定項目
- type: 現在はfunctionのみ
- function: これまでのfunctionsに指定していたのと同様の関数定義
- name
- parameters
- function_call -> tool_choice
- https://platform.openai.com/docs/api-reference/chat/create#chat-create-tool_choice
- toolsを渡したときのデフォルトはautoで、関数を使うこともある
- 強制するには関数名を渡す4らしい
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を呼び出したプログラムで定義されている関数に渡せる引数
- id
- tool_callsはarrayがデフォルト(出力を観察すると、要素が1個のときや、arrayでなく
余談:久々に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'}}
端的に言うと、課金して解決しました!
どうやらFree Tierにいて、アカウント作成時に付与されたクレジットでこれまでAPIを叩いていたようです。
このクレジットがexpireしていて残金0円。
1回も叩けないのにリクエストしたのでToo Many Requestsと返ったと理解しています。
上記のヘルプからクレジットは最低5ドルとわかり、それをチャージしたところ叩けるようになりました。
ミリシタより先にOpenAIに課金しちゃった!
終わりに
リリースされた「Parallel function calling」の素振り録でした。
キーノート中の旅行サイトの例はめちゃめちゃすごいと思っていて、その中で使われている技術の1つ、「Parallel function calling」は完全に理解したと思います。
引き続き素振りしていくぞ〜
- 特に旅行アプリの例 https://www.youtube.com/live/U9mJuUkhUzk?si=5w6Jg7_Vohx7Wo8Z&t=2028 がすごいと思うんですよ!↩
- gpt-4も叩きたいのですが、友達料を払っていない期間が長すぎたため、いつ使えるようになるのかさっぱりわかりません↩
- v0.27.8では辞書でした ↩
- 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↩