関数呼び出し
ベータ関数呼び出しは、人々が大規模言語モデル(LLM)を利用し、モデルの応答を使って関数を実行したり、外部APIと対話したりすることを可能にします。開発者は通常、一連の関数と各関数に必要な入力スキーマを定義します。これをtoolsと呼びます。モデルは、ツール呼び出しが必要なときにそれを理解し、ユーザーが別の関数やAPIに渡す必要があるJSON出力を返します。
本質的に、関数呼び出しは、コードを実行したり、追加のAPI呼び出しを行ったりすることでLLMを使ってアクションを実行することを可能にします。
Workers AIは、推論呼び出しとともに関数コードを実行できる埋め込み関数呼び出しを提供しています。これを容易にするために、@cloudflare/ai-utils ↗というパッケージを用意しており、Github ↗でオープンソース化しています。
業界標準の関数呼び出しについては、従来の関数呼び出しのドキュメントを参照してください。
埋め込み関数呼び出しの価値を示すために、従来の関数呼び出しと埋め込み関数呼び出しを比較した以下の例を見てみましょう。埋め込み関数呼び出しを使用することで、コードの行数を77から31に削減することができました。
# ai-utilsパッケージは埋め込み関数呼び出しを可能にしますnpm i @cloudflare/ai-utilsimport { createToolsFromOpenAPISpec, runWithTools, autoTrimTools,} from "@cloudflare/ai-utils";
export default { async fetch(request, env, ctx) { const response = await runWithTools( env.AI, "@hf/nousresearch/hermes-2-pro-mistral-7b", { messages: [{ role: "user", content: "Cloudflareはgithubで誰ですか?" }], tools: [ // OpenAPI仕様のリンクまたは内容を直接渡すことができます ...(await createToolsFromOpenAPISpec( "https://gist.githubusercontent.com/mchenco/fd8f20c8f06d50af40b94b0671273dc1/raw/f9d4b5cd5944cc32d6b34cad0406d96fd3acaca6/partial_api.github.com.json", { overrides: [ { // *.github.comのすべてのリクエストにはUser-Agentを追加する必要があります。 matcher: ({ url, method }) => { return url.hostname === "api.github.com"; }, values: { headers: { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", }, }, }, ], }, )), ], }, ).then((response) => { return response; });
return new Response(JSON.stringify(response)); },};export default { async fetch(request, env, ctx) { const response = await env.AI.run( "@hf/nousresearch/hermes-2-pro-mistral-7b", { messages: [{ role: "user", content: "Cloudflareはgithubで誰ですか?" }], tools: [ { name: "getGithubUser", description: "GitHubアカウントを持つ誰かに関する公開情報を提供します。", parameters: { type: "object", properties: { username: { type: "string", description: "GitHubユーザーアカウントのハンドル。", }, }, required: ["username"], }, }, ], }, );
const selected_tool = response.tool_calls[0]; let res;
if (selected_tool.name == "getGithubUser") { try { const username = selected_tool.arguments.username; const url = `https://api.github.com/users/${username}`; res = await fetch(url, { headers: { // Github APIはUser-Agentヘッダーを必要とします "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", }, }).then((res) => res.json()); } catch (error) { return error; } }
const finalResponse = await env.AI.run( "@hf/nousresearch/hermes-2-pro-mistral-7b", { messages: [ { role: "user", content: "Cloudflareはgithubで誰ですか?", }, { role: "assistant", content: "", tool_call: selected_tool.name, }, { role: "tool", name: selected_tool.name, content: JSON.stringify(res), }, ], tools: [ { name: "getGithubUser", description: "GitHubアカウントを持つ誰かに関する公開情報を提供します。", parameters: { type: "object", properties: { username: { type: "string", description: "GitHubユーザーアカウントのハンドル。", }, }, required: ["username"], }, }, ], }, ); return new Response(JSON.stringify(finalResponse)); },};関数呼び出しを行うようにファインチューニングされたオープンソースモデルがあります。私たちのモデルカタログを閲覧する際には、関数呼び出しプロパティが付いているモデルを探してください。例えば、@hf/nousresearch/hermes-2-pro-mistral-7bは、関数呼び出しに使用できるMistral 7Bのファインチューニングされたバリアントです。