إنّ هندسة الطلبات هي الطريقة الأساسية التي يمكنك من خلالها، بصفتك مطوّر تطبيقات، التأثير في ناتج نماذج الذكاء الاصطناعي التوليدي. على سبيل المثال، عند استخدام النماذج اللغوية الكبيرة، يمكنك إنشاء طلبات تؤثّر في الأسلوب والتنسيق والطول والسمات الأخرى لردود النماذج.
تعتمد طريقة كتابة هذه الطلبات على النموذج الذي تستخدمه، فقد لا يحقّق الطلب الذي تم كتابته لنموذج معيّن أداءً جيدًا عند استخدامه مع نموذج آخر. وبالمثل، ستؤثر معلمات النموذج التي تحدّدها (درجة الحرارة وأفضل 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
في قسم "النماذج"، اختَر النموذج الذي تريد استخدامه من قائمة النماذج التي يوفّرها المكوّن الإضافي.
بعد ذلك، جرِّب الطلب والإعداد إلى أن تحصل على نتائج تُرضيك. عندما تكون مستعدًا، اضغط على الزر "تصدير" واحفظ الملف في ملف 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
بعد تحميل الطلبات إلى واجهة مستخدم المطوّر، يمكنك تشغيلها باستخدام قيم إدخال مختلفة، وتجربة تأثير التغييرات في صيغة الطلب أو مَعلمات الضبط على مخرجات النموذج. عندما تكون راضيًا عن النتيجة، يمكنك النقر على الزر تصدير الطلب لحفظ الطلب المعدَّل مجددًا في دليل مشروعك.
إعدادات النموذج
في قسم "مقدّمة" ملفات الطلبات، يمكنك اختياريًا تحديد قيم ملف ملف النموذج الإعدادات لطلبك:
---
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?` }],
},
],
};
}
);