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

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

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

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

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

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

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

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

قبل البدء

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

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

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

يحتفظ فريق Genkit بمكونات إضافية للعمل على النماذج التي يوفرها Vertex AI، الذكاء الاصطناعي التوليدي من Google وOllama:

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

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

تحميل المكوّنات الإضافية للنماذج وإعدادها

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

الدالة generate()

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

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

import { generate } from '@genkit-ai/ai';
import { configureGenkit } from '@genkit-ai/core';
import { gemini15Flash } from '@genkit-ai/googleai';

configureGenkit(/* ... */);

(async () => {
  const llmResponse = await generate({
    model: gemini15Flash,
    prompt: 'Invent a menu item for a pirate themed restaurant.',
  });

  console.log(await llmResponse.text());
})();

عند تنفيذ هذا المثال الموجز، سيطبع بعض معلومات تصحيح الأخطاء. متبوعًا بمُخرجات طلب generate()، والذي يكون عادةً Markdown النص كما في المثال التالي:

## 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.

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

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

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

يبدو معرّف سلسلة النموذج مثل providerid/modelid، حيث يظهر رقم تعريف مقدم الخدمة (في هذه الحالة، googleai) يحدد المكون الإضافي، والرقم التعريفي للنموذج هو إلى معرّف السلسلة الخاص بالمكوّن الإضافي لإصدار معين من أحد النماذج.

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

const llmResponse = await generate({
  model: 'ollama/gemma2',
  prompt: 'Invent a menu item for a pirate themed restaurant.',
});

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

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

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

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

const llmResponse = await generate({
  prompt: "Suggest an item for the menu of a pirate themed restaurant",
  model: gemini15Flash,
  config: {
    maxOutputTokens: 400,
    stopSequences: ["<end>", "<fin>"],
    temperature: 1.2,
    topP: 0.4,
    topK: 50,
  },
});

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

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

maxOutputTokens

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

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

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

إيقاف تسلسلات التوقّف

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

تجدر الإشارة إلى أنك تحدد تسلسلات أحرف، وليس رموزًا مميزة في حد ذاتها. في معظم الحالات، فستحدد تسلسل الأحرف الذي يعينه أداة إنشاء الرموز المميزة للنموذج رمز مميز واحد.

المَعلمات التي تتحكّم في "الإبداع"

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

درجة الحرارة

النماذج اللغوية الكبيرة هي في الأساس أجهزة لتوقُّع الرموز المميّزة. لتسلسل مُعيَّن من الرموز المميّزة (مثل الطلب) يتوقّع النموذج اللغوي الكبير (LLM) لكل رمز مميّز في مفرداته احتمالية أن يأتي الرمز المميز بعد ذلك في التسلسل. درجة الحرارة هي عامل قياس يتم من خلاله تقسيم هذه التنبؤات قبل تسويتها لاحتمالية بين 0 و1.

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

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

topP

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

topK

أعلى ك هو قيمة عددية تتحكم أيضًا في عدد الرموز المميزة المحتملة التي ترغب في أن يأخذها النموذج في الاعتبار، ولكن هذه المرة من خلال تحديد الحد الأقصى عدد الرموز المميزة. يعني تحديد القيمة 1 أن النموذج يجب أن يتصرف حتميًا.

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

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

إخراج منظَّم

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

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

import { z } from "zod";
const MenuItemSchema = z.object({
  name: z.string(),
  description: z.string(),
  calories: z.number(),
  allergens: z.array(z.string()),
});

const llmResponse = await generate({
  prompt: "Suggest an item for the menu of a pirate themed restaurant",
  model: gemini15Flash,
  output: {
    schema: MenuItemSchema,
  },
});

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

عند تحديد مخطط في generate()، تنفّذ Genkit عدة إجراءات وراء المشاهد:

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

استخدِم الرد للحصول على نتيجة منظَّمة من مكالمة إنشاء ناجحة. طريقة output() للكائن:

type MenuItem = z.infer<typeof MenuItemSchema>;

const output: MenuItem | null = llmResponse.output();

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

يُرجى العِلم في المثال السابق أنّ طريقة الإخراج يمكن أن تعرض null. يمكن أن عندما يخفق النموذج في إنشاء مخرجات تتوافق مع المخطط. إِنْتَ اكتشاف هذه الحالة أيضًا من خلال رصد قيمة NoValidCandidatesError الاستثناء الذي تم إنشاؤه من خلال الإنشاء:

import { NoValidCandidatesError } from "@genkit-ai/ai";
try {
  llmResponse = await generate(/* ... */);
} catch (e) {
  if (e instanceof NoValidCandidatesError) {
    // Output doesn't conform to schema.
  }
}

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

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

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

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

البث

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

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

import { generateStream } from "@genkit-ai/ai";
import { GenerateResponseChunk } from "@genkit-ai/ai/lib/generate";
const llmResponseStream = await generateStream({
  prompt: 'Suggest a complete menu for a pirate themed restaurant',
  model: gemini15Flash,
});

ومع ذلك، تعرض هذه الدالة قابلة للتكرار غير المتزامن من مقاطع الاستجابة. تعامل مع كل مجموعة من هذه المجموعات عند توفّرها:

for await (const responseChunkData of llmResponseStream.stream()) {
  const responseChunk = responseChunkData as GenerateResponseChunk;
  console.log(responseChunk.text());
}

ما زال بإمكانك الحصول على الردّ بأكمله دُفعة واحدة:

const llmResponse = await llmResponseStream.response();

يعمل البث أيضًا مع الإخراج المنظم:

const MenuSchema = z.object({
  starters: z.array(MenuItemSchema),
  mains: z.array(MenuItemSchema),
  desserts: z.array(MenuItemSchema),
});
type Menu = z.infer<typeof MenuSchema>;

const llmResponseStream = await generateStream({
  prompt: "Suggest a complete menu for a pirate themed restaurant",
  model: gemini15Flash,
  output: { schema: MenuSchema },
});

for await (const responseChunkData of llmResponseStream.stream()) {
  const responseChunk = responseChunkData as GenerateResponseChunk<Menu>;
  // output() returns an object representing the entire output so far
  const output: Menu | null = responseChunk.output();
  console.log(output);
}

تعمل النتائج المنظَّمة للبث بشكل مختلف قليلاً عن النص المتدفق. فعندما يمكنك استدعاء طريقة 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 سلسلة من النماذج قبول الصور والفيديو والصوت كمطالبات.

لتوفير مطالبة بالوسائط على نموذج يدعمها، بدلاً من تمرير طلب نصي بسيط لإنشاء وتمرير صفيف يتكون من جزء وسائط جزء النص:

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

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

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

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

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

جارٍ إنشاء الوسائط

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

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

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

    import { generate } from '@genkit-ai/ai';
    import { configureGenkit } from '@genkit-ai/core';
    import { vertexAI, imagen2 } from '@genkit-ai/vertexai';
    import parseDataURL from 'data-urls';
    
    import { writeFile } from 'node:fs/promises';
    
    configureGenkit({
      plugins: [vertexAI({ location: 'us-central1' })],
    });
    
    (async () => {
      const mediaResponse = await generate({
        model: imagen2,
        prompt: 'photo of a meal fit for a pirate',
        output: { format: 'media' },
      });
    
      const media = mediaResponse.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);
    })();
    

جارٍ تسجيل سجلّ الرسائل

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

لإنشاء سجلّ الرسائل من ردّ نموذج، يمكنك طلب toHistory(). :

let response = await generate({
  model: gemini15Flash,
  prompt: "How do you say 'dog' in French?",
});
let history = response.toHistory();

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

response = await generate({
  model: gemini15Flash,
  prompt: 'How about in Spanish?',
  history,
});
history = response.toHistory();

إذا كان النموذج الذي تستخدمه يتيح الدور system، يمكنك استخدام النموذج الأولي السجلّ لإعداد رسالة النظام:

import { MessageData } from "@genkit-ai/ai/model";
let history: MessageData[] = [
  { role: 'system', content: [{ text: 'Talk like a pirate.' }] },
];
let response = await generate({
  model: gemini15Flash,
  prompt: "How do you say 'dog' in French?",
  history,
});

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

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

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

الاستخدام المتقدّم للنماذج اللغوية الكبيرة

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

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

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

يشكّل المقيّمون في Genkit طُرقًا منظَّمة لتقييم جودة النماذج اللغوية الكبيرة الخاصة بك. إجابات باستخدام مجموعة متنوعة من الاستراتيجيات. يمكنك قراءة المزيد على التقييم.