INTEGRITY Документация

Вызов функций

Вызов функций позволяет использовать большие языковые модели (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-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: "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, который можно использовать для вызова функций.