はじめに
最近ちょくちょくOpenAI APIのFunction callingを触ってみて、実際に触ってみて初めてわかるような挙動がいくつかあったので、ここにまとめていこうと思います。
元は社内向けにしゃべった内容で、サンプルコードを載せられず分かりづらいところが多々あるかと思います🙇🙇🙇
引数も普段のChatと同じように生成しているので、Streamやtemperature、当然モデル精度等の影響を受ける
一番わかりやすい例は、「streamをオンにすると引数もstreamで渡される」事です。詳しくはこちらの記事で書いているので合わせて読んでいただけるとわかりやすいかと思います!
また、temperatureを下げることで回答のバラつきが下がり、関数がランダムに呼ばれづらくなります。
functionが呼ばれない場合、普通に回答が返ってくる
上の例を見ると思うのが、Function callingの呼び出しと回答箇所でパラメータやモデルを分けたい!だと思います。その場合一工夫必要で、該当する関数がない時に呼び出すデフォルトfunctionを定義して、その関数から再度APIを呼び出すアプローチが良いかと思います。
JSON Schema形式、引数の型もJSON Schemaに乗っとる
タイトルの通り、Function callingの定義はJSON Schema形式です。ですので、引数の型もJSON Schemaにのっとります。
公式ドキュメントでもあまりアピールされていないので、地味に見落としがちな場所かと思います。
「openai api function calling 引数 型」みたいに調べて地味に遠回りしてしまったので、メモっておきます
英語でググってもフォーラム、公式ドキュメント(↑の)の順で引っかかるので、利用できる型を解説している公式ドキュメントはなさそうです。
Function callingもプロンプトの一種、関数が呼び出されなくてもアウトプットに影響する
一番わかりやすい例で言うと、「関数を呼び出すかを利用者に質問する」ことです。利用者がプロンプトインジェクションを行わなくても、関数名が晒されるケースはたまにあります。
これは完全に感覚なので余談ですが、Function callingで利用した単語が、回答に出てきやすくなるような気がしています。たとえば、"SNS"という単語をdescription
に入れておくと、回答に"SNS"と若干出やすくなるような
違いがわかりづらい関数を並べると、先に定義した関数が呼ばれる
関数A, Bどちらを利用すればいいか分かりづらい場合、上に並べた関数Aが呼ばれる仕組みになっているようです。
終わりに
体験してみて分かった具体的な仕様と、感覚的な所まで書いてみましたがいかがでしたでしょうか?
Function calling自体は非推奨になり、toolsとしての利用が推奨されていますので記事としては少々遅いかもしれません。ですがtoolsでも重なる箇所は多いと思うので、誰かの参考になれば幸いです。