برنامه نویسی

با Prompt API Chrome در Angular یک طبقه‌بندی احساسات بسازید

در این پست وبلاگ، نحوه ساخت یک برنامه طبقه بندی احساسات به صورت محلی با استفاده از Chrome's Built-In Prompt API و Angular را توضیح می دهم. برنامه Angular برای ایجاد یک مدل زبان، Prompt API را فراخوانی می کند و پرس و جوهایی را به Gemini Nano ارسال می کند تا احساسات مثبت یا منفی را طبقه بندی کند.

مزیت استفاده از هوش مصنوعی داخلی کروم هزینه صفر است زیرا برنامه از مدل‌های محلی Chrome Canary استفاده می‌کند. زمانی که کاربران از Chrome Dev یا Chrome Canary استفاده می کنند، این مسیر خوشحال کننده است. اگر کاربران از مرورگرهای غیر کروم یا قدیمی کروم استفاده می‌کنند، یک پیاده‌سازی مجدد باید در دسترس باشد، مانند تماس با جما یا جمینی در Vertex AI برای بازگرداندن احساس صحیح.

Gemini Nano را روی کروم نصب کنید

Chrome Dev/Canary را به آخرین نسخه به‌روزرسانی کنید. تا لحظه نگارش این مقاله، جدیدترین نسخه Chrome Canary 133 است.

لطفاً برای ثبت نام در برنامه پیش نمایش اولیه Chrome Built-in AI به این بخش مراجعه کنید.
https://developer.chrome.com/docs/ai/built-in#get_an_early_preview

لطفاً برای فعال کردن Gemini Nano در کروم و دانلود مدل به این بخش مراجعه کنید. https://developer.chrome.com/docs/ai/get-started#use_apis_on_localhost

غیرفعال کردن طبقه‌بندی ایمنی متن در کروم

  • (توسعه محلی) به chrome://flags/#text-safety-classifier بروید.
  • (توسعه محلی) Disabled را انتخاب کنید
  • روی راه اندازی مجدد یا راه اندازی مجدد کروم کلیک کنید.

داربست یک برنامه زاویه ای

ng new prompt-api-demo
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

وابستگی ها را نصب کنید

npm i -save-exact -save-dev @types/dom-chromium-ai
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این وابستگی تایپ TypeScript همه APIهای داخلی Chrome را فراهم می کند. بنابراین، توسعه دهندگان می توانند کدهای ظریفی برای ساخت برنامه های هوش مصنوعی در TypeScript بنویسند.

در main.ts، یک تگ مرجع برای اشاره به فایل تعریف تایپ بسته اضافه کنید.

// main.ts

///    
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مدل زبان را بوت استرپ کنید

import { InjectionToken } from '@angular/core';

export const AI_PROMPT_API_TOKEN = new InjectionToken<AILanguageModelFactory | undefined>('AI_PROMPT_API_TOKEN');
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

export function provideLanguageModel(): EnvironmentProviders {
   return makeEnvironmentProviders([
       {
           provide: AI_PROMPT_API_TOKEN,
           useFactory: () => {
               const platformId = inject(PLATFORM_ID);
               const objWindow = isPlatformBrowser(platformId) ? window : undefined;
               return  objWindow?.ai?.languageModel;
           },
       }
   ]);
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

من ارائه دهندگان محیط را برای بازگشت تعریف می کنم languageModel در window.ai فضای نام وقتی کدها را تزریق می کنند AI_LANGUAGE_PROMPT_API_TOKEN آنها می توانند به Prompt API دسترسی داشته باشند تا متدهای آن را برای ارسال پرس و جوها به Gemini Nano فراخوانی کنند.

// app.config.ts

export const appConfig: ApplicationConfig = {
  providers: [
    provideLanguageModel()
  ]
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در پیکربندی برنامه، provideLanguageModel به آرایه ارائه دهندگان وارد می شود.

نسخه مرورگر و در دسترس بودن API را تأیید کنید

هوش مصنوعی داخلی کروم در وضعیت آزمایشی است و Prompt API در نسخه 131 کروم و جدیدتر پشتیبانی می‌شود. بنابراین، من منطق اعتبارسنجی را برای اطمینان از در دسترس بودن API قبل از نمایش رابط کاربری اجرا کردم تا کاربران بتوانند متون را وارد کنند.

قوانین اعتبارسنجی عبارتند از:

  • مرورگر کروم است
  • نسخه مرورگر حداقل 131 است
  • ai Object در فضای نام پنجره است
  • وضعیت Prompt API به راحتی است
export async function checkChromeBuiltInAI(): Promise<string> {
  if (!isChromeBrowser()) {
     throw new Error(ERROR_CODES.NOT_CHROME_BROWSER);
  }

  if (getChromVersion() < CHROME_VERSION) {
     throw new Error(ERROR_CODES.OLD_BROWSER);
  }

  if (!('ai' in globalThis)) {
     throw new Error(ERROR_CODES.NO_PROMPT_API);
  }

  const assistant = inject(AI_PROMPT_API_TOKEN);
  const status = (await assistant?.capabilities())?.available;
  if (!status) {
     throw new Error(ERROR_CODES.API_NOT_READY);
  } else if (status === 'after-download') {
     throw new Error(ERROR_CODES.AFTER_DOWNLOAD);
  } else if (status === 'no') {
     throw new Error(ERROR_CODES.NO_LARGE_LANGUAGE_MODEL);
  }

  return '';
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

را checkChromeBuiltInAI تابع اطمینان می دهد که Prompt API تعریف شده و آماده استفاده است. اگر بررسی ناموفق باشد، تابع خطا می دهد. در غیر این صورت یک رشته خالی برمی گرداند.

export function isPromptAPISupported(): Observable<string> {
  return from(checkChromeBuiltInAI()).pipe(
     catchError(
        (e) => {
           console.error(e);
           return of(e instanceof Error ? e.message : 'unknown');
        }
     )
  );
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

را isPromptApiSupported تابع خطا را می گیرد و پیغام خطای Observable of را برمی گرداند.

نمایش اجزای هوش مصنوعی

@Component({
    selector: 'app-detect-ai',
    imports: [PromptShowcaseComponent],
    template: `
    
@let error = hasCapability(); @if (!error) { } @else if (error !== 'unknown') { {{ error }} }
`
}) export class DetectAIComponent { hasCapability = toSignal(isPromptAPISupported(), { initialValue: '' }); }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

را DetectAIComponent را ارائه می دهد PromptShowcaseComponent جایی که هیچ خطایی وجود ندارد در غیر این صورت پیغام خطا را در سیگنال خطا نمایش می دهد.

// prompt-showcase.component.ts 

@Component({
   selector: 'app-prompt-showcase',
   imports: [NgComponentOutlet],
   template: `
   @let outlet = componentOutlet();
   
 `,
   changeDetection: ChangeDetectionStrategy.OnPush
})
export class PromptShowcaseComponent {
   promptService = inject(ZeroPromptService);
   componentOutlet = computed(() => {  
      return {
        component: NShotsPromptComponent,
        inputs: {}
      }
   });
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

را PromptShowcaserComponent را ارائه می دهد NShotsPromptComponent به صورت پویا

N Shots Prompt Component

// n-shots-prompt.component.ts

@Component({
   selector: 'app-n-shot-prompt',
   imports: [FormsModule],
   template: `
   

N-shots prompting

@let myState = state();

Prompt:

دکمه بازگشت به بالا