← Cloudflare Workers / workers / tutorials
Создайте дообученную модель OpenAI с помощью R2
В этом руководстве вы будете использовать OpenAI ↗ API и Cloudflare R2 чтобы создать дообученная модель ↗.
Эта функция API OpenAI позволяет создавать собственную модель на основе различных больших языковых моделей OpenAI, используя набор пользовательских инструкций и примеров ответов. Эти инструкции и примеры ответов записываются в документ, называемый fine-tune документом. Этот документ хранится в R2 и динамически передаётся в API OpenAI при создании новой fine-tune модели.
Чтобы использовать эту функцию, выполните следующие действия:
- Загрузите документ для дообучения в R2.
- Считайте файл R2 и загрузите его в OpenAI.
- Создайте новую дообученную модель на основе документа.
Чтобы ознакомиться с готовым кодом этого приложения, см. Репозиторий GitHub для этого руководства ↗.
Предварительные требования
Прежде чем начать, убедитесь, что у вас есть:
- Аккаунт Cloudflare с доступом к R2. Если у вас нет аккаунта Cloudflare, зарегистрироваться ↗ прежде чем продолжить. Затем приобретите R2 в панели управления Cloudflare.
- Ключ API OpenAI.
- Документ для дообучения (fine-tune), структурированный как JSON Lines ↗. Используйте пример документа ↗ в исходном коде.
1. Создайте приложение Worker
Сначала используйте c3 CLI для создания нового проекта Cloudflare Workers.
npm create cloudflare@latest -- finetune-chatgpt-modelДля настройки выберите следующие параметры:
- Для С чего вы хотите начать?, выберите
Hello World example. - Для Какой шаблон вы хотите использовать?, выберите
Worker only. - Для Какой язык вы хотите использовать?, выберите
TypeScript. - Для Хотите использовать git для контроля версий?, выберите
Yes. - Для Хотите развернуть приложение?, выберите
No(мы внесём некоторые изменения перед развёртыванием).
Эти параметры создадут проект TypeScript "Hello World".
Перейдите в только что созданный каталог:
cd finetune-chatgpt-model2. Загрузка документа для тонкой настройки в R2
Затем загрузите документ для fine-tune в R2. R2 представляет собой хранилище типа ключ-значение, которое позволяет сохранять и получать файлы прямо из вашего приложения на Workers. Далее вы будете использовать Wrangler чтобы создать новый бакет R2.
Чтобы создать новый бакет R2, используйте wrangler r2 bucket create команду. Учтите, что вход должен быть выполнен в ваш аккаунт Cloudflare. Если вход через Wrangler не выполнен, используйте wrangler login команда.
npx wrangler r2 bucket create <BUCKET_NAME>Замените <BUCKET_NAME> желаемым именем бакета. Обратите внимание, что имена бакетов должны быть в нижнем регистре и могут содержать только дефисы.
Затем загрузите файл с помощью wrangler r2 object put команда.
npx wrangler r2 object put <PATH> -f <FILE_NAME><PATH> это объединённый путь к бакету и файлу, который вы хотите загрузить, например, fine-tune-ai/finetune.jsonl, где fine-tune-ai это имя бакета. Замените <FILE_NAME> локальным именем файла вашего fine-tune документа.
3. Привязка бакета к Worker
Привязка (binding) представляет собой способ, которым ваш Worker взаимодействует с внешними ресурсами, такими как R2 bucket.
Чтобы привязать бакет R2 к Worker, добавьте следующее в файл Wrangler. Замените значение свойства binding на допустимый идентификатор переменной JavaScript. Замените <YOUR_BUCKET_NAME> именем бакета, который вы создали в шаг 2:
{
"r2_buckets": [
{
"binding": "MY_BUCKET", // <~ valid JavaScript variable name
"bucket_name": "<YOUR_BUCKET_NAME>"
}
]
}[[r2_buckets]]
binding = "MY_BUCKET"
bucket_name = "<YOUR_BUCKET_NAME>"4. Инициализируйте приложение Worker
Вы будете использовать Hono ↗, легковесный фреймворк для создания приложений Cloudflare Workers. Hono предоставляет интерфейс для определения маршрутов и функций промежуточного слоя (middleware). Находясь в каталоге вашего проекта, выполните следующую команду для установки Hono:
npm i honoТакже нужно установить OpenAI Node API library ↗. Эта библиотека обеспечивает удобный доступ к REST API OpenAI в проекте на Node.js. Чтобы установить библиотеку, выполните следующую команду:
npm i openaiЗатем откройте src/index.ts файл и замените код по умолчанию кодом ниже. Замените <MY_BUCKET> с именем привязки, которое вы указали в файле Wrangler.
import { Context, Hono } from "hono";
import OpenAI from "openai";
type Bindings = {
<MY_BUCKET>: R2Bucket
OPENAI_API_KEY: string
}
type Variables = {
openai: OpenAI
}
const app = new Hono<{ Bindings: Bindings, Variables: Variables }>()
app.use('*', async (c, next) => {
const openai = new OpenAI({
apiKey: c.env.OPENAI_API_KEY,
})
c.set("openai", openai)
await next()
})
app.onError((err, c) => {
return c.text(err.message, 500)
})
export default app;В приведённом выше коде вы сначала импортируете необходимые пакеты и определяете типы. Затем вы инициализируете app как новый экземпляр Hono. Используя use middleware-функцию вы добавляете клиент OpenAI API в контекст всех маршрутов. Эта middleware-функция позволяет обращаться к клиенту из любого обработчика маршрута. onError() определяет обработчик ошибок, который возвращает все ошибки в виде ответа JSON.
5. Прочитайте файлы R2 и загрузите их в OpenAI
В этом разделе вы определите маршрут и функцию, отвечающие за обработку загрузки файлов.
В createFile, ваш Worker считывает файл из R2 и преобразует его в File объект. Затем ваш Worker использует OpenAI API для загрузки файла и возврата ответа.
GET /files маршрут ожидает GET запросы с параметром запроса file, представляющий имя файла загруженного документа для дообучения (fine-tune) в R2. Функция использует createFile функцию для управления процессом загрузки файла.
Замените <MY_BUCKET> с именем привязки, которое вы указали в файле Wrangler.
// New import added at beginning of file
import { toFile } from 'openai/uploads'
const createFile = async (c: Context, r2Object: R2ObjectBody) => {
const openai: OpenAI = c.get("openai")
const blob = await r2Object.blob()
const file = await toFile(blob, r2Object.key)
const uploadedFile = await openai.files.create({
file,
purpose: "fine-tune",
})
return uploadedFile
}
app.get('/files', async c => {
const fileQueryParam = c.req.query("file")
if (!fileQueryParam) return c.text("Missing file query param", 400)
const file = await c.env.<MY_BUCKET>.get(fileQueryParam)
if (!file) return c.text("Couldn't find file", 400)
const uploadedFile = await createFile(c, file)
return c.json(uploadedFile)
})6. Создайте дообученные модели
В этот раздел входит GET /models маршрут и createModel функция. Функция createModel берет на себя указание деталей и запуск процесса дообучения в OpenAI. Маршрут обрабатывает входящие запросы на создание новой дообученной модели.
const createModel = async (c: Context, fileId: string) => {
const openai: OpenAI = c.get("openai");
const body = {
training_file: fileId,
model: "gpt-4o-mini",
};
return openai.fineTuning.jobs.create(body);
};
app.get("/models", async (c) => {
const fileId = c.req.query("file_id");
if (!fileId) return c.text("Missing file ID query param", 400);
const model = await createModel(c, fileId);
return c.json(model);
});7. Выведите список всех задач дообучения
В этом разделе описывается GET /jobs маршрут и соответствующий getJobs функция. Функция взаимодействует с API OpenAI, чтобы получить список всех задач fine-tuning. Маршрут предоставляет интерфейс для получения этой информации.
const getJobs = async (c: Context) => {
const openai: OpenAI = c.get("openai");
const resp = await openai.fineTuning.jobs.list();
return resp.data;
};
app.get("/jobs", async (c) => {
const jobs = await getJobs(c);
return c.json(jobs);
});8. Разверните приложение
После создания Worker-приложения и добавления необходимых функций разверните приложение.
Прежде чем развернуть приложение, необходимо задать OPENAI_API_KEY secret для вашего приложения. Сделайте это, выполнив команду wrangler secret put команда:
npx wrangler secret put OPENAI_API_KEYЧтобы развернуть приложение Worker в глобальной сети Cloudflare:
- Убедитесь, что вы находитесь в каталоге проекта Worker, затем выполните
wrangler deployкоманда:
npx wrangler deploy-
Wrangler упакует и загрузит ваш код.
-
После развёртывания приложения Wrangler предоставит URL вашего Worker.
9. Просмотрите статус задачи дообучения и используйте модель
Чтобы использовать приложение, создайте новое задание дообучения, отправив запрос к /files с file параметр запроса, соответствующий имени файла, который вы загрузили ранее:
curl https://your-worker-url.com/files?file=finetune.jsonlПосле загрузки файла отправьте ещё один запрос к /models, передав file_id параметр запроса. Он должен соответствовать id возвращается в виде JSON из /files маршрут:
curl https://your-worker-url.com/models?file_id=file-abc123Наконец, перейдите на /jobs чтобы увидеть статус задач дообучения (fine-tune) в OpenAI. После завершения задачи дообучения вы сможете увидеть fine_tuned_model значение, указывающее на то, что была создана дообученная модель.
Перейдите в OpenAI Playground ↗ чтобы использовать дообученную модель. Выберите дообученную модель в раскрывающемся списке в левом верхнем углу интерфейса.
Используйте его в любых запросах к эндпоинтам chat completions API OpenAI. Например, в приведённом ниже примере кода:
openai.chat.completions.create({
messages: [{ role: "system", content: "You are a helpful assistant." }],
model: "ft:gpt-4o-mini:my-org:custom_suffix:id",
});Следующие шаги
Чтобы узнать больше о работе с Workers, см. Руководства.
Если у вас есть вопросы, нужна помощь или вы хотите поделиться своим проектом, присоединяйтесь к сообществу разработчиков Cloudflare на Discord ↗ чтобы пообщаться с другими разработчиками и командой Cloudflare.