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

Создайте дообученную модель OpenAI с помощью R2

В этом руководстве вы будете использовать OpenAI API и Cloudflare R2 чтобы создать дообученная модель.

Эта функция API OpenAI позволяет создавать собственную модель на основе различных больших языковых моделей OpenAI, используя набор пользовательских инструкций и примеров ответов. Эти инструкции и примеры ответов записываются в документ, называемый fine-tune документом. Этот документ хранится в R2 и динамически передаётся в API OpenAI при создании новой fine-tune модели.

Чтобы использовать эту функцию, выполните следующие действия:

  1. Загрузите документ для дообучения в R2.
  2. Считайте файл R2 и загрузите его в OpenAI.
  3. Создайте новую дообученную модель на основе документа.
Демо

Чтобы ознакомиться с готовым кодом этого приложения, см. Репозиторий GitHub для этого руководства.

Предварительные требования

Прежде чем начать, убедитесь, что у вас есть:

1. Создайте приложение Worker

Сначала используйте c3 CLI для создания нового проекта Cloudflare Workers.

npm create cloudflare@latest -- finetune-chatgpt-model

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

Эти параметры создадут проект TypeScript "Hello World".

Перейдите в только что созданный каталог:

cd finetune-chatgpt-model

2. Загрузка документа для тонкой настройки в 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:

  1. Убедитесь, что вы находитесь в каталоге проекта Worker, затем выполните wrangler deploy команда:
npx wrangler deploy
  1. Wrangler упакует и загрузит ваш код.

  2. После развёртывания приложения 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.