هناك فئات مختلفة من المعلومات التي قد يتعامل معها المطوِّر الذي يعمل مع نموذج معالجة لغوية كبيرة في آنٍ واحد:
- المدخلات: المعلومات ذات الصلة مباشرةً بتوجيه ردّ النموذج اللغوي الكبير لطلب اتصال معيّن ومن الأمثلة على ذلك النص الذي يجب تلخيصه.
- سياق الإنشاء: المعلومات ذات الصلة بنموذج اللغة الضخمة، ولكنّها ليست مخصّصة للمكالمة ومن الأمثلة على ذلك الوقت الحالي أو اسم مستخدم.
- سياق التنفيذ: المعلومات المهمة للرمز المحيط بطلب استخدام نموذج اللغة الكبير، ولكن ليس للنموذج نفسه ومن الأمثلة على ذلك رمز التفويض الحالي للمستخدم.
توفّر Genkit عنصرًا context
متسقًا يمكنه نشر سياق الإنشاء
والتنفيذ على مدار العملية. يتوفّر هذا السياق لجميع
الإجراءات، بما في ذلك عمليات التنقّل والأدوات و
الطلبات.
يتم نشر السياق تلقائيًا إلى جميع الإجراءات التي يتمّ استدعاؤها في نطاق تنفيذ الإجراء: يتمّ إتاحة السياق الذي تمّ تمريره إلى مسار معيّن للطلبات التي يتمّ تنفيذها في ذلك المسار. يكون السياق الذي تم تمريره إلى طريقة generate()
متاحًا
للأدوات التي يتم استدعاؤها ضمن حلقة الإنشاء.
ما أهمية السياق؟
من أفضل الممارسات تقديم الحد الأدنى من المعلومات إلى LLM التي يحتاجها لإكمال مهمة معيّنة. وهذا أمر مهم لعدة أسباب:
- وكلما قلّت المعلومات غير ذات الصلة التي يحصل عليها نموذج اللغة الضخم، زاد احتمال أدائه بنجاح لمهمته.
- إذا كان نموذج اللغة الضخمة يحتاج إلى نقل معلومات، مثل أرقام تعريف المستخدمين أو الحسابات، إلى الأدوات، قد يتم خداعه لتسريب المعلومات.
يمنحك السياق قناة جانبية للمعلومات التي يمكن لأي من الرمز البرمجي الخاص بك استخدامها، ولكن ليس من الضروري إرسالها إلى نموذج اللغة الكبير. على سبيل المثال، يمكن أن تسمح لك هذه الميزة بحصر طلبات البحث عن الأدوات بالنطاق المتاح للمستخدم الحالي.
بنية السياق
يجب أن يكون السياق عنصرًا، ولكن يمكنك تحديد خصائصه. في بعض
الحالات، تملأ Genkit السياق تلقائيًا. على سبيل المثال، عند استخدام
الجلسات الثابتة، تتم إضافة السمة state
تلقائيًا إلى
السياق.
من بين الاستخدامات الأكثر شيوعًا للسياق هو تخزين معلومات عن المستخدِم الحالي. ننصحك بإضافة سياق المصادقة بالشكل التالي:
{
auth: {
uid: "...", // the user's unique identifier
token: {...}, // the decoded claims of a user's id token
rawToken: "...", // the user's raw encoded id token
// ...any other fields
}
}
يمكن أن يخزِّن عنصر السياق أي معلومات قد تحتاج إلى معرفتها في مكان آخر في عملية التنفيذ.
استخدام السياق في إجراء
لاستخدام السياق في إجراء معيّن، يمكنك الوصول إلى مساعدة السياق التي يتم توفيرها تلقائيًا لتعريف الدالة:
تدفق
const summarizeHistory = ai.defineFlow({
name: 'summarizeMessages',
inputSchema: z.object({friendUid: z.string()}),
outputSchema: z.string();
}, async ({friendUid}, {context}) => {
if (!context.auth?.uid) throw new Error("Must supply auth context.");
const messages = await listMessagesBetween(friendUid, context.auth.uid);
const {text} = await ai.generate({
prompt:
`Summarize the content of these messages: ${JSON.stringify(messages)}`,
});
return text;
});
الأداة
const searchNotes = ai.defineTool({
name: 'searchNotes',
description: "search the current user's notes for info",
inputSchema: z.object({query: z.string()}),
outputSchmea: z.array(NoteSchema);
}, async ({query}, {context}) => {
if (!context.auth?.uid) throw new Error("Must be called by a signed-in user.");
return searchUserNotes(context.auth.uid, query);
});
ملف الطلب
عند استخدام نماذج Dotprompt، يتوفّر السياق باستخدام بادئة المتغيّر
@
. على سبيل المثال، يمكن الوصول إلى عنصر سياق
{auth: {name: 'Michael'}}
في نموذج الطلب على النحو التالي:
---
input:
schema:
pirateStyle?: boolean
---
{{#if pirateStyle}}
Avast, {{@auth.name}}, how be ye today?
{{else}}
Hello, {{@auth.name}}, how are you today?
{{/if}}
تقديم سياق أثناء التشغيل
لتوفير سياق لإجراء معيّن، عليك تمرير عنصر السياق كخيار عند استدعاء الإجراء.
التدفقات
const summarizeHistory = ai.defineFlow(/* ... */);
const summary = await summarizeHistory(friend.uid, {context: {auth: currentUser}});
الجيل
const {text} = await ai.generate({
prompt: "Find references to ocelots in my notes.",
// the context will propagate to tool calls
tools: [searchNotes],
context: {auth: currentUser},
});
الطلبات
const helloPrompt = ai.prompt('sayHello');
helloPrompt({pirateStyle: true}, {context: {auth: currentUser}});
نشر السياق وإلغاء الإعدادات
عندما تقدّم سياقًا، يتم نشره تلقائيًا على جميع الإجراءات التي تمّ استدعاؤها نتيجةً لطلبك الأصلي. إذا كانت العملية تستدعي غيرها من العمليات، أو إذا كانت عملية الإنشاء تستدعي أدوات، يتم توفير السياق نفسه.
إذا كنت تريد إلغاء السياق ضمن إجراء معيّن، يمكنك تمرير عنصر سياق مختلف ليحلّ محل العنصر الحالي:
const otherFlow = ai.defineFlow(/* ... */);
const myFlow = ai.defineFlow({
// ...
}, (input, {context}) => {
// override the existing context completely
otherFlow({/*...*/}, {context: {newContext: true}});
// or selectively override
otherFlow({/*...*/}, {context: {...context, updatedContext: true}});
});
عند استبدال السياق، يتم نشره بالطريقة نفسها. في هذا المثال،
ستكتسِب أي إجراءات تمّ استدعاؤها من قِبل otherFlow
أثناء تنفيذها
السياق الذي تمّ إلغاؤه.