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

Вызов функций OpenAI GPT с помощью JavaScript и Cloudflare Workers

В этом руководстве вы создадите проект, использующий Вызов функций OpenAI функция, доступная в новейших моделях Chat Completions API от OpenAI.

Функция вызова функций (function calling) позволяет ИИ-модели самостоятельно решать, когда вызывать функцию, на основе входных данных, и отвечать в формате JSON в соответствии с сигнатурой функции. Вы будете использовать её, чтобы запросить у модели URL сайта, содержащего информацию, релевантную сообщению пользователя, получить текстовое содержимое этого сайта и в итоге вернуть финальный ответ модели, учитывающий актуальные данные из интернета.

Чему вы научитесь


Прежде чем начать

Во всех руководствах предполагается, что вы уже выполнили Руководство по началу работы, который поможет вам настроить аккаунт Cloudflare Workers, C3, а также Wrangler.

1. Создайте новый проект Worker

Создайте проект Worker в командной строке:

npm create cloudflare@latest -- openai-function-calling-workers

Для настройки выберите следующие параметры:

Перейдите в свой новый openai-function-calling-workers проект Worker:

cd openai-function-calling-workers

Внутри вашего нового openai-function-calling-workers каталог, найдите src/index.js файле. Вы будете настраивать этот файл на протяжении большей части этого руководства.

Для этого руководства вам также понадобятся аккаунт OpenAI и API ключ. Если у вас их ещё нет, создать новую учётную запись OpenAI и создать API-ключ чтобы продолжить это руководство. Обязательно сохраните свой API-ключ в надёжном месте, чтобы использовать его позже.

2. Отправка запроса в OpenAI

Создав проект Worker, выполните первый запрос к OpenAI. Для работы с API OpenAI вы будете использовать библиотеку OpenAI для Node, а для обработки HTML-контента сайтов в этом проекте также используется библиотека Cheerio

npm i openai cheerio

Теперь определите структуру Worker в index.js:

export default {
	async fetch(request, env, ctx) {
		// Initialize OpenAI API
		// Handle incoming requests
		return new Response("Hello World!");
	},
};

Выше export default, добавьте импорты для openai и cheerio:

import OpenAI from "openai";
import * as cheerio from "cheerio";

Внутри fetch функция, создайте экземпляр вашего OpenAI клиент:

async fetch(request, env, ctx) {
  const openai = new OpenAI({
    apiKey: env.OPENAI_API_KEY,
  });

  // Handle incoming requests
  return new Response('Hello World!');
},

Используйте wrangler secret put чтобы задать OPENAI_API_KEY. Это секрета значение представляет собой ключ API, который вы создали ранее в панели управления OpenAI:

npx wrangler secret put <OPENAI_API_KEY>

Для локальной разработки создайте новый файл .dev.vars в проекте вашего Worker и добавьте эту строку. Обязательно замените OPENAI_API_KEY собственным ключом API OpenAI:

OPENAI_API_KEY = "<YOUR_OPENAI_API_KEY>"

Теперь отправьте запрос к OpenAI Chat Completions API:

export default {
	async fetch(request, env, ctx) {
		const openai = new OpenAI({
			apiKey: env.OPENAI_API_KEY,
		});

		const url = new URL(request.url);
		const message = url.searchParams.get("message");

		const messages = [
			{
				role: "user",
				content: message ? message : "What's in the news today?",
			},
		];

		const tools = [
			{
				type: "function",
				function: {
					name: "read_website_content",
					description: "Read the content on a given website",
					parameters: {
						type: "object",
						properties: {
							url: {
								type: "string",
								description: "The URL to the website to read",
							},
						},
						required: ["url"],
					},
				},
			},
		];

		const chatCompletion = await openai.chat.completions.create({
			model: "gpt-4o-mini",
			messages: messages,
			tools: tools,
			tool_choice: "auto",
		});

		const assistantMessage = chatCompletion.choices[0].message;
		console.log(assistantMessage);

		//Later you will continue handling the assistant's response here
		return new Response(assistantMessage.content);
	},
};

Проверьте аргументы, которые вы передаёте в OpenAI:

3. Сборка вашего read_website_content() функция

Теперь вам нужно определить read_website_content функция, на которую есть ссылка в tools массив. Поле read_website_content функция получает содержимое указанного URL и извлекает текст из <p> теги с помощью cheerio библиотека:

Добавьте этот код над export default блок в вашем index.js файле:

async function read_website_content(url) {
	console.log("reading website content");

	const response = await fetch(url);
	const body = await response.text();
	let cheerioBody = cheerio.load(body);
	const resp = {
		website_body: cheerioBody("p").text(),
		url: url,
	};
	return JSON.stringify(resp);
}

В этой функции вы берёте URL, полученный от OpenAI, и используете метод JavaScript Fetch API чтобы получить содержимое сайта и извлечь текст абзацев. Теперь нужно определить, когда вызывать эту функцию.

4. Обработайте сообщения ассистента

Далее нужно обработать ответ OpenAI API и проверить, содержит ли он вызовы функций. Если вызов функции присутствует, выполните соответствующую функцию в своём Worker. Учтите, что ассистент может запросить сразу несколько вызовов функций.

Измените метод fetch внутри export default блок следующим образом:

// ... your previous code ...

if (assistantMessage.tool_calls) {
	for (const toolCall of assistantMessage.tool_calls) {
		if (toolCall.function.name === "read_website_content") {
			const url = JSON.parse(toolCall.function.arguments).url;
			const websiteContent = await read_website_content(url);
			messages.push({
				role: "tool",
				tool_call_id: toolCall.id,
				name: toolCall.function.name,
				content: websiteContent,
			});
		}
	}

	const secondChatCompletion = await openai.chat.completions.create({
		model: "gpt-4o-mini",
		messages: messages,
	});

	return new Response(secondChatCompletion.choices[0].message.content);
} else {
	// this is your existing return statement
	return new Response(assistantMessage.content);
}

Проверьте, содержит ли сообщение ассистента вызовы функций, проверив наличие tool_calls свойство. Поскольку по умолчанию модель ИИ может вызывать несколько функций, вам нужно перебрать все возможные вызовы функций в цикле и добавить их в messages массив. Каждый read_website_content вызов приведет к вызову read_website_content функцию, которую вы определили ранее, и передайте URL, сгенерированный OpenAI, в качестве аргумента. `

secondChatCompletion нужен, чтобы сформировать ответ на основе данных, полученных при каждом вызове функции. Осталось выполнить последний шаг: развернуть Worker.

Протестируйте код, выполнив команду npx wrangler dev и откройте указанный URL в браузере. Теперь вы увидите ответ OpenAI, использующий актуальные данные, полученные из веба.

5. Разверните приложение Worker

Чтобы развернуть приложение, выполните npx wrangler deploy команду, чтобы развернуть приложение Worker:

npx wrangler deploy

Теперь Worker можно предварительно просмотреть по адресу <YOUR_WORKER>.<YOUR_SUBDOMAIN>.workers.dev. Переход по этому URL отобразит ответ от OpenAI. При желании добавьте message параметр URL, чтобы указать собственное сообщение: например, https://<YOUR_WORKER>.<YOUR_SUBDOMAIN>.workers.dev/?message=What is the weather in NYC today?.

6. Дальнейшие шаги

См. готовый код для этого руководства на GitHub.

Чтобы продолжить работу с Workers и AI, см. руководство о совместном использовании LangChain и Cloudflare Workers или как создать плагин ChatGPT с помощью Cloudflare Workers.

Если у вас есть вопросы, нужна помощь или вы хотите поделиться своим проектом, присоединяйтесь к сообществу разработчиков Cloudflare на Discord чтобы пообщаться с другими разработчиками и командой Cloudflare.