תיעוד 205
יצירת מודל OpenAI מכוונן עם R2
במדריך זה תשתמשו ב-API של OpenAI וב-Cloudflare R2 כדי ליצור מודל מכוונן.
היכולת הזו ב-API של OpenAI מאפשרת לגזור מודל מותאם ממודלי השפה הגדולים השונים של OpenAI, על בסיס קבוצה של הוראות מותאמות ותשובות לדוגמה. ההוראות ותשובות הדוגמה נכתבות במסמך, שנקרא מסמך כיוונון (fine-tune document). המסמך יישמר ב-R2 ויסופק באופן דינמי ל-API של OpenAI בעת יצירת מודל מכוונן חדש.
כדי להשתמש ביכולת הזו, תבצעו את המשימות הבאות:
- העלאת מסמך כיוונון ל-R2.
- קריאת הקובץ מ-R2 והעלאתו ל-OpenAI.
- יצירת מודל מכוונן חדש על בסיס המסמך.

כדי לעיין בקוד המושלם של היישום הזה, פנו אל מאגר GitHub של המדריך.
#דרישות מוקדמות
לפני שמתחילים, ודאו שיש לכם:
- חשבון Cloudflare עם גישה ל-R2. אם אין לכם חשבון Cloudflare, הירשמו לפני שממשיכים. אחר כך רכשו את R2 מלוח הבקרה של Cloudflare.
- מפתח API של OpenAI.
- מסמך כיוונון, במבנה של JSON Lines. השתמשו במסמך הדוגמה שבקוד המקור.
#1. יצירת יישום Worker
תחילה, השתמשו ב-CLI של c3 כדי ליצור פרויקט Cloudflare Workers חדש.
npm
npm create cloudflare@latest -- finetune-chatgpt-modelyarn
yarn create cloudflare finetune-chatgpt-modelpnpm
pnpm create cloudflare@latest finetune-chatgpt-modelבהתקנה, בחרו באפשרויות הבאות:
- עבור What would you like to start with?, בחרו
Hello World example. - עבור Which template would you like to use?, בחרו
Worker only. - עבור Which language do you want to use?, בחרו
TypeScript. - עבור Do you want to use git for version control?, בחרו
Yes. - עבור Do you want to add an AGENTS.md file to help AI coding tools understand Cloudflare APIs?, בחרו
Yes. - עבור Do you want to deploy your application?, בחרו
No(נבצע כמה שינויים לפני הפריסה).
האפשרויות שלמעלה ייצרו את פרויקט TypeScript מסוג "Hello World".
עברו אל הספרייה החדשה שנוצרה:
cd finetune-chatgpt-model#2. העלאת מסמך כיוונון ל-R2
בשלב הבא, העלו את מסמך הכיוונון ל-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> בשם הקובץ המקומי של מסמך הכיוונון.
#3. קישור הדלי ל-Worker
קישור (binding) הוא האופן שבו ה-Worker מתקשר עם משאבים חיצוניים כמו דלי R2.
כדי לקשר את דלי 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
npm i honoyarn
yarn add honopnpm
pnpm add honobun
bun add honoצריך גם להתקין את ספריית OpenAI Node API. הספרייה מספקת גישה נוחה ל-REST API של OpenAI בפרויקט Node.js. כדי להתקין את הספרייה, הריצו את הפקודה הבאה:
npm
npm i openaiyarn
yarn add openaipnpm
pnpm add openaibun
bun add openaiבשלב הבא, פתחו את הקובץ src/index.ts והחליפו את קוד ברירת המחדל בקוד שלמטה. החליפו את <MY_BUCKET> בשם ה-binding שהגדרתם בקובץ 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 חדש. באמצעות פונקציית ה-middleware use, מוסיפים את לקוח ה-API של OpenAI להקשר של כל הנתיבים. פונקציית ה-middleware הזו מאפשרת לגשת ללקוח מתוך כל מטפל נתיב. onError() מגדיר מטפל שגיאות כדי להחזיר כל שגיאה כתגובת JSON.
#5. קריאת קבצי R2 והעלאתם ל-OpenAI
בסעיף זה תגדירו את הנתיב ואת הפונקציה שאחראים לטיפול בהעלאות קבצים.
ב-createFile, ה-Worker קורא את הקובץ מ-R2 וממיר אותו לאובייקט File. אחר כך ה-Worker משתמש ב-API של OpenAI כדי להעלות את הקובץ ולהחזיר את התגובה.
הנתיב GET /files מאזין לבקשות GET עם פרמטר שאילתה file, שמייצג שם קובץ של מסמך כיוונון שהועלה ל-R2. הפונקציה משתמשת בפונקציה createFile כדי לנהל את תהליך העלאת הקובץ.
החליפו את <MY_BUCKET> בשם ה-binding שהגדרתם בקובץ 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 כדי לאחזר רשימה של כל משימות הכיוונון העדין. הנתיב מספק ממשק לאחזור המידע הזה.
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 והוספתם את הפונקציות הנדרשות, פרסו את היישום.
לפני הפריסה, חובה להגדיר את ה-secret OPENAI_API_KEY עבור היישום. עשו זאת באמצעות הרצת הפקודה 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 כדי לראות את המצב של משימות הכיוונון ב-OpenAI. אחרי שמשימת הכיוונון הושלמה, אפשר לראות את הערך fine_tuned_model, שמציין שמודל מכוונן נוצר.

בקרו ב-OpenAI Playground כדי להשתמש במודל המכוונן. בחרו את המודל המכוונן מהרשימה הנפתחת בפינה השמאלית העליונה של הממשק.

השתמשו בו בכל בקשות API שאתם שולחים לנקודות הקצה של chat completions של 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.