Viết trình bổ trợ Genkit

Các tính năng của Firebase Genkit được thiết kế để mở rộng bằng các trình bổ trợ. Trình bổ trợ Genkit là các mô-đun có thể định cấu hình có thể cung cấp mô hình, trình truy xuất, trình lập chỉ mục, kho theo dõi và nhiều tính năng khác. Bạn đã thấy các trình bổ trợ hoạt động chỉ bằng cách sử dụng Genkit:

import { genkit } from 'genkit';
import { vertexAI } from '@genkit-ai/vertexai';

const ai = genkit({
  plugins: [vertexAI({ projectId: 'my-project' })],
});

Trình bổ trợ Vertex AI lấy cấu hình (chẳng hạn như mã dự án Google Cloud của người dùng) và đăng ký nhiều mô hình, trình nhúng mới và nhiều nội dung khác bằng sổ đăng ký Genkit. Cấu phần đăng ký cung cấp năng lượng cho giao diện người dùng cục bộ của Genkit để chạy và kiểm tra các mô hình, lời nhắc, v.v. cũng như đóng vai trò là dịch vụ tra cứu cho các thao tác được đặt tên trong thời gian chạy.

Tạo trình bổ trợ

Để tạo một trình bổ trợ, bạn thường sẽ muốn tạo một gói NPM mới:

mkdir genkitx-my-plugin
cd genkitx-my-plugin
npm init -y
npm i --save genkit
npm i --save-dev typescript
npx tsc --init

Sau đó, hãy xác định và xuất trình bổ trợ từ điểm truy cập chính:

import { Genkit, z } from 'genkit';
import { GenkitPlugin, genkitPlugin } from 'genkit/plugin';

interface MyPluginOptions {
  // add any plugin configuration here
}

export function myPlugin(options?: MyPluginOptions) {
  return genkitPlugin('myPlugin', async (ai: Genkit) => {
    ai.defineModel(...);
    ai.defineEmbedder(...)
    // ....
  });
};

Hướng dẫn về các tuỳ chọn trình bổ trợ

Nhìn chung, trình bổ trợ của bạn phải lấy một đối số options duy nhất bao gồm mọi cấu hình trên trình bổ trợ cần thiết để hoạt động. Đối với mọi tuỳ chọn trình bổ trợ yêu cầu giá trị bí mật, chẳng hạn như khoá API, bạn nên cung cấp cả tuỳ chọn và biến môi trường mặc định để định cấu hình tuỳ chọn đó:

import { Genkit, z } from 'genkit';
import { GenkitPlugin, genkitPlugin } from 'genkit/plugin';
import { GenkitError } from '@genkit-ai/core';

interface MyPluginOptions {
  apiKey?: string;
}

export function myPlugin(options?: MyPluginOptions) {
  return genkitPlugin('myPlugin', async (ai: Genkit) => {
    if (!apiKey)
      throw new GenkitError({
        source: 'my-plugin',
        status: 'INVALID_ARGUMENT',
        message:
          'Must supply either `options.apiKey` or set `MY_PLUGIN_API_KEY` environment variable.',
      });

    ai.defineModel(...);
    ai.defineEmbedder(...)
    
    // ....
  });
};

Tạo trình bổ trợ

Một trình bổ trợ có thể kích hoạt nhiều tính năng mới trong Genkit. Ví dụ: trình bổ trợ Vertex AI kích hoạt một số mô hình mới cũng như trình nhúng.

Trình bổ trợ mô hình

Trình bổ trợ mô hình Genkit thêm một hoặc nhiều mô hình AI tạo sinh vào sổ đăng ký Genkit. Mô hình đại diện cho mọi mô hình tạo sinh có thể nhận câu lệnh làm dữ liệu đầu vào và tạo văn bản, nội dung nghe nhìn hoặc dữ liệu làm dữ liệu đầu ra. Nhìn chung, trình bổ trợ mô hình sẽ thực hiện một hoặc nhiều lệnh gọi defineModel trong hàm khởi chạy.

Mô hình tuỳ chỉnh thường bao gồm 3 thành phần:

  1. Siêu dữ liệu xác định chức năng của mô hình.
  2. Sơ đồ cấu hình có bất kỳ tham số cụ thể nào mà mô hình hỗ trợ.
  3. Hàm triển khai mô hình chấp nhận GenerateRequest và trả về GenerateResponse.

Để tạo trình bổ trợ mô hình, bạn cần sử dụng gói @genkit-ai/ai:

npm i --save @genkit-ai/ai

Nhìn chung, trình bổ trợ mô hình có thể có dạng như sau:

import { genkitPlugin, GenkitPlugin } from 'genkit/plugin';
import { GenkitError } from '@genkit-ai/core';
import { GenerationCommonConfigSchema } from '@genkit-ai/ai/model';
import { simulateSystemPrompt } from '@genkit-ai/ai/model/middleware';
import { z } from 'genkit';


export function myPlugin(options?: MyPluginOptions) {
  return genkitPlugin('my-plugin', async (ai: Genkit) => {
    ai.defineModel({
      // be sure to include your plugin as a provider prefix
      name: 'my-plugin/my-model',
      // label for your model as shown in Genkit Developer UI
      label: 'My Awesome Model',
      // optional list of supported versions of your model
      versions: ['my-model-001', 'my-model-001'],
      // model support attributes
      supports: {
        multiturn: true, // true if your model supports conversations
        media: true, // true if your model supports multimodal input
        tools: true, // true if your model supports tool/function calling
        systemRole: true, // true if your model supports the system role
        output: ['text', 'media', 'json'], // types of output your model supports
      },
      // Zod schema for your model's custom configuration
      configSchema: GenerationCommonConfigSchema.extend({
        safetySettings: z.object({...}),
      }),
      // list of middleware for your model to use
      use: [simulateSystemPrompt()]
    }, async request => {
      const myModelRequest = toMyModelRequest(request);
      const myModelResponse = await myModelApi(myModelRequest);
      return toGenerateResponse(myModelResponse);
    });
  });
};


Biến đổi yêu cầu và phản hồi

Công việc chính của trình bổ trợ mô hình Genkit là chuyển đổi GenerateRequest từ định dạng chung của Genkit thành định dạng được API của mô hình nhận dạng và hỗ trợ, sau đó chuyển đổi phản hồi từ mô hình thành định dạng GenerateResponseData mà Genkit sử dụng.

Đôi khi, bạn có thể phải điều chỉnh hoặc thao tác với dữ liệu để khắc phục các hạn chế của mô hình. Ví dụ: nếu mô hình của bạn không hỗ trợ tin nhắn system theo cách gốc, thì bạn có thể cần chuyển đổi thông báo hệ thống của lời nhắc thành một cặp thông báo người dùng/mô hình.

Tài liệu tham khảo về mô hình

Sau khi một mô hình được đăng ký bằng defineModel, mô hình đó sẽ luôn có sẵn khi được yêu cầu theo tên. Tuy nhiên, để cải thiện tính năng tự động hoàn thành IDE và nhập liệu, bạn có thể xuất tệp tham chiếu mô hình từ gói của mình. Tệp này chỉ chứa siêu dữ liệu cho mô hình chứ không chứa cách triển khai mô hình:

import { modelRef } from "@genkit-ai/ai/model";

export myModelRef = modelRef({
  name: "my-plugin/my-model",
  configSchema: MyConfigSchema,
  info: {
    // ... model-specific info
  },
})

Khi gọi generate(), bạn có thể sử dụng tham chiếu mô hình và tên mô hình chuỗi thay thế cho nhau:

import { myModelRef } from 'genkitx-my-plugin';
import { generate } from '@genkit-ai/ai';

generate({ model: myModelRef });
// is equivalent to
generate({ model: 'my-plugin/my-model' });

Phát hành trình bổ trợ

Bạn có thể phát hành các trình bổ trợ Genkit dưới dạng gói NPM thông thường. Để tăng khả năng khám phá và tối đa hoá tính nhất quán, bạn nên đặt tên gói là genkitx-{name} để cho biết đó là trình bổ trợ Genkit và bạn nên đưa nhiều keywords sau đây vào package.json có liên quan đến trình bổ trợ của mình:

  • genkit-plugin: luôn đưa từ khoá này vào gói của bạn để cho biết đó là trình bổ trợ Genkit.
  • genkit-model: đưa từ khoá này vào nếu gói của bạn xác định bất kỳ mô hình nào.
  • genkit-retriever: đưa từ khoá này vào nếu gói của bạn xác định bất kỳ trình truy xuất nào.
  • genkit-indexer: đưa từ khoá này vào nếu gói của bạn xác định bất kỳ trình lập chỉ mục nào.
  • genkit-embedder: đưa từ khoá này vào nếu gói của bạn xác định bất kỳ trình lập chỉ mục nào.
  • genkit-tracestore: đưa từ khoá này vào nếu gói của bạn xác định bất kỳ kho lưu trữ dấu vết nào.
  • genkit-statestore: đưa từ khoá này vào nếu gói của bạn xác định bất kỳ kho trạng thái nào.
  • genkit-telemetry: đưa từ khoá này vào nếu gói của bạn xác định một nhà cung cấp dữ liệu đo từ xa.
  • genkit-deploy: đưa từ khoá này vào nếu gói của bạn có các trình trợ giúp để triển khai ứng dụng Genkit cho các nhà cung cấp dịch vụ đám mây.
  • genkit-flow: đưa từ khoá này vào nếu gói của bạn cải thiện luồng Genkit.

Trình bổ trợ cung cấp trình truy xuất, trình nhúng và mô hình có thể có package.json như sau:

{
  "name": "genkitx-my-plugin",
  "keywords": ["genkit-plugin", "genkit-retriever", "genkit-embedder", "genkit-model"],
  // ... dependencies etc.
}