إدارة الطلبات باستخدام Dotprompt

إنّ هندسة الطلبات هي الطريقة الأساسية التي يمكنك من خلالها، بصفتك مطوّر تطبيقات، التأثير في ناتج نماذج الذكاء الاصطناعي التوليدي. على سبيل المثال، عند استخدام النماذج اللغوية الكبيرة، يمكنك إنشاء طلبات تؤثّر في الأسلوب والتنسيق والطول والسمات الأخرى لردود النماذج.

تعتمد طريقة كتابة هذه الطلبات على النموذج الذي تستخدمه، فقد لا يحقّق الطلب الذي تم كتابته لنموذج معيّن أداءً جيدًا عند استخدامه مع نموذج آخر. وبالمثل، ستؤثر معلمات النموذج التي تحدّدها (درجة الحرارة وأفضل 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 وكيفية استخدامه.

قبل البدء

قبل قراءة هذه الصفحة، يجب أن تكون على دراية بالمحتوى الذي يتم تناوله في صفحة إنشاء المحتوى باستخدام نماذج الذكاء الاصطناعي.

إذا كنت تريد تنفيذ أمثلة الرموز البرمجية الواردة في هذه الصفحة، عليك أولاً إكمال الخطوات الواردة في دليل البدء. تفترض جميع الأمثلة أنّه سبق أن ثبّت 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، وهي مشابهة لتنسيق المقدمة الذي يستخدمه 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

في قسم "النماذج"، اختَر النموذج الذي تريد استخدامه من قائمة النماذج التي يوفّرها المكوّن الإضافي.

أداة تشغيل نماذج واجهة المستخدم للمطوّرين في Genkit

بعد ذلك، جرِّب الطلب والإعداد إلى أن تحصل على نتائج تُرضيك. عندما تكون مستعدًا، اضغط على الزر "تصدير" واحفظ الملف في ملف ‎ prompts.

عرض طلبات

بعد إنشاء ملفات الطلبات، يمكنك تشغيلها من رمز تطبيقك، أو باستخدام الأدوات التي يوفّرها 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,
    },
  }
);

ستلغي أي مَعلمات تنقلها إلى طلب الطلب المَعلمات نفسها المحدّدة في ملف الطلب.

اطّلِع على مقالة إنشاء محتوى باستخدام نماذج الذكاء الاصطناعي للحصول على أوصاف عن الخيارات المتاحة.

استخدام واجهة مستخدم المطوّر

أثناء تحسين طلبات تطبيقك، يمكنك تشغيلها في واجهة مستخدم المطوّر في Genkit لتكرير الطلبات وإعدادات النماذج بسرعة، بغض النظر عن رمز تطبيقك.

حمِّل واجهة مستخدم المطوّر من دليل مشروعك:

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

أداة تنفيذ طلبات واجهة المستخدم للمطوّرين في Genkit

بعد تحميل الطلبات إلى واجهة مستخدم المطوّر، يمكنك تشغيلها باستخدام قيم إدخال مختلفة، وتجربة تأثير التغييرات في صيغة الطلب أو مَعلمات الضبط على مخرجات النموذج. عندما تكون راضيًا عن النتيجة، يمكنك النقر على الزر تصدير الطلب لحفظ الطلب المعدَّل مجددًا في دليل مشروعك.

إعدادات النموذج

في قسم "مقدّمة" ملفات الطلبات، يمكنك اختياريًا تحديد قيم ملف ملف النموذج الإعدادات لطلبك:

---
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>'],
    },
  }
);

اطّلِع على مقالة إنشاء محتوى باستخدام نماذج الذكاء الاصطناعي للحصول على أوصاف عن الخيارات المتاحة.

مخطّطات الإدخال والإخراج

يمكنك تحديد مخطّطَي الإدخال والإخراج لطلبك من خلال تحديدهما في قسم "مقدّمة":

---
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، ما يجعله سهلاً لتحديد أهم سمات المخطط لاستخدام نموذج "التعلم الآلي للغات". في ما يلي مثال أطول على مخطّط يحدّد المعلومات التي قد يخزّنها التطبيق حول مقالة:

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. يتم الإشارة إلى الكائنات والمصفوفات وقوائم القيم المحدَّدة بين قوسين بعد اسم الحقل.

تحتوي العناصر التي تحدّدها Picoschema على جميع السمات المطلوبة ما لم يتم وضع ? عليها للإشارة إلى أنّها اختيارية، ولا تسمح بإضافة سمات أخرى. عندما يتم وضع علامة على سمة كاختيارية، يتم أيضًا جعلها قابلة للحذف لتوفير المزيد من التساهل لتنسيقات LLMs لعرض قيمة فارغة بدلاً من حذف حقل.

في تعريف العنصر، يمكن استخدام المفتاح الخاص (*) لتعريف ملف شخصي "للعميل المحتمل". سيؤدي ذلك إلى مطابقة أيّ مواقع إضافية لم يتمّ تقديمها بواسطة مفتاح صريح.

مخطّط JSON

لا تتيح Picoschema العديد من إمكانات مخطّط JSON الكامل. إذا كنت تحتاج إلى مخطّطات أكثر فعّالية، يمكنك تقديم مخطّط JSON بدلاً من ذلك:

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

مخطّطات Zod المحدّدة في الرمز البرمجي

بالإضافة إلى تحديد المخططات مباشرةً في ملف .prompt، يمكنك الإشارة إلى مخطّط مسجّل في defineSchema() بالاسم. إذا كنت تستخدِم IDE IDE 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. يمكن أن تتضمّن نماذج الطلبات عناصر نائبة تشير إلى القيم التي يحدّدها مخطّط إدخال الطلب.

لقد شاهدت هذا الإجراء من قبل في قسم مخطّطات الإدخال والإخراج:

---
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 أيضًا بعض البنى المنطقية المحدودة. على سبيل المثال، كبديل لتقديم قيمة تلقائية، يمكنك تحديد الطلب باستخدام مساعد #if في Handlebars:

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

في هذا المثال، يتم عرض الطلب على النحو التالي: "ابتكار عنصر قائمة لمطعم" عندما تكون سمة theme غير محدّدة.

اطّلِع على مستندات Handlebars للحصول على معلومات عن جميع الوظائف المنطقية المضمّنة.

بالإضافة إلى السمات التي يحدّدها مخطّط الإدخال، يمكن أن تشير نماذجك أيضًا إلى القيم التي تحدّدها Genkit تلقائيًا. توضّح الأقسام القليلة التالية هذه القيم المحدّدة تلقائيًا وكيفية استخدامها.

طلبات متعددة الرسائل

بشكلٍ تلقائي، ينشئ Dotprompt رسالة واحدة بدور "مستخدم". ومع ذلك، يُفضَّل التعبير عن بعض الطلبات على شكل مجموعة من الرسائل المتعددة، مثل طلب النظام.

يقدّم المساعد {{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 معرّف https: أو معرّف data: مشفّرًا بترميز base64 لاستخدام الصور "المضمّنة". في الرمز البرمجي، سيكون هذا على النحو التالي:

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

اطّلِع أيضًا على إدخال البيانات باستخدام وسائط متعددة في صفحة نماذج للحصول على مثال على إنشاء عنوان URL data:.

العناصر الجزئية

الأجزاء هي نماذج قابلة لإعادة الاستخدام يمكن تضمينها في أي طلب. يمكن أن تكون الطلبات الجزئية مفيدة بشكل خاص للطلبات ذات الصلة التي تتشارك سلوكًا شائعًا.

عند تحميل دليل طلبات، يتم اعتبار أي ملف مسبوق بشرطة سفلية (_) جزئيًا. وبالتالي، قد يحتوي الملف _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}}

يتم إدراج العناصر الجزئية باستخدام بنية {{>NAME_OF_PARTIAL args...}}. في حال عدم تقديم أي وسيطات للجزء، يتم تنفيذه باستخدام السياق نفسه المستخدَم في الطلب الرئيسي.

تقبل العناصر الجزئية كلاً من الوسيطات المُسمّاة كما هو موضّح أعلاه أو وسيطة موضعية واحدة represent representing the context. يمكن أن يكون ذلك مفيدًا في مهام مثل عرض أعضاء قائمة.

_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}}!!!

صِيغ الطلبات

بما أنّ ملفات الطلبات هي مجرد نص، يمكنك (ويجب) إرسالها إلى نظام التحكّم في الإصدارات، ما يتيح لك مقارنة التغييرات بمرور الوقت بسهولة. في أغلب الأحيان، لا يمكن اختبار الإصدارات المعدَّلة من الطلبات بشكل كامل إلا في بيئة الإنتاج بجانب الإصدارات الحالية. تتيح Dotprompt ذلك من خلال ميزة الأشكال المختلفة.

لإنشاء سعر متغير، أنشئ ملف [name].[variant].prompt. على سبيل المثال، إذا كنت تستخدم نموذج Gemini 1.5 Flash في طلبك ولكن أردت معرفة ما إذا كان نموذج Gemini 1.5 Pro سيؤدي أداءً أفضل، يمكنك إنشاء ملفين:

  • my_prompt.prompt: طلب "الأساس"
  • my_prompt.gemini15pro.prompt: صيغة باسم gemini15pro

لاستخدام صيغة طلب، حدِّد خيار الصيغة عند التحميل:

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

يتم تضمين اسم الصيغة في البيانات الوصفية لتتبُّع عمليات الإنشاء، ما يتيح لك مقارنة الأداء الفعلي بين الصيغ في أداة فحص التتبُّع Genkit.

تحديد الطلبات في الرمز البرمجي

افترضت جميع الأمثلة التي تمت مناقشتها حتى الآن أنّ طلباتك محدّدة في ملفات .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?` }],
        },
      ],
    };
  }
);