تولید محتوا با مدل های هوش مصنوعی

در قلب هوش مصنوعی مولد، مدل‌های هوش مصنوعی قرار دارند. در حال حاضر، دو نمونه برجسته از مدل‌های مولد، مدل‌های زبان بزرگ (LLM) و مدل‌های تولید تصویر هستند. این مدل‌ها ورودی را دریافت می‌کنند که اعلان نامیده می‌شود (معمولاً متن، تصویر یا ترکیبی از هر دو)، و از آن به عنوان خروجی متن، تصویر یا حتی صدا یا ویدیو تولید می‌کنند.

خروجی این مدل ها می تواند به طرز شگفت آوری متقاعد کننده باشد: LLM ها متنی را تولید می کنند که به نظر می رسد می تواند توسط یک انسان نوشته شده باشد، و مدل های تولید تصویر می توانند تصاویری تولید کنند که بسیار نزدیک به عکس های واقعی یا آثار هنری خلق شده توسط انسان هستند.

علاوه بر این، LLM ها ثابت کرده اند که قادر به انجام وظایفی فراتر از تولید متن ساده هستند:

  • نوشتن برنامه های کامپیوتری
  • برنامه ریزی وظایف فرعی که برای تکمیل یک کار بزرگتر مورد نیاز است
  • سازماندهی داده های سازمان نیافته
  • درک و استخراج داده های اطلاعاتی از مجموعه ای از متن
  • دنبال کردن و انجام فعالیت های خودکار بر اساس شرح متنی فعالیت

مدل های زیادی از چندین ارائه دهنده مختلف در دسترس شماست. هر مدلی نقاط قوت و ضعف خاص خود را دارد و ممکن است یک مدل در یک کار برتر باشد اما در برخی دیگر عملکرد کمتری داشته باشد. برنامه‌هایی که از هوش مصنوعی مولد استفاده می‌کنند، اغلب می‌توانند بسته به وظیفه‌ای که در دست دارند، از چندین مدل مختلف استفاده کنند.

به‌عنوان یک توسعه‌دهنده اپلیکیشن، معمولاً مستقیماً با مدل‌های هوش مصنوعی مولد تعامل نمی‌کنید، بلکه از طریق سرویس‌هایی که به‌عنوان APIهای وب در دسترس هستند، تعامل دارید. اگرچه این سرویس ها اغلب عملکردهای مشابهی دارند، اما همه آنها را از طریق API های مختلف و ناسازگار ارائه می دهند. اگر می خواهید از چندین سرویس مدل استفاده کنید، باید از هر یک از SDK های اختصاصی آنها استفاده کنید که به طور بالقوه با یکدیگر ناسازگار هستند. و اگر می‌خواهید از یک مدل به جدیدترین و قوی‌ترین مدل ارتقا دهید، ممکن است مجبور شوید دوباره آن یکپارچه‌سازی را ایجاد کنید.

Genkit با ارائه یک رابط واحد که جزئیات دسترسی بالقوه به هر سرویس مدل هوش مصنوعی مولد را با چندین پیاده سازی از پیش ساخته شده در دسترس است، به این چالش رسیدگی می کند. ساختن اپلیکیشن مبتنی بر هوش مصنوعی بر اساس Genkit، فرآیند برقراری اولین تماس هوش مصنوعی مولد شما را ساده می‌کند و ترکیب چند مدل یا تعویض یک مدل با مدل دیگر را با ظهور مدل‌های جدید به همان اندازه آسان می‌کند.

قبل از شروع

اگر می خواهید نمونه کدهای موجود در این صفحه را اجرا کنید، ابتدا مراحل راهنمای شروع کار را کامل کنید. همه مثال ها فرض می کنند که شما قبلاً Genkit را به عنوان یک وابستگی در پروژه خود نصب کرده اید.

مدل های پشتیبانی شده توسط Genkit

Genkit به گونه ای طراحی شده است که به اندازه کافی انعطاف پذیر باشد تا از هر سرویس مدل مولد هوش مصنوعی استفاده کند. کتابخانه های اصلی آن رابط مشترک را برای کار با مدل ها تعریف می کنند و پلاگین های مدل جزئیات پیاده سازی را برای کار با یک مدل خاص و API آن تعریف می کنند.

تیم Genkit پلاگین هایی را برای کار با مدل های ارائه شده توسط Vertex AI، Google Generative AI و Ollama نگهداری می کند:

  • خانواده Gemini از LLM ها، از طریق افزونه Google Cloud Vertex AI
  • خانواده LLMهای جمینی، از طریق افزونه هوش مصنوعی گوگل
  • مدل های تولید تصویر Imagen2 و Imagen3، از طریق Google Cloud Vertex AI
  • خانواده LLM کلود 3 Anthropic، از طریق باغ مدل Google Cloud Vertex AI
  • Gemma 2، Llama 3، و بسیاری از مدل های باز دیگر، از طریق پلاگین Ollama (شما باید سرور Ollama را خودتان میزبانی کنید)

علاوه بر این، چندین افزونه پشتیبانی شده توسط جامعه نیز وجود دارد که رابط هایی را برای این مدل ها فراهم می کند:

می‌توانید با جستجوی بسته‌های برچسب‌گذاری شده با genkit-model در npmjs.org اطلاعات بیشتری کسب کنید.

بارگیری و پیکربندی پلاگین های مدل

قبل از اینکه بتوانید از Genkit برای شروع تولید محتوا استفاده کنید، باید یک پلاگین مدل را بارگیری و پیکربندی کنید. اگر از راهنمای شروع به کار آمده اید، قبلاً این کار را انجام داده اید. در غیر این صورت، راهنمای شروع به کار یا مستندات هر افزونه را ببینید و قبل از ادامه مراحل را در آنجا دنبال کنید.

متد ()generator

در Genkit، رابط اصلی که از طریق آن با مدل‌های هوش مصنوعی مولد تعامل می‌کنید، متد generate() است.

ساده ترین generate() genere مدلی را که می خواهید استفاده کنید و یک اعلان متنی را مشخص می کند:

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);
})();

هنگامی که این مثال مختصر را اجرا می کنید، برخی از اطلاعات اشکال زدایی را چاپ می کند و به دنبال آن خروجی generate() generator که معمولاً متن 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 آن را مشخص کردید.

همچنین می توانید یک مدل برای یک فراخوانی 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() برای فراخوانی مدل هوش مصنوعی مولد استفاده می‌کنید، تغییر مدلی که می‌خواهید استفاده کنید صرفاً به انتقال مقدار متفاوتی به پارامتر مدل بستگی دارد. با استفاده از 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() gene یک پارامتر 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,
  },
});

پارامترهای دقیقی که پشتیبانی می‌شوند به هر مدل و API مدل بستگی دارد. با این حال، پارامترهای مثال قبلی تقریباً برای هر مدلی مشترک است. در زیر توضیحی در مورد این پارامترها ارائه شده است:

پارامترهایی که طول خروجی را کنترل می کنند

maxOutputTokens

LLM ها بر روی واحدهایی به نام توکن عمل می کنند. یک نشانه معمولاً، اما لزوماً به دنباله خاصی از کاراکترها نگاشت می شود. هنگامی که یک درخواست را به یک مدل ارسال می کنید، یکی از اولین گام هایی که انجام می شود این است که رشته درخواست خود را به دنباله ای از توکن ها تبدیل کنید . سپس، LLM دنباله ای از توکن ها را از ورودی توکن شده تولید می کند. در نهایت، دنباله توکن ها دوباره به متن تبدیل می شود که خروجی شماست.

پارامتر حداکثر توکن های خروجی به سادگی محدودیتی را برای تعداد توکن های تولید شده با استفاده از LLM تعیین می کند. هر مدلی به طور بالقوه از یک توکنایزر متفاوت استفاده می کند، اما یک قانون کلی خوب این است که یک کلمه انگلیسی را از 2 تا 4 توکن در نظر بگیرید.

همانطور که قبلاً گفته شد، برخی از نشانه ها ممکن است به دنباله کاراکترها نگاشت نشوند. یکی از این نمونه‌ها این است که اغلب رمزی وجود دارد که پایان دنباله را نشان می‌دهد: وقتی یک LLM این توکن را تولید می‌کند، تولید بیشتر متوقف می‌شود. بنابراین، ممکن است و اغلب اتفاق می‌افتد که یک LLM توکن‌های کمتری نسبت به حداکثر تولید کند، زیرا توکن «stop» را تولید کرده است.

stopSequences

می‌توانید از این پارامتر برای تنظیم توکن‌ها یا توکن‌هایی استفاده کنید که وقتی تولید می‌شوند، پایان خروجی LLM را نشان می‌دهند. مقادیر صحیح برای استفاده در اینجا به طور کلی به نحوه آموزش مدل بستگی دارد و معمولاً توسط افزونه مدل تنظیم می شود. با این حال، اگر از مدل خواسته‌اید که توالی توقف دیگری ایجاد کند، می‌توانید آن را در اینجا مشخص کنید.

توجه داشته باشید که دنباله کاراکترها را مشخص می‌کنید، نه توکن‌ها را فی نفسه. در بیشتر موارد، یک توالی کاراکتر را مشخص می‌کنید که توکنایزر مدل آن را به یک توکن نگاشت می‌کند.

پارامترهای کنترل کننده "خلاقیت"

پارامترهای دما ، top-p و top-k با هم کنترل می‌کنند که می‌خواهید مدل چقدر "خلاقانه" باشد. در زیر توضیحات بسیار مختصری درباره معنای این پارامترها ارائه شده است، اما نکته مهمتر که باید حذف شود این است: این پارامترها برای تنظیم کاراکتر خروجی LLM استفاده می شوند. مقادیر بهینه برای آنها به اهداف و ترجیحات شما بستگی دارد و احتمالاً فقط از طریق آزمایش یافت می شوند.

دما

LLM ها اساساً ماشین های پیش بینی نشانه هستند. برای یک دنباله معین از نشانه ها (مانند اعلان) یک LLM، برای هر نشانه در واژگان خود، احتمال اینکه توکن بعدی در دنباله باشد، پیش بینی می کند. دما یک فاکتور مقیاس‌پذیر است که پیش‌بینی‌ها قبل از نرمال شدن به احتمال بین 0 و 1 بر اساس آن تقسیم می‌شوند.

مقادیر دمای پایین - بین 0.0 و 1.0 - تفاوت احتمالات بین توکن‌ها را تقویت می‌کند، در نتیجه مدل حتی کمتر احتمال دارد که توکنی را تولید کند که قبلاً بعید ارزیابی شده بود. این اغلب به عنوان خروجی کمتر خلاقانه تلقی می شود. اگرچه 0.0 از نظر فنی یک مقدار معتبر نیست، بسیاری از مدل ها آن را به عنوان نشان دهنده این است که مدل باید قاطعانه رفتار کند و تنها یک توکن محتمل را در نظر بگیرد.

مقادیر دمای بالا - آنهایی که بیشتر از 1.0 هستند - اختلاف احتمالات بین نشانه‌ها را فشرده می‌کنند و در نتیجه احتمال تولید نشانه‌هایی که قبلاً بعید به نظر می‌رسید مدل بیشتر می‌شود. این اغلب به عنوان خروجی خلاقانه تلقی می شود. برخی از APIهای مدل حداکثر دما را اعمال می کنند که اغلب 2.0 است.

topP

Top-p مقداری بین 0.0 و 1.0 است که با مشخص کردن احتمال تجمعی توکن‌ها، تعداد توکن‌های ممکنی را که می‌خواهید مدل در نظر بگیرد، کنترل می‌کند. به عنوان مثال، مقدار 1.0 به این معنی است که هر توکن ممکن را در نظر بگیرید (اما همچنان احتمال هر توکن را در نظر بگیرید). مقدار 0.4 به این معنی است که فقط محتمل ترین توکن ها را در نظر بگیرید که احتمال آن ها 0.4 است و بقیه توکن ها را از بررسی حذف کنید.

topK

Top-k یک مقدار صحیح است که همچنین تعداد توکن‌های ممکنی را که می‌خواهید مدل در نظر بگیرد، کنترل می‌کند، اما این بار با مشخص کردن صریح حداکثر تعداد توکن‌ها. تعیین مقدار 1 به این معنی است که مدل باید به طور قطعی رفتار کند.

با پارامترهای مدل آزمایش کنید

شما می توانید با استفاده از Developer UI تاثیر این پارامترها را بر خروجی تولید شده توسط مدل های مختلف و ترکیب های سریع آزمایش کنید. رابط کاربری توسعه دهنده را با دستور 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 چندین کار را در پشت صحنه انجام می دهد:

  • درخواست را با راهنمایی بیشتر در مورد فرمت خروجی مورد نظر تقویت می کند. این همچنین یک اثر جانبی دارد که به مدل مشخص می‌کند که دقیقاً چه محتوایی را می‌خواهید تولید کنید (به عنوان مثال، نه تنها یک آیتم منو را پیشنهاد دهید، بلکه یک توضیح، فهرستی از آلرژن‌ها و غیره را نیز ایجاد کنید).
  • خروجی مدل را در یک شی جاوا اسکریپت تجزیه می کند.
  • تأیید می کند که خروجی با طرح مطابقت دارد.

برای دریافت خروجی ساختاریافته از یک فراخوانی موفق، از ویژگی output شی پاسخ استفاده کنید:

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

رسیدگی به خطاها

در مثال قبلی توجه کنید که ویژگی output می تواند null باشد. این می تواند زمانی اتفاق بیفتد که مدل نتواند خروجی منطبق با طرح تولید کند. بهترین استراتژی برای مقابله با چنین خطاهایی به استفاده دقیق شما بستگی دارد، اما در اینجا چند نکته کلی وجود دارد:

  • یک مدل متفاوت را امتحان کنید . برای موفقیت در خروجی ساختاریافته، مدل باید قادر به تولید خروجی در JSON باشد. قدرتمندترین LLM ها، مانند جمینی و کلود، برای انجام این کار به اندازه کافی همه کاره هستند. با این حال، مدل‌های کوچک‌تر، مانند برخی از مدل‌های محلی که با 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()),
    });
    
  • تماس ()generator را دوباره امتحان کنید . اگر مدلی که انتخاب کرده‌اید به ندرت موفق به تولید خروجی منطبق نمی‌شود، می‌توانید با خطا همانطور رفتار کنید که با خطای شبکه برخورد می‌کنید و به سادگی با استفاده از نوعی استراتژی افزایشی پس‌آف، درخواست را دوباره امتحان کنید.

پخش جریانی

هنگام تولید مقادیر زیادی متن، می‌توانید با ارائه خروجی به هنگام تولید - پخش جریانی خروجی، تجربه را برای کاربران خود بهبود بخشید. نمونه‌ای آشنا از جریان در عمل را می‌توان در اکثر برنامه‌های چت LLM مشاهده کرد: کاربران می‌توانند پاسخ مدل به پیام خود را در حین تولید بخوانند، که پاسخ‌گویی درک شده برنامه را بهبود می‌بخشد و توهم چت کردن با همتای هوشمند را افزایش می‌دهد.

در 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' }
  ]
}

ورودی چندوجهی

نمونه هایی که تا کنون مشاهده کرده اید از رشته های متنی به عنوان درخواست های مدل استفاده کرده اند. در حالی که این رایج‌ترین راه برای درخواست مدل‌های هوش مصنوعی مولد باقی می‌ماند، بسیاری از مدل‌ها می‌توانند رسانه‌های دیگر را نیز به عنوان درخواست بپذیرند. اعلان‌های رسانه اغلب همراه با اعلان‌های متنی استفاده می‌شوند که به مدل دستور می‌دهند تا برخی از عملیات‌ها را روی رسانه انجام دهد، مانند نوشتن شرح تصویر یا رونویسی یک ضبط صوتی.

توانایی پذیرش ورودی رسانه و انواع رسانه ای که می توانید استفاده کنید کاملاً به مدل و API آن بستگی دارد. به عنوان مثال، سری مدل‌های 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های داده و هم از نشانی‌های اینترنتی HTTPS پشتیبانی می‌کنند. برخی از پلاگین های مدل، از منابع رسانه ای دیگر پشتیبانی می کنند. به عنوان مثال، افزونه Vertex AI همچنین به شما امکان می دهد از آدرس های اینترنتی Cloud Storage ( gs:// ) استفاده کنید.

تولید رسانه

تاکنون، بیشتر نمونه‌های موجود در این صفحه به تولید متن با استفاده از LLM پرداخته‌اند. با این حال، Genkit را می توان با مدل های تولید تصویر نیز استفاده کرد. استفاده از generate() با مدل تولید تصویر مشابه استفاده از LLM است. به عنوان مثال، برای تولید یک تصویر با استفاده از مدل Imagen2 از طریق Vertex AI:

  1. Genkit از data: URL ها به عنوان فرمت استاندارد خروجی برای رسانه تولید شده. این یک قالب استاندارد با کتابخانه های زیادی است که برای مدیریت آنها در دسترس است. این مثال از بسته 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 بیشتر بدانید

  • به‌عنوان یک توسعه‌دهنده اپلیکیشن، راه اصلی تأثیرگذاری بر خروجی مدل‌های هوش مصنوعی مولد از طریق درخواست است. مدیریت Prompt را بخوانید تا یاد بگیرید که چگونه Genkit به شما کمک می کند تا دستورات موثر ایجاد کنید و آنها را در پایگاه کد خود مدیریت کنید.
  • اگرچه generate() هسته هر برنامه مولد مبتنی بر هوش مصنوعی است، برنامه های کاربردی دنیای واقعی معمولاً قبل و بعد از فراخوانی یک مدل هوش مصنوعی مولد به کار اضافی نیاز دارند. برای انعکاس این موضوع، Genkit مفهوم جریان‌ها را معرفی می‌کند که مانند توابع تعریف می‌شوند، اما ویژگی‌های اضافی مانند مشاهده‌پذیری و استقرار ساده‌شده را اضافه می‌کنند. برای کسب اطلاعات بیشتر، به تعریف گردش کار مراجعه کنید.

استفاده از LLM پیشرفته

  • یکی از راه‌های افزایش قابلیت‌های LLM این است که فهرستی از راه‌هایی را که می‌توانند از شما اطلاعات بیشتری درخواست کنند یا از شما درخواست کنند تا اقداماتی را انجام دهید، در اختیار آنها قرار دهید. این به عنوان فراخوانی ابزار یا فراخوانی تابع شناخته می شود. مدل‌هایی که برای پشتیبانی از این قابلیت آموزش دیده‌اند، می‌توانند به یک درخواست با یک پاسخ فرمت‌بندی شده ویژه پاسخ دهند، که به برنامه فراخوان نشان می‌دهد که باید اقداماتی را انجام دهد و نتیجه را همراه با درخواست اصلی به LLM ارسال کند. Genkit دارای توابع کتابخانه ای است که هم تولید سریع و هم عناصر حلقه پاسخ به فراخوانی یک ابزار فراخوانی را خودکار می کند. برای کسب اطلاعات بیشتر به تماس با ابزار مراجعه کنید.
  • Retrieval-Augmented Generation (RAG) تکنیکی است که برای معرفی اطلاعات خاص دامنه به خروجی مدل استفاده می شود. این کار با درج اطلاعات مرتبط در یک اعلان قبل از انتقال آن به مدل زبان انجام می شود. یک پیاده‌سازی کامل RAG به شما نیاز دارد که چندین فناوری را با هم ترکیب کنید: مدل‌های تولید جاسازی متن، پایگاه‌های داده برداری و مدل‌های زبان بزرگ. برای اینکه بدانید چگونه Genkit روند هماهنگی این عناصر مختلف را ساده می کند، به نسل افزوده شده بازیابی (RAG) مراجعه کنید.

تست خروجی مدل

به عنوان یک مهندس نرم افزار، شما به سیستم های قطعی عادت دارید که در آن ورودی یکسان همیشه خروجی یکسانی را تولید می کند. با این حال، با احتمالی بودن مدل‌های هوش مصنوعی، خروجی می‌تواند بر اساس تفاوت‌های ظریف در ورودی، داده‌های آموزشی مدل، و حتی تصادفی بودن که عمداً توسط پارامترهایی مانند دما معرفی می‌شود، متفاوت باشد.

ارزیاب‌های Genkit روش‌های ساختاری برای ارزیابی کیفیت پاسخ‌های LLM شما با استفاده از استراتژی‌های مختلف هستند. ادامه مطلب را در صفحه ارزیابی بخوانید.