函数调用使人们能够使用大型语言模型 (LLM),并利用模型响应来执行函数或与外部 API 交互。开发人员通常会定义一组函数以及每个函数所需的输入模式,我们称之为 tools
。然后,模型会智能地理解何时需要进行工具调用,并返回一个 JSON 输出,用户需要将该输出提供给另一个函数或 API。
实质上,函数调用允许您通过执行代码或进行额外的 API 调用来使用 LLM 执行操作。
Workers AI 具有嵌入式函数调用,允许您在推理调用旁边执行函数代码。我们有一个名为 @cloudflare/ai-utils
↗ 的包来帮助实现这一点,我们已经在 Github ↗ 上开源了它。
对于行业标准的函数调用,请查看有关传统函数调用的文档。
为了向您展示嵌入式函数调用的价值,请看下面的示例,该示例比较了传统函数调用和嵌入式函数调用。嵌入式函数调用使我们能够将代码行数从 77 行减少到 31 行。
# ai-utils 包支持嵌入式函数调用npm i @cloudflare/ai-utils
import { 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: "谁是 Github 上的 Cloudflare?" }], 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: "谁是 Github 上的 Cloudflare?" }], 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: "谁是 Github 上的 Cloudflare?", }, { role: "assistant", content: JSON.stringify(selected_tool), }, { role: "tool", 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 的一个微调变体,可用于函数调用。
- @2025 Cloudflare Ubitools
- Cf Repo