إنشاء المحتوى باستخدام نماذج الذكاء الاصطناعي

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

يمكن أن تكون نتائج هذه النماذج مقنعة بشكل مفاجئ: تُنشئ النماذج اللغوية الكبيرة نصًا يبدو أنّه من تأليف بشري، ويمكن لنماذج إنشاء الصور أن تُنشئ صورًا قريبة جدًا من الصور الفوتوغرافية الحقيقية أو الأعمال الفنية التي أنشأها البشر.

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

  • كتابة برامج الكمبيوتر
  • تخطيط المهام الفرعية المطلوبة لإكمال مهمة أكبر
  • تنظيم البيانات غير المنظَّمة
  • فهم بيانات المعلومات واستخراجها من مجموعة نصوص
  • اتّباع الأنشطة المبرمَجة وتنفيذها استنادًا إلى وصف نصي للنشاط

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

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

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

قبل البدء

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

الطُرز المتوافقة مع Genkit

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

يحافظ فريق Genkit على الإضافات للعمل مع النماذج التي يوفّرها Vertex AI وGoogle Generative AI وOllama:

  • مجموعة النماذج اللغوية الكبيرة في Gemini، من خلال مكوّن Google Cloud Vertex AI الإضافي
  • مجموعة النماذج اللغوية الكبيرة (LLM) في Gemini، من خلال مكوّن Google AI الإضافي
  • نماذج إنشاء الصور Imagen2 وImagen3 من خلال Google Cloud Vertex AI
  • مجموعة النماذج اللغوية الكبيرة (LLM) من Claude 3 من Anthropic، من خلال "حديقة النماذج" في Google Cloud Vertex AI
  • ‫Gemma 2 وLlama 3 والمزيد من النماذج المتاحة للجميع، من خلال مكوّن Ollama الإضافي (يجب استضافة خادم Ollama بنفسك)

بالإضافة إلى ذلك، تتوفّر أيضًا عدة مكوّنات إضافية يوفّرها المنتدى تقدّم واجهات لهذه النماذج:

يمكنك اكتشاف المزيد من خلال البحث عن الحِزم التي تم وضع علامة genkit-model عليها على npmjs.org.

تحميل إضافات النماذج وضبطها

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

طريقة generate()

في Genkit، الطريقة الأساسية التي تتفاعل من خلالها مع نماذج الذكاء الاصطناعي التوليدي هي generate().

تحدِّد أبسط مكالمة generate() النموذج الذي تريد استخدامه وأحد الطلبات النصية التالية:

import { gemini15Flash, googleAI } from '@genkit-ai/googleai';
import { genkit } from 'genkit';

const ai = genkit({
  plugins: [googleAI()],
  model: gemini15Flash,
});

(async () => {
  const { text } = await ai.generate(
    'Invent a menu item for a pirate themed restaurant.'
  );
  console.log(text);
})();

عند تنفيذ هذا المثال الموجز، سيتم طباعة بعض معلومات تصحيح الأخطاء followed by the output of the generate() call، والتي ستكون عادةً Markdown text كما هو موضّح في المثال التالي:

## The Blackheart's Bounty

**A hearty stew of slow-cooked beef, spiced with rum and molasses, served in a
hollowed-out cannonball with a side of crusty bread and a dollop of tangy
pineapple salsa.**

**Description:** This dish is a tribute to the hearty meals enjoyed by pirates
on the high seas. The beef is tender and flavorful, infused with the warm spices
of rum and molasses. The pineapple salsa adds a touch of sweetness and acidity,
balancing the richness of the stew. The cannonball serving vessel adds a fun and
thematic touch, making this dish a perfect choice for any pirate-themed
adventure.

يمكنك تشغيل النص البرمجي مرة أخرى وستحصل على نتيجة مختلفة.

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

يمكنك أيضًا تحديد نموذج لمكالمة generate() واحدة:

const { text } = await ai.generate({
  model: gemini15Pro,
  prompt: 'Invent a menu item for a pirate themed restaurant.',
});

يستخدم هذا المثال مرجع نموذج تم تصديره بواسطة المكوّن الإضافي للنموذج. هناك خيار آخر لتحديد النموذج باستخدام معرّف سلسلة:

const { text } = await ai.generate({
  model: 'googleai/gemini-1.5-pro-latest',
  prompt: 'Invent a menu item for a pirate themed restaurant.',
});

يشبه معرّف سلسلة الطراز providerid/modelid، حيث يحدّد معرّف الموفّر (googleai في هذه الحالة) المكوّن الإضافي، ومعرّف الطراز هو معرّف سلسلة خاص بالمكوّن الإضافي لإصدار معيّن من الطراز.

توفّر بعض المكوّنات الإضافية للنماذج، مثل المكوّن الإضافي Ollama، إمكانية الوصول إلى دُفعات من النماذج المختلفة، وبالتالي لا تُصدِّر المكوّنات الإضافية مراجع نماذج فردية. في هذه الحالات، يمكنك تحديد نموذج لـ generate() باستخدام معرّف السلسلة الخاص به فقط.

توضّح هذه الأمثلة أيضًا نقطة مهمة: عند استخدام generate() لإجراء طلبات نموذج الذكاء الاصطناعي التوليدي، ما عليك سوى تمرير قيمة مختلفة إلى مَعلمة model لتغيير النموذج الذي تريد استخدامه. من خلال استخدام generate() بدلاً من حِزم SDK لعرض النماذج الأصلية، يمكنك الاستفادة من المرونة لاستخدام عدة نماذج مختلفة في تطبيقك بسهولة أكبر وتغيير النماذج في المستقبل.

حتى الآن، لم تشاهد سوى أمثلة على أبسط طلبات generate(). ومع ذلك، يقدّم generate() أيضًا واجهة للتفاعلات الأكثر تقدمًا مع نماذج الإنشاء، والتي ستظهر لك في الأقسام التالية.

طلبات النظام

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

إذا كان النموذج الذي تستخدمه يتيح طلبات النظام، يمكنك تقديم طلب باستخدام المَعلمة system:

const { text } = await ai.generate({
  system: 'You are a food industry marketing consultant.',
  prompt: 'Invent a menu item for a pirate themed restaurant.',
});

مَعلمات النموذج

تأخذ الدالة generate() مَعلمة config، والتي يمكنك من خلالها تحديد الإعدادات الاختيارية التي تتحكّم في كيفية إنشاء النموذج للمحتوى:

const { text } = await ai.generate({
  prompt: 'Invent a menu item for a pirate themed restaurant.',
  config: {
    maxOutputTokens: 400,
    stopSequences: ['<end>', '<fin>'],
    temperature: 1.2,
    topP: 0.4,
    topK: 50,
  },
});

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

المَعلمات التي تتحكّم في طول الإخراج

maxOutputTokens

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

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

كما ذكرنا سابقًا، قد لا يتم ربط بعض الرموز المميزة بتسلسلات الأحرف. ومن الأمثلة على ذلك أنّه غالبًا ما يكون هناك رمز مميز يشير إلى نهاية التسلسل: عندما تُنشئ لغة لمعالجة النصوص الكبيرة هذا الرمز المميّز، تتوقف عن إنشاء المزيد. وبالتالي، من المُتاح أن تُنشئ نموذج لغوي كبير عددًا أقل من الرموز المميزة مقارنةً بالحد الأقصى لأنّه أنشأ الرمز المميّز "stop".

stopSequences

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

يُرجى العِلم أنّك تحدّد تسلسلات الأحرف، وليس الرموز بحد ذاتها. في معظم الحالات، ستحدِّد سلسلة أحرف يربطها أداة تقسيم النصوص في النموذج بوحدة ترميز واحدة.

المَعلمات التي تتحكّم في "تصميم الإعلان"

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

درجة الحرارة

النماذج اللغوية الكبيرة هي في الأساس آلات توقّع الرموز. بالنسبة إلى تسلسل معيّن من الرموز (مثل الطلب)، تتوقّع النماذج اللغوية الكبيرة، لكل رمز في مفرداتها، احتمالية أن يأتي الرمز التالي في التسلسل. درجة الحرارة هي عامل قياس يتم تقسيم هذه التوقّعات به قبل تسويتها لتكون احتمالية تتراوح بين 0 و1.

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

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

topP

Top-p هي قيمة تتراوح بين 0.0 و1.0 وتتحكّم في عدد العلامات المحتملة التي تريد أن يأخذها النموذج في الاعتبار، وذلك من خلال تحديد الاحتمالية التراكمية للعلامات. على سبيل المثال، تعني القيمة 1.0 أنّه يجب أخذ كل علامة محتملة في الاعتبار (مع الاستمرار في مراعاة احتمال ظهور كل علامة). تعني القيمة 0.4 الأخذ في الاعتبار الرموز الأكثر احتمالًا فقط، والتي تضيف احتمالاتها إلى 0.4، واستبعاد الرموز المتبقية من الاعتبار.

topK

Top-k هي قيمة عددية تتحكّم أيضًا في عدد الرموز المميّزة المحتمَلة التي تريد أن يأخذها النموذج في الاعتبار، ولكن هذه المرة من خلال تحديد الحد الأقصى لعدد الرموز المميّزة صراحةً. يشير تحديد القيمة 1 إلى أنّ النموذج يجب أن يتصرّف بشكل حتمي.

تجربة مَعلمات النماذج

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

الإخراج المنظَّم

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

في Genkit، يمكنك طلب إخراج منظَّم من نموذج من خلال تحديد مخطّط عند استدعاء generate():

import { z } from 'genkit'; // Import Zod, which is re-exported by Genkit.
const MenuItemSchema = z.object({
  name: z.string(),
  description: z.string(),
  calories: z.number(),
  allergens: z.array(z.string()),
});

const { output } = await ai.generate({
  prompt: 'Invent a menu item for a pirate themed restaurant.',
  output: { schema: MenuItemSchema },
});

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

عند تحديد مخطّط في generate()، تُجري أداة Genkit عدة إجراءات بلا إظهارها:

  • تضيف إرشادات إضافية حول تنسيق الإخراج المطلوب إلى الطلب. ويؤدي ذلك أيضًا إلى تحديد المحتوى الذي تريده بالضبط للنموذج (على سبيل المثال، ليس فقط اقتراح عنصر قائمة، ولكن أيضًا إنشاء وصف وقائمة بالمسببات الحسّاسة وما إلى ذلك).
  • تُحلِّل مخرجات النموذج إلى كائن JavaScript.
  • للتحقّق من توافق الإخراج مع المخطّط

للحصول على إخراج منظَّم من طلب إنشاء ناجح، استخدِم السمة output في العنصر response:

if (output) {
  const { name, description, calories, allergens } = output;
}

معالجة الأخطاء

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

  • جرِّب نموذجًا مختلفًا. لكي ينجح الإخراج المنظَّم، يجب أن يكون النموذج قادرًا على إنشاء إخراج بتنسيق JSON. إنّ النماذج اللغوية الكبيرة الأكثر فعالية، مثل Gemini و Claude، هي مرنة بما يكفي لإجراء ذلك، ولكن قد لا تتمكّن النماذج الأصغر حجمًا، مثل بعض النماذج المحلية التي ستستخدمها مع Ollama، من إنشاء إخراج منظَّم بشكل موثوق ما لم يتم تدريبها على وجه التحديد للقيام بذلك.

  • الاستفادة من إمكانات الإكراه في Zod: يمكنك تحديد ما إذا كان ينبغي أن يحاول Zod في مخطّطاتك تحويل الأنواع غير المتوافقة إلى النوع المحدّد في المخطّط. إذا كان مخطّطك يتضمّن أنواعًا بدائية غير السلاسل، يمكن أن يؤدي استخدام Zod coercion إلى تقليل عدد حالات تعذُّر generate() التي تواجهها. يستخدم الإصدار التالي من MenuItemSchema إجبار النوع لتصحيح المواقف تلقائيًا التي ينشئ فيها النموذج معلومات السعرات الحرارية كسلسلة بدلاً من رقم:

    const MenuItemSchema = z.object({
      name: z.string(),
      description: z.string(),
      calories: z.coerce.number(),
      allergens: z.array(z.string()),
    });
    
  • إعادة محاولة طلب generate() إذا كان النموذج الذي اخترته لا يفشل في توليد ناتج متوافق إلا نادرًا، يمكنك التعامل مع الخطأ كما تتعامل مع خطأ في الشبكة، وإعادة محاولة إرسال الطلب باستخدام نوع من استراتيجيات التراجع المتزايد.

البثّ

عند إنشاء كميات كبيرة من النصوص، يمكنك تحسين تجربة المستخدِمين من خلال عرض النتيجة أثناء إنشائها، أي بثّها. يمكن الاطّلاع على مثالٍ مألوف على البث المباشر في معظم تطبيقات المحادثة المستندة إلى نماذج اللغة الكبيرة: يمكن للمستخدمين قراءة ردّ النموذج على رسالتهم أثناء إنشائه، ما يؤدي إلى تحسين سرعة استجابة التطبيق المُتخيّلة وتعزيز الوهم بأنّهم يتحدثون مع مستخدم ذكي.

في Genkit، يمكنك بث الإخراج باستخدام الطريقة generateStream(). يشبه بناء الجملة طريقة generate():

const { response, stream } = await ai.generateStream(
  'Suggest a complete menu for a pirate themed restaurant.'
);

يحتوي عنصر الاستجابة على سمة stream، والتي يمكنك استخدامها للتكرار على ناتج البث للطلب أثناء إنشائه:

for await (const chunk of stream) {
  console.log(chunk.text);
}

يمكنك أيضًا الحصول على النتيجة الكاملة للطلب، كما يمكنك الحصول عليها عند تقديم طلب غير مرتبط بالبث:

const completeText = (await response).text;

يمكن أيضًا بث المحتوى مع الإخراج منظَّم:

const MenuSchema = z.object({
  starters: z.array(MenuItemSchema),
  mains: z.array(MenuItemSchema),
  desserts: z.array(MenuItemSchema),
});

const { response, stream } = await ai.generateStream({
  prompt: 'Suggest a complete menu for a pirate themed restaurant.',
  output: { schema: MenuSchema },
});

for await (const chunk of stream) {
  // `output` is an object representing the entire output so far.
  console.log(chunk.output);
}

// Get the completed output.
const { output } = await response;

يختلف بث الإخراج منظَّم قليلاً عن بث النصوص: السمة output لجزء من الردّ هي عنصر تم إنشاؤه من تجميع الأجزاء التي تم إنشاؤها حتى الآن، بدلاً من عنصر يمثّل جزءًا واحدًا (قد لا يكون صالحًا بمفرده). إنّ كل قطعة من الإخراج المنظَّم تحلّ محلّ القطعة التي سبقتها.

على سبيل المثال، في ما يلي شكل المخرجات الخمس الأولى من المثال السابق:

null

{ starters: [ {} ] }

{
  starters: [ { name: "Captain's Treasure Chest", description: 'A' } ]
}

{
  starters: [
    {
      name: "Captain's Treasure Chest",
      description: 'A mix of spiced nuts, olives, and marinated cheese served in a treasure chest.',
      calories: 350
    }
  ]
}

{
  starters: [
    {
      name: "Captain's Treasure Chest",
      description: 'A mix of spiced nuts, olives, and marinated cheese served in a treasure chest.',
      calories: 350,
      allergens: [Array]
    },
    { name: 'Shipwreck Salad', description: 'Fresh' }
  ]
}

إدخال متعدد الوسائط

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

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

لتقديم طلب وسائط إلى نموذج يتيح ذلك، بدلاً من تمرير طلب نصي بسيط إلى generate، مرِّر صفيفًا يتألّف من جزء وسائط و جزء نصي:

const { text } = await ai.generate([
  { media: { url: 'https://example.com/photo.jpg' } },
  { text: 'Compose a poem about this image.' },
]);

في المثال أعلاه، حدّدت صورة باستخدام عنوان URL HTTPS متاح للجميع. يمكنك أيضًا تمرير بيانات الوسائط مباشرةً من خلال ترميزها كعنوان URL للبيانات. على سبيل المثال:

import { readFile } from 'node:fs/promises';
const b64Data = await readFile('photo.jpg', { encoding: 'base64url' });
const dataUrl = `data:image/jpeg;base64,${b64Data}`;

const { text } = await ai.generate([
  { media: { url: dataUrl } },
  { text: 'Compose a poem about this image.' },
]);

جميع النماذج التي تتيح إدخال الوسائط تتيح استخدام عناوين URL التي تتضمّن بيانات وعناوين URL التي تستخدم بروتوكول HTTPS. وتوفّر بعض plugins للنماذج إمكانية استخدام مصادر وسائط أخرى. على سبيل المثال، يتيح لك المكوّن الإضافي Vertex AI أيضًا استخدام عناوين URL الخاصة بخدمة Cloud Storage (gs://).

إنشاء الوسائط

حتى الآن، تناولت معظم الأمثلة الواردة في هذه الصفحة إنشاء نص باستخدام النماذج اللغوية الكبيرة. ومع ذلك، يمكن أيضًا استخدام Genkit مع نماذج إنشاء الصور. يشبه استخدام generate() مع نموذج إنشاء الصور استخدام نموذج لغوي كبير. على سبيل المثال، لإنشاء صورة باستخدام نموذج Imagen2 من خلال Vertex AI:

  1. يستخدم Genkit عناوين URL الخاصة بـ data: كتنسيق إخراج عادي للوسائط التي تم إنشاؤها. هذا تنسيق عادي يتوفّر فيه العديد من المكتبات لمعالجته. يستخدم هذا المثال حزمة data-urls من jsdom:

    npm i --save data-urls
    npm i --save-dev @types/data-urls
  2. لإنشاء صورة وحفظها في ملف، استخدِم generate() مع تحديد نموذج إنشاء الصور ونوع الوسائط لتنسيق الإخراج:

    import { imagen3Fast, vertexAI } from '@genkit-ai/vertexai';
    import parseDataURL from 'data-urls';
    import { genkit } from 'genkit';
    
    import { writeFile } from 'node:fs/promises';
    
    const ai = genkit({
      plugins: [vertexAI({ location: 'us-central1' })],
    });
    
    (async () => {
      const { media } = await ai.generate({
        model: imagen3Fast,
        prompt: 'photo of a meal fit for a pirate',
        output: { format: 'media' },
      });
    
      if (media === null) throw new Error('No media generated.');
    
      const data = parseDataURL(media.url);
      if (data === null) throw new Error('Invalid "data:" URL.');
    
      await writeFile(`output.${data.mimeType.subtype}`, data.body);
    })();
    

الخطوات التالية

مزيد من المعلومات حول Genkit

  • بصفتك مطوّر تطبيقات، فإنّ الطريقة الأساسية للتأثير في نتائج نماذج الذكاء الاصطناعي التوليدي هي من خلال تقديم طلبات. اطّلِع على إدارة الطلبات للتعرّف على كيفية استخدام Genkit لتطوير طلبات فعّالة وإدارتها في قاعدة بياناتك البرمجية.
  • على الرغم من أنّ generate() هي نواة كل تطبيق يستند إلى الذكاء الاصطناعي التوليدي، فإنّ التطبيقات في العالم الواقعي تتطلّب عادةً عملًا إضافيًا قبل وبعد استدعاء نموذج الذكاء الاصطناعي التوليدي. لتوضيح ذلك، يقدّم Genkit مفهوم العمليات التي يتم تعريفها مثل الدوالّ، ولكنّها تضيف ميزات إضافية، مثل إمكانية المراقبة والنشر المبسّط. لمزيد من المعلومات، اطّلِع على مقالة تحديد سير العمل.

استخدام ميزة "التعلم الآلي للغات" المتقدّم

  • من الطرق لتحسين إمكانات النماذج اللغوية الكبيرة هي إرسال قائمة بهم إلى النموذج اللغوي الكبير تتضمّن طرقًا يمكنه من خلالها طلب مزيد من المعلومات منك أو طلب تنفيذ بعض الإجراءات. يُعرف ذلك باسم استدعاء الأداة أو استدعاء الدالة. يمكن للنماذج التي تم تدريبها لاستخدام هذه الميزة الردّ على طلب باستخدام ردّ بتنسيق خاص، ما يشير إلى التطبيق المُرسِل أنّه ينبغي تنفيذ بعض الإجراءات وإرسال النتيجة مرة أخرى إلى النموذج اللغوي الكبير مع الطلب الأصلي. يحتوي Genkit على وظائف مكتبة تعمل على التشغيل الآلي لكل من إنشاء الطلبات وعناصر حلقة الطلب والاستجابة لأداة تُجري التنفيذ. اطّلِع على استدعاء الأداة لمعرفة المزيد من المعلومات.
  • إنّ الإنشاء المعزّز بالاسترجاع (RAG) هو أسلوب يُستخدَم لإدخال معلومات خاصة بالنطاق في ناتج النموذج. ويتم ذلك من خلال إدراج المعلومات ذات الصلة في طلب قبل تمريره إلى نموذج اللغة. يتطلّب تنفيذ RAG بالكامل تجميع عدة تقنيات معًا: نماذج إنشاء عمليات تضمين النصوص وقواعد بيانات المتجهات ونماذج لغوية كبيرة. اطّلِع على الإنشاء المعزّز بالاسترجاع (RAG) لتعرف كيف تبسِّط Genkit عملية تنسيق هذه العناصر المختلفة.

اختبار مخرجات النموذج

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

يستخدم خبراء Genkit طرقًا منظَّمة لتقييم جودة استجابات نماذج اللغة الكبيرة (LLM)، وذلك باستخدام مجموعة متنوعة من الاستراتيجيات. يمكنك الاطّلاع على مزيد من المعلومات في صفحة التقييم.