← Cloudflare Workers AI / workers-ai / features
Вызов функций
Вызов функций позволяет использовать большие языковые модели (LLM) и с помощью ответа модели выполнять функции или обращаться к внешним API. Как правило, разработчик определяет набор функций и требуемую схему входных данных для каждой функции, которую мы называем tools. Модель самостоятельно определяет, когда ей нужно выполнить вызов инструмента, и возвращает вывод в формате JSON, который пользователь должен передать в другую функцию или API.
По сути, вызов функций позволяет LLM выполнять действия путём выполнения кода или дополнительных обращений к API.
Как использовать вызов функций?
Workers AI имеет embedded function calling который позволяет выполнять код функций вместе с вызовами инференса. У нас есть пакет с названием @cloudflare/ai-utils ↗ чтобы упростить этот процесс. Мы открыли его исходный код на Github ↗.
Информацию об отраслевом стандарте вызова функций можно найти в документации на Традиционный вызов функций.
Чтобы показать ценность встроенного вызова функций, посмотрите на пример ниже, где сравниваются традиционный вызов функций и встроенный вызов функций. Встроенный вызов функций позволил сократить количество строк кода с 77 до 31.
# The ai-utils package enables embedded function calling
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: "Who is Cloudflare on github?" }],
tools: [
// You can pass the OpenAPI spec link or contents directly
...(await createToolsFromOpenAPISpec(
"https://gist.githubusercontent.com/mchenco/fd8f20c8f06d50af40b94b0671273dc1/raw/f9d4b5cd5944cc32d6b34cad0406d96fd3acaca6/partial_api.github.com.json",
{
overrides: [
{
// for all requests on *.github.com, we'll need to add a 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: "Who is Cloudflare on GitHub?" }],
tools: [
{
name: "getGithubUser",
description:
"Provides publicly available information about someone with a GitHub account.",
parameters: {
type: "object",
properties: {
username: {
type: "string",
description: "The handle for the GitHub user account.",
},
},
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 requires a User-Agent header
"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: "Who is Cloudflare on GitHub?",
},
{
role: "assistant",
content: JSON.stringify(selected_tool),
},
{
role: "tool",
content: JSON.stringify(res),
},
],
tools: [
{
name: "getGithubUser",
description:
"Provides publicly available information about someone with a GitHub account.",
parameters: {
type: "object",
properties: {
username: {
type: "string",
description: "The handle for the GitHub user account.",
},
},
required: ["username"],
},
},
],
},
);
return new Response(JSON.stringify(finalResponse));
},
};Какие модели поддерживают вызов функций?
Существуют fine-tuned модели с открытым исходным кодом для вызова функций. При просмотре нашего каталог моделей, ищите модели, у которых рядом указано свойство function calling. Например, @hf/nousresearch/hermes-2-pro-mistral-7b это fine-tuned вариант Mistral 7B, который можно использовать для вызова функций.