← Cloudflare Workers / workers / tutorials
Вызов функций OpenAI GPT с помощью JavaScript и Cloudflare Workers
В этом руководстве вы создадите проект, использующий Вызов функций OpenAI ↗ функция, доступная в новейших моделях Chat Completions API от OpenAI.
Функция вызова функций (function calling) позволяет ИИ-модели самостоятельно решать, когда вызывать функцию, на основе входных данных, и отвечать в формате JSON в соответствии с сигнатурой функции. Вы будете использовать её, чтобы запросить у модели URL сайта, содержащего информацию, релевантную сообщению пользователя, получить текстовое содержимое этого сайта и в итоге вернуть финальный ответ модели, учитывающий актуальные данные из интернета.
Чему вы научитесь
- Как использовать функцию function calling от OpenAI.
- Интеграция API OpenAI в Cloudflare Worker.
- Получение и обработка содержимого веб-сайта с помощью Cheerio.
- Обработка ответов API и вызовов функций в JavaScript.
- Хранение API-ключей в виде secrets с помощью Wrangler.
Прежде чем начать
Во всех руководствах предполагается, что вы уже выполнили Руководство по началу работы, который поможет вам настроить аккаунт Cloudflare Workers, C3 ↗, а также Wrangler.
1. Создайте новый проект Worker
Создайте проект Worker в командной строке:
npm create cloudflare@latest -- openai-function-calling-workersДля настройки выберите следующие параметры:
- Для С чего вы хотите начать?, выберите
Hello World example. - Для Какой шаблон вы хотите использовать?, выберите
Worker only. - Для Какой язык вы хотите использовать?, выберите
JavaScript. - Для Хотите использовать git для контроля версий?, выберите
Yes. - Для Хотите развернуть приложение?, выберите
No(мы внесём некоторые изменения перед развёртыванием).
Перейдите в свой новый 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:
- модель: Это модель, которую OpenAI должен использовать для вашего запроса. В данном случае используется
gpt-4o-mini. - сообщения: Это массив, содержащий все сообщения диалога. Сначала вы передаёте сообщение пользователя, а затем мы добавляем ответ модели. Содержимое сообщения пользователя представляет собой либо
messageпараметр запроса из URL запроса или значение по умолчанию "What's in the news today?". - tools: Массив, содержащий действия, доступные модели ИИ. В этом примере у вас есть только один инструмент,
read_website_content, который считывает содержимое указанного сайта.- имя: Имя вашей функции. В данном случае это
read_website_content. - описание: Краткое описание, которое сообщает модели о назначении функции. Это необязательно, но помогает модели понять, когда выбирать этот инструмент.
- параметры: Объект JSON Schema, который описывает функцию. В этом случае мы запрашиваем ответ, содержащий объект с обязательным свойством
url.
- имя: Имя вашей функции. В данном случае это
- tool_choice: Формально этот аргумент необязателен, так как
autoиспользуется по умолчанию. Этот аргумент означает, что 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.