ניהול הנחיות באמצעות Dotprompt

תכנון ההנחיות הוא הדרך העיקרית שבה מפתחי אפליקציות יכולים להשפיע על הפלט של מודלים של בינה מלאכותית גנרטיבית. לדוגמה, כשמשתמשים במודלים מסוג LLM, אפשר ליצור הנחיות שמשפיעות על הטון, הפורמט, האורך ומאפיינים אחרים של התשובות של המודלים.

האופן שבו כותבים את ההנחיות האלה תלוי במודל שבו אתם משתמשים. יכול להיות שהנחיה שנכתבה עבור מודל אחד לא תניב תוצאות טובות כשמשתמשים בה עם מודל אחר. באופן דומה, הפרמטרים של המודל שתגדירו (טמפרטורה, top-k וכו') ישפיעו גם הם על הפלט באופן שונה בהתאם למודל.

לרוב, לא קל לגרום לכל שלושת הגורמים האלה – המודל, הפרמטרים של המודל וההנחיה – לפעול יחד כדי ליצור את הפלט הרצוי, ולרוב התהליך כולל חזרות ניסיוניות רבות. Genkit מספק ספרייה ופורמט קובץ שנקרא Dotprompt, שנועדו להפוך את התהליך הזה למהיר ונוח יותר.

Dotprompt מבוסס על ההנחה שהנחיות הן קוד. אתם מגדירים את ההנחיות, יחד עם המודלים והפרמטרים שלהם, בנפרד מקוד האפליקציה. לאחר מכן, אתם (או אולי מישהו שלא מעורב בכתיבה של קוד האפליקציה) יכולים לבצע חזרה מהירה על ההנחיות ועל הפרמטרים של המודל באמצעות ממשק המשתמש של Genkit למפתחים. אחרי שההנחיות פועלות כמו שרציתם, תוכלו לייבא אותן לאפליקציה ולהריץ אותן באמצעות Genkit.

כל הגדרות ההנחיות נשמרות בקובץ עם סיומת .prompt. דוגמה למראה של הקבצים האלה:

---
model: googleai/gemini-1.5-flash
config:
  temperature: 0.9
input:
  schema:
    location: string
    style?: string
    name?: string
  default:
    location: a restaurant
---

You are the world's most welcoming AI assistant and are currently working at {{location}}.

Greet a guest{{#if name}} named {{name}}{{/if}}{{#if style}} in the style of {{style}}{{/if}}.

החלק שמופיע בין שלוש הקווים המקבילים הוא תוכן קדמי של YAML, בדומה לפורמט התוכן הקדמי שמשמש את GitHub Markdown ו-Jekyll. שאר הקובץ הוא ההנחיה, שאפשר להשתמש בה בתבניות Handlebars. בקטעים הבאים נסביר בפירוט על כל אחד מהחלקים שמרכיבים קובץ .prompt ועל האופן שבו משתמשים בהם.

לפני שמתחילים

לפני שתקראו את הדף הזה, כדאי שתכירו את התוכן שמפורט בדף יצירת תוכן באמצעות מודלים של AI.

כדי להריץ את דוגמאות הקוד בדף הזה, צריך לבצע קודם את השלבים שמפורטים במדריך תחילת העבודה. כל הדוגמאות מבוססות על ההנחה שכבר התקנתם את Genkit כיחס תלות בפרויקט.

יצירת קובצי הנחיות

ב-Dotprompt יש כמה דרכים שונות ליצור ולטעון הנחיות, אבל הוא מותאם במיוחד לפרויקטים שבהם ההנחיות מאורגנות כקובצי .prompt בספרייה אחת (או בתיקיות המשנה שלה). בקטע הזה נסביר איך ליצור ולטעון הנחיות באמצעות ההגדרה המומלצת הזו.

יצירת ספרייה של הנחיות

ספריית Dotprompt מצפה למצוא את ההנחיות בספרייה ברמה הבסיסית של הפרויקט, ומטעינה באופן אוטומטי את כל ההנחיות שהיא מוצאת שם. כברירת מחדל, השם של הספרייה הזו הוא prompts. לדוגמה, אם משתמשים בשם ברירת המחדל של הספרייה, מבנה הפרויקט עשוי להיראות כך:

your-project/
├── lib/
├── node_modules/
├── prompts/
│   └── hello.prompt
├── src/
├── package-lock.json
├── package.json
└── tsconfig.json

אם רוצים להשתמש בספרייה אחרת, אפשר לציין אותה כשמגדירים את Genkit:

const ai = genkit({
  promptDir: './llm_prompts',
  // (Other settings...)
});

יצירת קובץ הנחיה

יש שתי דרכים ליצור קובץ .prompt: באמצעות עורך טקסט או באמצעות ממשק המשתמש למפתחים.

שימוש בעורך טקסט

אם רוצים ליצור קובץ הנחיה באמצעות עורך טקסט, יוצרים קובץ טקסט עם הסיומת .prompt בספריית ההנחיות: לדוגמה, prompts/hello.prompt.

דוגמה מינימלית לקובץ הנחיה:

---
model: vertexai/gemini-1.5-flash
---
You are the world's most welcoming AI assistant. Greet the user and offer your assistance.

החלק שמופיע בין הקווים המקווקוים הוא YAML front matter, בדומה לפורמט front matter שמשמש את GitHub markdown ו-Jekyll. שאר הקובץ הוא ההנחיה, שאפשר להשתמש בה באפשרות לתבניות Handlebars. הקטע של תוכן הפתיחה הוא אופציונלי, אבל רוב קובצי ההנחיות יכללו לפחות מטא-נתונים שמציינים מודל. בהמשך הדף מוסבר איך להשתמש בתכונות של Dotprompt בקובצי ההנחיה.

שימוש בממשק המשתמש למפתחים

אפשר גם ליצור קובץ הנחיה באמצעות הכלי להרצת מודלים בממשק המשתמש למפתחים. מתחילים עם קוד אפליקציה שמייבא את ספריית Genkit ומגדיר אותה להשתמש בפלאגין של המודל הרצוי. לדוגמה:

import { genkit } from 'genkit';

// Import the model plugins you want to use.
import { googleAI } from '@genkit-ai/googleai';

const ai = genkit({
  // Initialize and configure the model plugins.
  plugins: [
    googleAI({
      apiKey: 'your-api-key', // Or (preferred): export GOOGLE_GENAI_API_KEY=...
    }),
  ],
});

אין בעיה אם הקובץ מכיל קוד אחר, אבל הקוד שלמעלה הוא כל מה שנדרש.

טעינת ממשק המפתחים באותו פרויקט:

genkit start -- tsx --watch src/your-code.ts

בקטע Models בוחרים את המודל שבו רוצים להשתמש מתוך רשימת המודלים שמספקת הפלאגין.

Genkit developer UI model runner

לאחר מכן, אפשר להתנסות בהנחיה ובתצורה עד שמקבלים תוצאות מרוצות. כשתהיו מוכנים, לוחצים על הלחצן 'ייצוא' ושומרים את הקובץ בספריית ההנחיות.

הנחיות לריצה

אחרי שיוצרים קובצי הנחיה, אפשר להריץ אותם מקוד האפליקציה או באמצעות הכלים ש-Genkit מספקת. לא משנה איך רוצים להריץ את ההנחיות, קודם צריך להתחיל עם קוד אפליקציה שמייבא את ספריית Genkit ואת הפלאגינים של המודלים הרצויים. לדוגמה:

import { genkit } from 'genkit';

// Import the model plugins you want to use.
import { googleAI } from '@genkit-ai/googleai';

const ai = genkit({
  // Initialize and configure the model plugins.
  plugins: [
    googleAI({
      apiKey: 'your-api-key', // Or (preferred): export GOOGLE_GENAI_API_KEY=...
    }),
  ],
});

אין בעיה אם הקובץ מכיל קוד אחר, אבל הקוד שלמעלה הוא כל מה שנדרש. אם אתם שומרים את ההנחיות בספרייה שאינה ברירת המחדל, הקפידו לציין אותה כשמגדירים את Genkit.

הרצת הנחיות מקוד

כדי להשתמש בהנחיה, קודם צריך לטעון אותה באמצעות השיטה prompt('file_name'):

const helloPrompt = ai.prompt('hello');

אחרי הטעינה, אפשר לקרוא להנחיה כמו לפונקציה:

const response = await helloPrompt();

// Alternatively, use destructuring assignments to get only the properties
// you're interested in:
const { text } = await helloPrompt();

להנחיה שניתן להפעיל יש שני פרמטרים אופציונליים: הקלט להנחיה (ראו הקטע בהמשך בנושא ציון סכימות קלט) ואובייקט תצורה, בדומה לאובייקט של השיטה generate(). לדוגמה:

const response2 = await helloPrompt(
  // Prompt input:
  { name: 'Ted' },

  // Generation options:
  {
    config: {
      temperature: 0.4,
    },
  }
);

כל הפרמטרים שתעבירו לקריאה להנחיה יעקפו את אותם הפרמטרים שצוינו בקובץ ההנחיה.

בקישור הבא מפורטות תיאורים של האפשרויות הזמינות: יצירת תוכן באמצעות מודלים של AI.

שימוש בממשק המשתמש למפתחים

כשאתם משפרים את ההנחיות של האפליקציה, אתם יכולים להריץ אותן בממשק המשתמש של Genkit למפתחים כדי לבצע שינויים מהירים בהנחיות ובהגדרות המודל, בנפרד מקוד האפליקציה.

טוענים את ממשק המשתמש למפתחים מספריית הפרויקט:

genkit start -- tsx --watch src/your-code.ts

Genkit developer UI prompt runner

אחרי שתטעינו את ההנחיות בממשק המשתמש למפתחים, תוכלו להריץ אותן עם ערכי קלט שונים ולבדוק איך שינויים בניסוח ההנחיה או בפרמטרים של ההגדרה משפיעים על הפלט של המודל. כשתהיו מרוצים מהתוצאה, תוכלו ללחוץ על הלחצן ייצוא ההנחיה כדי לשמור את ההנחיה ששונתה בספריית הפרויקט.

הגדרת מודל

בבלוק של תוכן הפתיחה של קובצי ההנחיה, אפשר לציין ערכי תצורת מודל להנחיה:

---
model: googleai/gemini-1.5-flash
config:
  temperature: 1.4
  topK: 50
  topP: 0.4
  maxOutputTokens: 400
  stopSequences:
    -   "<end>"
    -   "<fin>"
---

הערכים האלה ממופים ישירות לפרמטר config שמקובל בהנחיה שניתנת להפעלה:

const response3 = await helloPrompt(
  {},
  {
    config: {
      temperature: 1.4,
      topK: 50,
      topP: 0.4,
      maxOutputTokens: 400,
      stopSequences: ['<end>', '<fin>'],
    },
  }
);

בקישור הבא מפורטות תיאורים של האפשרויות הזמינות: יצירת תוכן באמצעות מודלים של AI.

סכימות קלט ופלט

כדי לציין סכמות קלט ופלט להנחיה, מגדירים אותן בקטע הקדמה:

---
model: googleai/gemini-1.5-flash
input:
  schema:
    theme?: string
  default:
    theme: "pirate"
output:
  schema:
    dishname: string
    description: string
    calories: integer
    allergens(array): string
---
Invent a menu item for a {{theme}} themed restaurant.

האופן שבו נעשה שימוש בסכימות האלה דומה לאופן שבו נעשה שימוש בסכימות שמועברות לבקשת generate() או להגדרת תהליך. לדוגמה, ההנחיה שהוגדרה למעלה יוצרת פלט מובנה:

const menuPrompt = ai.prompt('menu');
const { data } = await menuPrompt({ theme: 'medieval' });

const dishName = data['dishname'];
const description = data['description'];

יש כמה אפשרויות להגדרת סכימות בקובץ .prompt: הפורמט של Dotprompt להגדרת סכימות, Picoschema, סכימת JSON רגילה או הפניות לסכימות שהוגדרו בקוד האפליקציה. בקטעים הבאים מוסבר בהרחבה על כל אחת מהאפשרויות האלה.

Picoschema

הסכימות בדוגמה שלמעלה מוגדרות בפורמט שנקרא Picoschema. Picoschema הוא פורמט קומפקטי של הגדרת סכימה שמותאם ל-YAML, שמאפשר להגדיר בקלות את המאפיינים החשובים ביותר של סכימה לשימוש ב-LLM. דוגמה ארוכה יותר לסכימה, שמציינת את המידע שאפליקציה עשויה לאחסן לגבי מאמר:

schema:
  title: string # string, number, and boolean types are defined like this
  subtitle?: string # optional fields are marked with a `?`
  draft?: boolean, true when in draft state
  status?(enum, approval status): [PENDING, APPROVED]
  date: string, the date of publication e.g. '2024-04-09' # descriptions follow a comma
  tags(array, relevant tags for article): string # arrays are denoted via parentheses
  authors(array):
    name: string
    email?: string
  metadata?(object): # objects are also denoted via parentheses
    updatedAt?: string, ISO timestamp of last update
    approvedBy?: integer, id of approver
  extra?: any, arbitrary extra data
  (*): string, wildcard field

הסכימה שלמעלה זהה לממשק TypeScript הבא:

interface Article {
  title: string;
  subtitle?: string | null;
  /** true when in draft state */
  draft?: boolean | null;
  /** approval status */
  status?: 'PENDING' | 'APPROVED' | null;
  /** the date of publication e.g. '2024-04-09' */
  date: string;
  /** relevant tags for article */
  tags: string[];
  authors: {
    name: string;
    email?: string | null;
  }[];
  metadata?: {
    /** ISO timestamp of last update */
    updatedAt?: string | null;
    /** id of approver */
    approvedBy?: number | null;
  } | null;
  /** arbitrary extra data */
  extra?: any;
  /** wildcard field */

}

ב-Picoschema יש תמיכה בסוגי סקלר string,‏ integer,‏ number,‏ boolean ו-any. אובייקטים, מערכי נתונים וממשקי enum מסומנים בסוגריים אחרי שם השדה.

לאובייקטים שמוגדרים באמצעות Picoschema יש את כל המאפיינים הנדרשים, אלא אם הם מסומנים כאופציונליים באמצעות ?, והם לא מאפשרים להוסיף מאפיינים. כשמאפיין מסומן כאופציונלי, הוא הופך גם לאפשרי לאפס (nullable) כדי לספק גמישות רבה יותר ל-LLMs להחזיר ערך null במקום להשמיט שדה.

בהגדרת אובייקט, אפשר להשתמש במפתח המיוחד (*) כדי להצהיר על הגדרת שדה 'תו כללי לחיפוש'. כך תוכלו להתאים לכל נכס נוסף שלא סופק על ידי מפתח מפורש.

JSON Schema

ב-Picoschema אין תמיכה בהרבה מהיכולות של סכימה מלאה של JSON. אם אתם זקוקים לסכמות חזקות יותר, תוכלו לספק במקום זאת סכימה של JSON:

output:
  schema:
    type: object
    properties:
      field1:
        type: number
        minimum: 20

סכימות Zod שמוגדרות בקוד

בנוסף להגדרת סכימות ישירות בקובץ .prompt, אפשר להפנות לסכימה שרשומה ב-defineSchema() לפי שם. אם אתם משתמשים ב-TypeScript, הגישה הזו תאפשר לכם לנצל את התכונות הסטטיות של בדיקת הטיפוסים של השפה כשאתם עובדים עם הנחיות.

כדי לרשום סכימה:

import { z } from 'genkit';

const MenuItemSchema = ai.defineSchema(
  'MenuItemSchema',
  z.object({
    dishname: z.string(),
    description: z.string(),
    calories: z.coerce.number(),
    allergens: z.array(z.string()),
  })
);

בהנחיה, מציינים את שם הסכימה הרשומה:

---
model: googleai/gemini-1.5-flash-latest
output:
  schema: MenuItemSchema
---

ספריית Dotprompt תפתור את השם באופן אוטומטי לסכימה הבסיסית של Zod הרשומה. לאחר מכן תוכלו להשתמש בסכימה כדי להגדיר את סוג הפלט של Dotprompt:

const menuPrompt = ai.prompt<
  z.ZodTypeAny, // Input schema
  typeof MenuItemSchema, // Output schema
  z.ZodTypeAny // Custom options schema
>('menu');
const { data } = await menuPrompt({ theme: 'medieval' });

// Now data is strongly typed as MenuItemSchema:
const dishName = data?.dishname;
const description = data?.description;

תבניות של הנחיות

החלק בקובץ .prompt שמופיע אחרי תוכן הפתיחה (אם הוא קיים) הוא ההנחיה עצמה, שתעבור למודל. ההנחיה יכולה להיות מחרוזת טקסט פשוטה, אבל בדרך כלל כדאי לשלב בה את הקלט של המשתמש. כדי לעשות זאת, אפשר לציין את ההנחיה באמצעות שפת התבניות Handlebars. תבניות של הנחיות יכולות לכלול placeholder שמתייחסים לערכים שמוגדרים לפי סכימה של הקלט של ההנחיה.

כבר ראינו את זה בקטע על סכימות קלט ופלט:

---
model: googleai/gemini-1.5-flash
config:
  temperature: 1.4
  topK: 50
  topP: 0.4
  maxOutputTokens: 400
  stopSequences:
    -   "<end>"
    -   "<fin>"
---

בדוגמה הזו, הביטוי של Handlebars, {{theme}}, מקבל את הערך של המאפיין theme של הקלט כשמריצים את ההנחיה. כדי להעביר קלט להנחיה, צריך לבצע קריאה להנחיה כמו בדוגמה הבאה:

const menuPrompt = ai.prompt('menu');
const { data } = await menuPrompt({ theme: 'medieval' });

שימו לב: מאחר שסכימת הקלט הכריזה על המאפיין theme כאופציונלי וציינה ערך ברירת מחדל, אפשר היה להשמיט את המאפיין וההנחיה הייתה נפתרת באמצעות ערך ברירת המחדל.

תבניות Handlebars תומכות גם במבנים לוגיים מוגבלים מסוימים. לדוגמה, אפשר להגדיר את ההנחיה באמצעות ה-helper‏ #if של Handlebars, במקום לספק ברירת מחדל:

---
model: googleai/gemini-1.5-flash
input:
  schema:
    theme?: string
---
Invent a menu item for a {{#if theme}}{{theme}} themed{{/if}} restaurant.

בדוגמה הזו, ההנחיה תוצג כ "Invent a menu item for a restaurant" (יצירת פריט תפריט למסעדה) כשלא צוין המאפיין theme.

במסמכי העזרה של Handlebars מפורט מידע על כל הרכיבים הלוגיים המובנים.

בנוסף למאפיינים שמוגדרים על ידי הסכימה של הקלט, התבניות יכולות גם להפנות לערכים שמוגדרים באופן אוטומטי על ידי Genkit. בקטעים הבאים מתוארים הערכים שמוגדרים באופן אוטומטי ואופן השימוש בהם.

הנחיות לכמה הודעות

כברירת מחדל, Dotprompt יוצר הודעה אחת עם התפקיד 'משתמש'. עם זאת, חלק מההנחיות הכי טוב להביע כשיילוב של כמה הודעות, כמו הנחיה מערכתית.

בעזרת ה-helper‏ {{role}} אפשר ליצור בקלות הנחיות שמכילות כמה הודעות:

---
model: vertexai/gemini-1.5-flash
input:
  schema:
    userQuestion: string
---
{{role "system"}}
You are a helpful AI assistant that really loves to talk about food. Try to work
food items into all of your conversations.
{{role "user"}}
{{userQuestion}}

הנחיות במגוון מצבים

במודלים שתומכים בקלט רב-מודלי, כמו תמונות לצד טקסט, אפשר להשתמש בעזרה של {{media}}:

---
model: vertexai/gemini-1.5-flash
input:
  schema:
    photoUrl: string
---
Describe this image in a detailed paragraph:

{{media url=photoUrl}}

כתובת ה-URL יכולה להיות מזהי URI מסוג https: או data: בקידוד base64 לשימוש בתמונות 'inline'. בקוד, זה ייראה כך:

const multimodalPrompt = ai.prompt('multimodal');
const { text } = await multimodalPrompt({
  photoUrl: 'https://example.com/photo.jpg',
});

כדאי לעיין גם בקטע קלט מולטימודלי בדף 'מודלים', כדי לראות דוגמה ליצירת כתובת URL מסוג data:.

פריטים חלקיים

קטעים חלקיים הם תבניות לשימוש חוזר שאפשר לכלול בכל הנחיה. נכסי ה-Partials יכולים להיות שימושיים במיוחד להנחיות קשורות שיש להן התנהגות משותפת.

כשאתם טוענים ספריית הנחיות, כל קובץ עם קו תחתון (_) בתור הקידומת נחשב לקובץ חלקי. לכן, קובץ _personality.prompt עשוי להכיל:

You should speak like a {{#if style}}{{style}}{{else}}helpful assistant.{{/else}}.

לאחר מכן אפשר לכלול את הנתונים האלה בהנחיות אחרות:

---
model: googleai/gemini-1.5-flash
input:
  schema:
    name: string
    style?: string
---
{{ role "system" }}
{{>personality style=style}}

{{ role "user" }}
Give the user a friendly greeting.

User's Name: {{name}}

הוספת נכסי js חלקיים מתבצעת באמצעות התחביר {{>NAME_OF_PARTIAL args...}}. אם לא מציינים ארגומנטים ל-partial, הוא מופעל באותו הקשר שבו מופעלת ההנחיה הראשית.

פונקציות חלקיות יכולות לקבל גם ארגומנטים עם שם, כמו למעלה, וגם ארגומנטים פוזיציונליים יחידים שמייצגים את ההקשר. האפשרות הזו יכולה להיות שימושית למשימות כמו עיבוד של רשימת חברים.

_destination.prompt

- {{name}} ({{country}})

chooseDestination.prompt

---
model: googleai/gemini-1.5-flash-latest
input:
  schema:
    destinations(array):
      name: string
      country: string
---
Help the user decide between these vacation destinations:

{{#each destinations}}
{{>destination this}}
{{/each}}

הגדרת נכסי חלק בקוד

אפשר גם להגדיר נכסי חלק בקוד באמצעות definePartial:

ai.definePartial(
  'personality',
  'Talk like a {{#if style}}{{style}}{{else}}helpful assistant{{/if}}.'
);

קטעי קוד מוגדרים זמינים בכל ההנחיות.

הגדרת עזרים מותאמים אישית

אפשר להגדיר פונקציות עזר בהתאמה אישית כדי לעבד ולנהל נתונים בתוך הנחיה. עוזרים נרשמים באופן גלובלי באמצעות defineHelper:

ai.defineHelper('shout', (text: string) => text.toUpperCase());

אחרי שמגדירים עוזר, אפשר להשתמש בו בכל הנחיה:

---
model: googleai/gemini-1.5-flash
input:
  schema:
    name: string
---

HELLO, {{shout name}}!!!

וריאציות של הנחיות

קובצי ה-prompt הם פשוט טקסט, ולכן אפשר (וצריך!) לבצע עליהם commit במערכת לניהול גרסאות, כדי שתוכלו להשוות בקלות בין השינויים לאורך זמן. לרוב, אפשר לבדוק גרסאות משופרות של הנחיות רק בסביבת ייצור, לצד גרסאות קיימות. Dotprompt תומך בכך באמצעות התכונה 'וריאנטים'.

כדי ליצור וריאנט, יוצרים קובץ [name].[variant].prompt. לדוגמה, אם השתמשתם ב-Gemini 1.5 Flash בהנחיה אבל רציתם לבדוק אם הביצועים של Gemini 1.5 Pro טובים יותר, תוכלו ליצור שני קבצים:

  • my_prompt.prompt: ההנחיה 'baseline'
  • my_prompt.gemini15pro.prompt: וריאנט בשם gemini15pro

כדי להשתמש בגרסת הודעת הנחיה, מציינים את אפשרות הודעת הנחיה בזמן הטעינה:

const myPrompt = ai.prompt('my_prompt', { variant: 'gemini15pro' });

שם הווריאנט נכלל במטא-נתונים של נתוני המעקב אחרי היצירה, כך שתוכלו להשוות בין הביצועים בפועל של הווריאנטים השונים ב-Genkit trace inspector.

הגדרת הנחיות בקוד

בכל הדוגמאות שצוינו עד עכשיו, הנחנו שההנחיות מוגדרות בקבצים נפרדים מסוג .prompt בתיקייה אחת (או בתיקיות משנה שלה), שזמינות לאפליקציה בזמן הריצה. Dotprompt תוכנן בהתאם להגדרה הזו, והמחברים שלו מתייחסים אליו כאל חוויית הפיתוח הטובה ביותר באופן כללי.

עם זאת, אם יש לכם תרחישים לדוגמה שלא מתאימים להגדרה הזו, תוכלו להגדיר הנחיות בקוד באמצעות הפונקציה definePrompt():

הפרמטר הראשון בפונקציה הזו מקביל לבלוק של תוכן הפתיחה בקובץ .prompt. הפרמטר השני יכול להיות מחרוזת של תבנית Handlebars, כמו בקובץ הנחיה, או פונקציה שמחזירה GenerateRequest:

const myPrompt = ai.definePrompt(
  {
    name: 'myPrompt',
    model: 'googleai/gemini-1.5-flash',
    input: {
      schema: z.object({
        name: z.string(),
      }),
    },
  },
  'Hello, {{name}}. How are you today?'
);
const myPrompt = ai.definePrompt(
  {
    name: 'myPrompt',
    model: 'googleai/gemini-1.5-flash',
    input: {
      schema: z.object({
        name: z.string(),
      }),
    },
  },
  async (input): Promise<GenerateRequest> => {
    return {
      messages: [
        {
          role: 'user',
          content: [{ text: `Hello, ${input.name}. How are you today?` }],
        },
      ],
    };
  }
);