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

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

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

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

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

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

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

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

قبل از شروع

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

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

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

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

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

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

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

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

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

تابع ()generator

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

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

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() 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.

اسکریپت را دوباره اجرا کنید و خروجی متفاوتی خواهید داشت.

نمونه کد قبلی مدل را با استفاده از یک مرجع مدل صادر شده توسط افزونه مدل مشخص کرد. همچنین می توانید مدل را با استفاده از یک شناسه رشته مشخص کنید:

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() gene یک پارامتر 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,
  },
});

پارامترهای دقیقی که پشتیبانی می‌شوند به هر مدل و 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 "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 چندین کار را در پشت صحنه انجام می دهد:

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

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

type MenuItem = z.infer<typeof MenuItemSchema>;

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

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

در مثال قبلی توجه داشته باشید که روش خروجی می تواند null برگرداند. این می تواند زمانی اتفاق بیفتد که مدل نتواند خروجی منطبق با طرح را تولید کند. شما همچنین می توانید این شرایط را با گرفتن استثنا NoValidCandidatesError پرتاب شده توسط generate تشخیص دهید:

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

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

  • یک مدل متفاوت را امتحان کنید . برای موفقیت در خروجی ساختاریافته، مدل باید قادر به تولید خروجی در 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() است:

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

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

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

توانایی پذیرش ورودی رسانه و انواع رسانه ای که می توانید استفاده کنید کاملاً به مدل و API آن بستگی دارد. به عنوان مثال، سری مدل‌های Gemini 1.5 می‌توانند تصاویر، ویدیو و صدا را به عنوان درخواست بپذیرند.

برای ارائه اعلان رسانه ای به مدلی که از آن پشتیبانی می کند، به جای ارسال یک اعلان متن ساده برای تولید، آرایه ای متشکل از یک بخش رسانه و یک قسمت متن ارسال کنید:

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

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

تولید رسانه

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

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

ضبط تاریخچه پیام

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

برای تولید تاریخچه پیام از یک پاسخ مدل، متد 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 بیشتر بدانید

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

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

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

تست خروجی مدل

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

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