تعتمد تقنية الذكاء الاصطناعي التوليدي على نماذج الذكاء الاصطناعي. إنّ أبرز مثالين على النماذج التوليدية هما النماذج اللغوية الكبيرة (LLM) ونماذج توليد الصور. تتلقّى هذه النماذج إدخالًا يُعرف باسم الطلب (ويكون عادةً نصًا أو صورة أو مزيجًا من الاثنين)، وتُنشئ من خلاله الإخراج، والذي يكون عادةً نصًا أو صورة أو حتى مقطعًا صوتيًا أو فيديو.
يمكن أن تكون نتائج هذه النماذج مقنعة بشكل مفاجئ: تُنشئ النماذج اللغوية الكبيرة نصًا يبدو أنّه من تأليف إنسان، ويمكن لنماذج إنشاء الصور إنتاج صور قريبة جدًا من الصور الفوتوغرافية الحقيقية أو الأعمال الفنية التي أنشأها البشر.
بالإضافة إلى ذلك، أثبتت النماذج اللغوية الكبيرة قدرتها على تنفيذ مهام أخرى غير إنشاء نصوص بسيطة:
- كتابة برامج الكمبيوتر
- التخطيط للمهام الفرعية المطلوبة لإكمال مهمة أكبر
- تنظيم البيانات غير المنظَّمة
- فهم البيانات المعلوماتية واستخراجها من مجموعة نصوص
- اتّباع الأنشطة المبرمَجة وتنفيذها استنادًا إلى وصف نصي للنشاط
تتوفّر لك العديد من النماذج من عدة مقدّمي خدمات مختلفين. لكل نموذج نقاط قوته وضعفه، وقد يتفوّق نموذج معيّن في مهمة معيّنة ويكون أداؤه أقلّ فعالية في مهام أخرى. يمكن للتطبيقات التي تستخدِم الذكاء الاصطناعي التوليدي في أغلب الأحيان الاستفادة من استخدام نماذج متعددة مختلفة حسب المهمة المعنيّة.
بصفتك مطوّر تطبيقات، لا تتفاعل عادةً مع نماذج الذكاء الاصطناعي التوليدي بشكل مباشر، بل من خلال الخدمات المتاحة كواجهات برمجة تطبيقات للويب. على الرغم من أنّه غالبًا ما تتضمّن هذه الخدمات وظائف مشابهة، إلا أنّها تقدّمها جميعًا من خلال واجهات برمجة تطبيقات مختلفة وغير متوافقة. إذا أردت الاستفادة من خدمات نماذج متعددة، عليك استخدام كل حِزم تطوير البرامج (SDK) الخاصة بها، والتي قد تكون غير متوافقة مع بعضها. وإذا أردت الترقية من نموذج إلى الأحدث والأكثر قدرة، قد يكون عليك إنشاء عملية الدمج هذه مجددًا.
يعالج Genkit هذا التحدي من خلال توفير واجهة واحدة تزيل تفاصيل الوصول إلى أي خدمة من خدمات نماذج الذكاء الاصطناعي التوليدي، مع توفّر العديد من عمليات التنفيذ المُعدّة مسبقًا. من خلال إنشاء تطبيقك المستنِد إلى الذكاء الاصطناعي باستخدام Genkit، يمكنك تبسيط عملية إجراء أول طلب للذكاء الاصطناعي التوليدي، ويمكنك أيضًا دمج نماذج متعددة أو تبديل نموذج بآخر عند ظهور نماذج جديدة.
قبل البدء
إذا كنت تريد تنفيذ أمثلة الرموز البرمجية الواردة في هذه الصفحة، عليك أولاً إكمال الخطوات الواردة في دليل البدء. تفترض جميع الأمثلة أنّك سبق أن ثبّت Genkit كتبعية في مشروعك.
الطُرز المتوافقة مع Genkit
تم تصميم Genkit ليكون مرنًا بما يكفي لاستخدام أي خدمة نماذج محتملة للذكاء الاصطناعي التوليدي. وتحدِّد مكتباتها الأساسية الواجهة الشائعة للعمل مع النماذج، وتحدِّد مكوّنات إضافية للنماذج تفاصيل التنفيذ للعمل مع نموذج معيّن وواجهة برمجة التطبيقات الخاصة به.
يحافظ فريق Genkit على الإضافات للعمل مع النماذج التي يوفّرها Vertex AI وGoogle Generative AI وOllama:
- مجموعة النماذج اللغوية الكبيرة (LLM) في Gemini، من خلال مكوّن Google Cloud Vertex AI الإضافي
- مجموعة النماذج اللغوية الكبيرة (LLM) في Gemini، من خلال مكوّن Google AI الإضافي
- Gemma 3 وLlama 4 والمزيد من النماذج المفتوحة من خلال مكوّن Ollama الإضافي (يجب استضافة خادم Ollama بنفسك).
تحميل إضافات النماذج وضبطها
لكي تتمكّن من استخدام Genkit لبدء إنشاء المحتوى، عليك تحميل مكوّن إضافي لنموذج و ضبطه. إذا كنت قد اطّلعت على دليل "البدء"، سبق لك إجراء ذلك. بخلاف ذلك، اطّلِع على دليل البدء أو مستندات المكوّن الإضافي الفردي واتّبِع الخطوات الواردة فيه قبل المتابعة.
دالة genkit.Generate()
في Genkit، الدالة genkit.Generate()
هي الواجهة الأساسية التي تتفاعل من خلالها مع نماذج الذكاء الاصطناعي التوليدي.
تحدِّد أبسط مكالمة genkit.Generate()
النموذج الذي تريد استخدامه وأحد
الطلبات النصية:
import (
"context"
"log"
"github.com/firebase/genkit/go/ai"
"github.com/firebase/genkit/go/genkit"
"github.com/firebase/genkit/go/plugins/googlegenai"
)
func main() {
ctx := context.Background()
g, err := genkit.Init(ctx,
genkit.WithPlugins(&googlegenai.GoogleAI{}),
genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
)
if err != nil {
log.Fatal(err)
}
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
log.Fatal(err)
}
log.Println(resp.Text())
}
عند تنفيذ هذا المثال الموجز، سيتم طباعة بعض معلومات تصحيح الأخطاء followed by the output of the genkit.Generate()
call، والتي ستكون عادةً
نص 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.
يمكنك تشغيل النص البرمجي مرة أخرى وستحصل على نتيجة مختلفة.
أرسل نموذج الرمز البرمجي السابق طلب الإنشاء إلى النموذج التلقائي، الذي حدّدته عند ضبط مثيل Genkit.
يمكنك أيضًا تحديد نموذج لمكالمة genkit.Generate()
واحدة:
resp, err := genkit.Generate(ctx, g,
ai.WithModelName("googleai/gemini-2.5-pro"),
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
يبدو معرّف سلسلة الطراز على النحو التالي: providerid/modelid
، حيث يحدّد معرّف الموفّر
(في هذه الحالة، googleai
) المكوّن الإضافي، ومعرّف الطراز هو
معرّف سلسلة خاص بالمكوّن الإضافي لإصدار معيّن من طراز معيّن.
توضّح هذه الأمثلة أيضًا نقطة مهمة: عند استخدام genkit.Generate()
لإجراء طلبات بحث عن نماذج الذكاء الاصطناعي التوليدي، يكفي تمرير قيمة مختلفة إلى مَعلمة النموذج لتغيير النموذج الذي تريد استخدامه. باستخدام genkit.Generate()
بدلاً من حِزم SDK للنماذج الأصلية،
تحصل على المرونة اللازمة لاستخدام العديد من النماذج المختلفة في
تطبيقك بسهولة أكبر وتغيير النماذج في المستقبل.
حتى الآن، رأيت أمثلة على أبسط طلبات genkit.Generate()
.
ومع ذلك، توفّر genkit.Generate()
أيضًا واجهة لمزيد من التفاعلات المتقدمة
مع النماذج التوليدية، والتي ستظهر لك في الأقسام التالية.
طلبات النظام
تتيح بعض النماذج تقديم طلب من النظام، ما يمنح النموذج تعليمات حول كيفية الردّ على الرسائل الواردة من المستخدم. يمكنك استخدام طلب النظام لتحديد خصائص مثل الشخصية التي تريد أن يتّبعها النموذج ونبرة ردوده وتنسيقها.
إذا كان النموذج الذي تستخدمه يتيح طلبات النظام، يمكنك تقديم طلب باستخدام الخيار
WithSystem()
:
resp, err := genkit.Generate(ctx, g,
ai.WithSystem("You are a food industry marketing consultant."),
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
بالنسبة إلى النماذج التي لا تتيح طلبات النظام، يحاكي WithSystem()
ذلك من خلال
تعديل الطلب ليبدو مثل طلب النظام.
مَعلمات النموذج
تأخذ الدالة genkit.Generate()
خيار WithConfig()
، والذي من خلاله
يمكنك تحديد إعدادات اختيارية تتحكّم في كيفية إنشاء النموذج للمحتوى:
resp, err := genkit.Generate(ctx, g,
ai.WithModelName("googleai/gemini-2.0-flash"),
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
ai.WithConfig(&googlegenai.GeminiConfig{
MaxOutputTokens: 500,
StopSequences: ["<end>", "<fin>"],
Temperature: 0.5,
TopP: 0.4,
TopK: 50,
}),
)
تعتمد المَعلمات الدقيقة المتوافقة على النموذج الفردي وواجهة برمجة التطبيقات الخاصة بالنموذج. ومع ذلك، تكون المَعلمات الواردة في المثال السابق شائعة في كل نموذج تقريبًا. في ما يلي شرح لهذه المَعلمات:
المَعلمات التي تتحكّم في طول الإخراج
MaxOutputTokens
تعمل النماذج اللغوية الكبيرة على وحدات تُعرف باسم الرموز. يتم عادةً ربط الرمز المميّز بسلسلة أحرف معيّنة، ولكن ليس بالضرورة. عند إرسال طلب إلى نموذج، تكون إحدى الخطوات الأولى التي يتّخذها هي تجزئة سلسلة الطلب إلى تسلسل من الرموز. بعد ذلك، ينشئ النموذج اللغوي الكبير تسلسلًا من الرموز من الإدخال المُشفَّر. أخيرًا، يتم تحويل تسلسل الرموز إلى نص، وهو النتيجة التي تظهر لك.
تضع مَعلمة الحد الأقصى لرموز الإخراج حدًا لعدد الرموز المميّزة التي يتم إنشاؤها باستخدام نموذج اللغة الكبير (LLM). من المحتمل أن يستخدم كل نموذج أداة تقسيم مختلفة، ولكن من القواعد الأساسية الجيدة اعتبار أنّ الكلمة الإنجليزية الواحدة تتألف من رمزين إلى 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
، وسيؤدي ذلك إلى تحميل كل نماذج
التي حدّدتها المكوّنات الإضافية التي تم ضبطها في مشروعك تلقائيًا. يمكنك بسرعة
تجربة طلبات مختلفة وقيم إعدادات بدون الحاجة إلى إجراء
هذه التغييرات بشكل متكرّر في الرمز.
إقران الطراز بإعداداته
بما أنّ كل موفِّر أو حتى طراز معيّن قد يكون له مخطّط ملف تكوين
أو يتطلّب إعدادات معيّنة، قد يكون من السهل حدوث خطأ عند ضبط خيارات
منفصلة باستخدام WithModelName()
وWithConfig()
لأنّ الخيار الأخير ليس
من النوع القوي للنوع السابق.
لإقران نموذج بإعداداته، يمكنك إنشاء مرجع نموذج يمكنك إرساله إلى طلب إنشاء النموذج بدلاً من ذلك:
model := googlegenai.GoogleAIModelRef("gemini-2.0-flash", &googlegenai.GeminiConfig{
MaxOutputTokens: 500,
StopSequences: ["<end>", "<fin>"],
Temperature: 0.5,
TopP: 0.4,
TopK: 50,
})
resp, err := genkit.Generate(ctx, g,
ai.WithModel(model),
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
log.Fatal(err)
}
سيفرض مُنشئ مرجع النموذج تقديم نوع config الصحيح الذي قد يقلل من حالات عدم المطابقة.
الإخراج المنظَّم
عند استخدام الذكاء الاصطناعي التوليدي كعنصر في تطبيقك، غالبًا ما تريد الحصول على ناتج بتنسيق غير النص العادي. حتى إذا كنت بصدد إنشاء محتوى لعرضه على المستخدم، يمكنك الاستفادة من الإخراج المنسَّق لمجرد تقديمه بطريقة أكثر جاذبية للمستخدم. ولكن بالنسبة إلى التطبيقات الأكثر تقدمًا للذكاء الاصطناعي التوليدي، مثل الاستخدام الآلي لمخرجات النموذج، أو تغذية مخرجات نموذج معيّن في نموذج آخر، يجب استخدام مخرجات منظَّمة.
في Genkit، يمكنك طلب إخراج منظَّم من نموذج من خلال تحديد نوع
الإخراج عند استدعاء genkit.Generate()
:
type MenuItem struct {
Name string `json:"name"`
Description string `json:"description"`
Calories int `json:"calories"`
Allergens []string `json:"allergens"`
}
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
ai.WithOutputType(MenuItem{}),
)
if err != nil {
log.Fatal(err) // One possible error is that the response does not conform to the type.
}
يتم تحديد أنواع نواتج النماذج على أنّها مخطّط JSON باستخدام حزمة
invopop/jsonschema
. يقدّم ذلك
فحصًا لأنواع وقت التشغيل، ما يسدّ الفجوة بين أنواع Go الثابتة
والناتج غير المتوقّع لنماذج الذكاء الاصطناعي التوليدي. يتيح لك هذا النظام كتابة код يمكنه الاعتماد على حقيقة أنّ أيّ طلب إنشاء ناجح سيؤدي دائمًا إلى عرض ناتج يتوافق مع أنواع Go.
عند تحديد نوع إخراج في genkit.Generate()
، تُجري أداة Genkit عدة
عمليات في الخلفية:
- تضيف إرشادات إضافية حول تنسيق الإخراج الذي تم اختياره ويؤدي ذلك أيضًا إلى تحديد المحتوى الذي تريد إنشاءه بالضبط للنموذج (على سبيل المثال، ليس فقط اقتراح عنصر من القائمة، ولكن أيضًا إنشاء وصف وقائمة بالمسببات الحساسية وما إلى ذلك).
- للتحقّق من أنّ الإخراج متوافق مع المخطّط
- تُعدّ مخرجات النموذج إلى نوع Go.
للحصول على مخرجات منظَّمة من طلب إنشاء ناجح، يمكنك استدعاء Output()
في
استجابة النموذج باستخدام قيمة فارغة من النوع:
var item MenuItem
if err := resp.Output(&item); err != nil {
log.Fatalf(err)
}
log.Printf("%s (%d calories, %d allergens): %s\n",
item.Name, item.Calories, len(item.Allergens), item.Description)
بدلاً من ذلك، يمكنك استخدام genkit.GenerateData()
لإجراء مكالمة أكثر إيجازًا:
item, resp, err := genkit.GenerateData[MenuItem](ctx, g,
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
log.Fatal(err)
}
log.Printf("%s (%d calories, %d allergens): %s\n",
item.Name, item.Calories, len(item.Allergens), item.Description)
تتطلّب هذه الدالة مَعلمة نوع الإخراج، ولكنها تضبط تلقائيًا خيار
WithOutputType()
وتستدعي resp.Output()
قبل عرض القيمة.
معالجة الأخطاء
يُرجى العلم أنّ طلب genkit.Generate()
في المثال السابق قد يؤدي إلى
خطأ. يمكن أن يحدث خطأ محتمل عندما يتعذّر على النموذج إنشاء ناتج
يتوافق مع المخطّط. تعتمد أفضل استراتيجية للتعامل مع هذه الأخطاء
على حالة الاستخدام المحدّدة، ولكن إليك بعض النصائح العامة:
جرِّب نموذجًا مختلفًا. لكي ينجح الإخراج المنظَّم، يجب أن يكون النموذج قادرًا على إنشاء إخراج بتنسيق JSON. إنّ النماذج اللغوية الكبيرة الأكثر فعالية، مثل Gemini، متنوعة بما يكفي لإجراء ذلك. ومع ذلك، قد لا تتمكّن النماذج الأصغر حجمًا، مثل بعض النماذج المحلية التي ستستخدمها مع Ollama، من إنشاء إخراج منظَّم بشكل موثوق ما لم يتم تدريبها على وجه التحديد للقيام بذلك.
تبسيط المخطط: قد تواجه النماذج اللغوية الكبيرة صعوبة في إنشاء أنواع معقّدة أو عميقة التداخل. جرِّب استخدام أسماء واضحة أو حقول أقل أو بنية مسطّحة إذا لم تتمكّن من إنشاء بيانات منظَّمة بشكل موثوق.
إعادة محاولة الاتصال بالرقم
genkit.Generate()
إذا كان النموذج الذي اخترته نادرًا ما يتعذّر عليه إنشاء ناتج متوافق، يمكنك التعامل مع الخطأ كما تتم التعامل مع خطأ في الشبكة، وإعادة محاولة الطلب باستخدام نوع من استراتيجية التراجع المتزايد.
البث
عند إنشاء كميات كبيرة من النصوص، يمكنك تحسين تجربة المستخدِمين من خلال عرض النتيجة أثناء إنشائها، أي بثّها. يمكن الاطّلاع على مثالٍ مألوف على البث المباشر في معظم تطبيقات المحادثة المستندة إلى نماذج اللغة الكبيرة: يمكن للمستخدمين قراءة ردّ النموذج على رسالتهم أثناء إنشائه، ما يؤدي إلى تحسين سرعة استجابة التطبيق المُتصورة وتعزيز الوهم بأنّهم يتحدثون مع مستخدم ذكي.
في Genkit، يمكنك بث الإخراج باستخدام الخيار WithStreaming()
:
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("Suggest a complete menu for a pirate themed restaurant."),
ai.WithStreaming(func(ctx context.Context, chunk *ai.ModelResponseChunk) error {
// Do something with the chunk...
log.Println(chunk.Text())
return nil
}),
)
if err != nil {
log.Fatal(err)
}
log.Println(resp.Text())
إدخال متعدد الوسائط
في الأمثلة التي رأيتها حتى الآن، تم استخدام سلاسل نصية كطلبات نموذجية. مع أنّه لا تزال هذه الطريقة هي الأكثر شيوعًا لطلب إنشاء نماذج الذكاء الاصطناعي التوليدي، يمكن للعديد من النماذج قبول وسائل إعلام أخرى كطلبات. غالبًا ما يتم استخدام طلبات الوسائط مع طلبات نصية تطلب من النموذج تنفيذ بعض العمليات على الوسائط، مثل إضافة ترجمة لصورة أو تحويل تسجيل صوتي إلى نص.
تعتمد إمكانية قبول إدخال الوسائط وأنواع الوسائط التي يمكنك استخدامها كليًا على النموذج وواجهة برمجة التطبيقات الخاصة به. على سبيل المثال، يمكن أن تقبل سلسلة نماذج Gemini 2.0 الصور والفيديوهات والمقاطع الصوتية كطلبات.
لتقديم طلب وسائط إلى نموذج يتيح ذلك، بدلاً من تمرير طلب genkit.Generate()
بسيط نصي إلى genkit.Generate()
، يمكنك تمرير صفيف يتألف من جزء وسائط وجزء نصي. يحدِّد هذا المثال صورة باستخدام عنوان URL عبر بروتوكول HTTPS يمكن للجميع الوصول إليه.
resp, err := genkit.Generate(ctx, g,
ai.WithModelName("googleai/gemini-2.0-flash"),
ai.WithMessages(
NewUserMessage(
NewMediaPart("image/jpeg", "https://example.com/photo.jpg"),
NewTextPart("Compose a poem about this image."),
),
),
)
يمكنك أيضًا تمرير بيانات الوسائط مباشرةً من خلال ترميزها كعنوان URL للبيانات. على سبيل المثال:
image, err := ioutil.ReadFile("photo.jpg")
if err != nil {
log.Fatal(err)
}
resp, err := genkit.Generate(ctx, g,
ai.WithModelName("googleai/gemini-2.0-flash"),
ai.WithMessages(
NewUserMessage(
NewMediaPart("image/jpeg", "data:image/jpeg;base64," + base64.StdEncoding.EncodeToString(image)),
NewTextPart("Compose a poem about this image."),
),
),
)
تتيح جميع النماذج التي تتيح إدخال الوسائط استخدام عناوين URL للبيانات وعناوين URL لبروتوكول HTTPS. وتوفّر بعض plugins للنماذج إمكانية استخدام مصادر وسائط أخرى. على سبيل المثال، يتيح لك المكوّن الإضافي Vertex AI
أيضًا استخدام عناوين URL الخاصة بخدمة Cloud Storage (gs://
).
الخطوات التالية
مزيد من المعلومات حول Genkit
- بصفتك مطوّر تطبيقات، فإنّ الطريقة الأساسية للتأثير في نتائج نماذج الذكاء الاصطناعي التوليدي هي من خلال تقديم طلبات. اطّلِع على مقالة إدارة الطلبات باستخدام Dotprompt للتعرّف على كيفية مساعدة Genkit في تطوير طلبات فعّالة وإدارتها في قاعدة الترميز.
- على الرغم من أنّ
genkit.Generate()
هي نواة كل تطبيق يستند إلى الذكاء الاصطناعي التوليدي، فإنّ التطبيقات في العالم الواقعي تتطلّب عادةً عملًا إضافيًا قبل وبعد استدعاء نموذج الذكاء الاصطناعي التوليدي. لتوضيح ذلك، يقدّم Genkit مفهوم العمليات التي يتم تعريفها مثل الدوالّ، ولكنّها تضيف ميزات إضافية، مثل إمكانية المراقبة والنشر المبسّط. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة تحديد سير عمل الذكاء الاصطناعي.
استخدام ميزة "التعلم الآلي للغات" المتقدّم
هناك تقنيات يمكن لتطبيقك استخدامها للاستفادة بشكل أكبر من النماذج اللغوية الكبيرة.
- من الطرق لتحسين إمكانات النماذج اللغوية الكبيرة هي إرسال قائمة بهم إلى النموذج اللغوي الكبير تتضمّن طرقًا يمكنه من خلالها طلب مزيد من المعلومات منك أو طلب تنفيذ بعض الإجراءات. يُعرف ذلك باسم استدعاء الأداة أو استدعاء الدالة. يمكن للنماذج التي تم تدريبها لاستخدام هذه الميزة الردّ على طلب باستخدام ردّ بتنسيق خاص، ما يشير إلى التطبيق المُرسِل أنّه يجب تنفيذ بعض الإجراءات وإرسال النتيجة مرة أخرى إلى النموذج اللغوي الكبير مع الطلب الأصلي. يحتوي Genkit على وظائف مكتبة تعمل على التشغيل الآلي لكل من إنشاء الطلب وعناصر حلقة الطلب والاستجابة لأداة تُجري التنفيذ. اطّلِع على استدعاء الأداة لمعرفة مزيد من المعلومات.
- إنّ الإنشاء المعزّز بالاسترجاع (RAG) هو أسلوب يُستخدَم لإدخال معلومات خاصة بالنطاق في ناتج النموذج. ويتم ذلك من خلال إدراج المعلومات ذات الصلة في طلب قبل تمريره إلى نموذج اللغة. يتطلّب تنفيذ RAG بالكامل تجميع عدة تقنيات معًا: نماذج إنشاء عمليات تضمين النصوص وقواعد بيانات المتجهات ونماذج لغوية كبيرة. اطّلِع على الإنشاء المعزّز بالاسترجاع (RAG) لتعرف كيف تبسِّط Genkit عملية تنسيق هذه العناصر المختلفة.