今週のざっくばらん
SlashGPT、function chaining
OpenAIがGPT3.5/GPT4に追加した、function_call の仕組みが、NLUI(Natural Language UI)を実現する上で、重要な役割を果たすという話は、以前ここに書きましたが、その後、どんな場面でどのくらい有効に使えるかを調べるために、(先日オープンソース化したSlashGPTを活用して)さまざまなプロトタイプを作ってみたので、その結果を報告します。今回、特に重視したのは、目標を達成するために、関連する関数を適切な順番に呼び出すことが出来るか、です。指定された順での関数の実行
簡単な例として、必要な関数を指定された順番通りに呼び出すケースがあります。
"home2"という名前のボットは、ホームオートメーションのフロントエンドとして開発していますが、「リビングの電気を付けて、写真を撮影して、電気を消して」というユーザーからの指定に対して、以下のように正しい順番で実行してくれます。写真を撮影して欲しいのはリビングであり、最後に消すのもリビングの電気であることをちゃんと理解してくれます。control_light(location="living room", switch="on")
take_picture(location="living room")
control_light(location="living room", switch="off")
ユーザーから見える会話だけを抜き出すと。
user: リビングの電気を付けて、写真を撮影して、電気を消して
assistant: リビングの電気を付けました。写真を撮影しました。そして、電気を消しました。
となりますが、ユーザーには見えないところで、functionの結果が、チャットメッセージとして以下のようにGPT3.5に渡されています。
user: リビングの電気を付けて、写真を撮影して、電気を消して
function: Success. The light switch of living room is now on.
function: Success. I took a picture of living room
function: Success. The light switch of living room is now off.
assistant: リビングの電気を付けました。写真を撮影しました。そして、電気を消しました。
functionからの戻り値が、自然言語であることに注目してください。GPT3.5は、言語処理が得意なので、これで十分なのです。一つの関数の戻り値を利用して、次の関数を実行
次は、単に順番に複数の関数を呼び出すだけではなく、前に呼び出した関数からの戻り値を次の関数に対する引数として使うケースを試してみました。
具体的には、「Tim Cookとの7月4日9時からのミーティングを設定した上で、彼のメアド、tim@apple.comに招待状を送って」というものです("cal"という名前のボットとして実装してあります)。
このケースでは、最初に make_event function でミーティングを設置すると、戻り値として、invitation_link という名前のURLが戻されるので、それを2番目の関数、send_invitationに正しく渡してくれます。{ invitation_link } = make_event(SUMMARY="Meeting with Tim Cook", ...)
send_invitation(invitation_link=ical_link、recipients=["tim@apple.com"])
make_eventからの戻り値は、上のホームオートメーションのように自然言語でも構いませんが、曖昧さをなくすために JSON フォーマットで戻しています。複雑な依存関係を持つ関数の正しい順番での実行
さらに複雑なものが処理できるかをテストするために、「料理ロボット」を想定して、「材料の下準備をした上で調理する」ことが出来るかどうかを試してみました(ボット名"Cook")
ユーザーとして与えた指令(プロンプト)は「豚肉野菜炒めを4人前作って」だけですが、システムプロンプトとして、豚肉野菜炒めのレシピを以下のようなJSON形式的で与えています。[
{
"name": "Pork vegetable stir fly for two",
"ingredients": [
{
"ingredient": "sliced pork",
"amount": 150
},
{
"ingredient": "chopped green pepper",
"amount": 200
},
{
"ingredient": "chopped cabbage",
"amount": 200
},
{
"ingredient": "bean sprouts",
"amount": 100
},
{
"ingredient": "chopped carrot",
この記事は約
NaN 分で読めます(
NaN 文字 / 画像
NaN
枚)