モデルがあなたの関数を使う仕組み
言語モデルが書けるのはテキストだけです。あなたのコードを実行できないので、お店の値段を調べることはできません。この差を埋めるのが、関数呼び出し(ツール呼び出し)です。
あなたはモデルに関数を説明します。モデルは「この関数を呼んでください」という依頼を返し、呼び出しを行うのはあなたのプログラムです。
このレッスンのゴール
メモ
モデルが呼び出しを頼めるように、関数を説明できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| ツール | プログラムがモデルに提供する関数 | |
| ツール呼び出し | ツールを実行してほしいというモデルの依頼 | |
| スキーマ | データの形を説明したもの | |
| 引数 | 呼び出しが関数に渡す値 | {"item": "なし"} |
| 説明文 | ツールが何のためのものかをモデルに伝える言葉 |
学生が入力するセルは、このプレビューでは空白です。
ツールは名前と入力でできている
関数を提供するときは、3つのものを送ります。名前は、モデルがその関数を呼ぶときの名前です。説明文は、何をするか、いつ使うかを伝えます。パラメータは、どんな引数を受け取るかをJSONスキーマで書いたものです。
モデルはあなたのコードを見ません。読むのはこの説明だけなので、あいまいな説明だと、よくない依頼になります。
例で確認:ツールを部分ごとに見る
| 部分 | 入っているもの | このツールでは |
|---|---|---|
| name | モデルが呼ぶ名前 | get_price |
| description | 何をするか | 商品の値段を円で返す。 |
| parameters | 引数のスキーマ | itemという文字列 |
| required | 必須の引数 | item |
学生が入力するセルは、このプレビューでは空白です。
ツールの説明を表示する
docker exec -w /home/node/project agent node -e "const tool={type:'function',function:{name:'get_price',description:'商品の値段を円で返す。',parameters:{type:'object',properties:{item:{type:'string',description:'商品名。たとえばりんご'}},required:['item']}}};console.log(JSON.stringify(tool,null,2))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
モデルは結果ではなく依頼を返す
モデルがツールを使いたいとき、応答には言葉の代わりにtool_callsというリストが入っています。各呼び出しには、id、関数のname、argumentsがあります。
引数は、オブジェクトではなく、1つのJSON文字列として届きます。値を使う前に、プログラムでその文字列を読み込む必要があります。
モデルにツール呼び出しを頼む
docker exec -w /home/node/project agent node -e "const u=(process.env.AI_URL||'http://ai:4000')+'/v1/chat/completions';const ask=async(m,t)=>{const r=await fetch(u,{method:'POST',headers:{'content-type':'application/json',authorization:'Bearer lab'},body:JSON.stringify({model:'lab',messages:m,tools:t,tool_choice:'required',max_tokens:80})});const j=await r.json();if(r.ok)return j.choices[0].message;throw Error(r.status+' '+j.error.message)};const tool={type:'function',function:{name:'get_price',description:'値段を返す。',parameters:{type:'object',properties:{item:{type:'string'}}}}};(async()=>{let c;try{c=(await ask([{role:'user',content:'なしはいくらですか。'}],[tool])).tool_calls[0]}catch(e){console.log('呼び出しなし('+e.message+')。記録済みサンプル:');c={function:{name:'get_price',arguments:JSON.stringify({item:'なし'})}}}const f=c.function;console.log('名前:'+f.name);console.log('引数:'+f.arguments+' -> '+JSON.parse(f.arguments).item)})()"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
モデルが関数を実行すると思っている人が多くいます。実行はしません。書くのは依頼だけです。依頼を読み、関数を実行し、結果をどうするか決めるのは、あなたのプログラムです。
さらに:説明文を改良する
モデルに聞く実行の説明文を、たとえば値段を返すから値段に変えてみましょう。3回実行して、呼び出しが変わるか書き留めます。
モデルに聞く実行のツールには、requiredのリストがないので、モデルは商品名を入れ忘れることがあります。propertiesのあとにrequired:['item']を足して、もう一度実行し、何が変わるか書きましょう。