Genkit 플러그인 작성

Firebase Genkit의 기능은 플러그인으로 확장되도록 설계되었습니다. Genkit 플러그인은 구성 가능한 모듈임 모델, 검색기, 색인 생성기, 트레이스 저장소 등을 제공할 수 있습니다. 이미 보셨듯이 플러그인은 Genkit를 사용하면 됩니다.

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

configureGenkit({
  plugins: [vertexAI({ projectId: 'my-project' })],
});

Vertex AI 플러그인은 구성(예: 사용자의 Google Cloud 프로젝트 ID)을 가져오고 Genkit 레지스트리에 다양한 새 모델, 삽입기 등을 등록합니다. 이 레지스트리는 Genkit의 로컬 UI를 구동하여 모델, 프롬프트 등을 검사할 수 있을 뿐만 아니라 작업을 실행할 수 있습니다.

플러그인 만들기

플러그인을 만들려면 일반적으로 다음과 같이 새로운 NPM 패키지를 생성합니다.

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

그런 다음 기본 진입점에서 플러그인을 정의하고 내보냅니다.

import { genkitPlugin } from '@genkit-ai/core';

interface MyPluginOptions {
  // add any plugin configuration here
}

export const myPlugin = genkitPlugin(
  'my-plugin',
  async (options: MyPluginOptions) => {
    // initialize your plugin here...
  }
);

플러그인 옵션 안내

일반적으로 플러그인은 다음을 포함하는 단일 options 인수를 사용해야 합니다. 작동하는 데 필요한 모든 플러그인 전체 구성 'www.example.com'을 포함한 에 보안 비밀 값(예: API 키)이 필요한 경우 옵션을 제공하는 동시에 보안 비밀 값을 기본 환경 변수를 사용하여 구성합니다.

import { genkitPlugin, GenkitError } from '@genkit-ai/core';

interface MyPluginOptions {
  apiKey?: string;
}

export const myPlugin = genkitPlugin(
  'my-plugin',
  async (options: MyPluginOptions) => {
    const apiKey = options.apiKey || process.env.MY_PLUGIN_API_KEY;
    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.',
      });
    // ... continue initialization
  }
);

플러그인 빌드

단일 플러그인으로 Genkit 내에서 많은 새로운 항목을 활성화할 수 있습니다. 예를 들어 Vertex AI 플러그인은 임베딩 및 여러 새 모델을 활성화합니다.

모델 플러그인

Genkit 모델 플러그인은 하나 이상의 생성형 AI 모델을 Genkit 레지스트리에 추가합니다. 모델은 모든 생성형 프롬프트를 입력으로 수신하고 텍스트, 미디어 또는 데이터를 출력으로 생성할 수 있는 모델입니다. 일반적으로 모델 플러그인은 초기화 함수에서 하나 이상의 defineModel를 호출합니다.

커스텀 모델은 일반적으로 다음 세 가지 구성요소로 구성됩니다.

  1. 모델의 기능을 정의하는 메타데이터
  2. 모델에서 지원하는 특정 매개변수가 있는 구성 스키마
  3. GenerateRequestGenerateResponse를 반환합니다.

모델 플러그인을 빌드하려면 @genkit-ai/ai 패키지를 사용해야 합니다.

npm i --save @genkit-ai/ai

개략적으로 모델 플러그인은 다음과 같을 수 있습니다.

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

export const myPlugin = genkitPlugin('my-plugin', async (options: {apiKey?: string}) => {
  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);
  });
});

요청 및 응답 변환

Genkit 모델 플러그인의 기본 작업은 GenerateRequest를 Genkit의 일반적인 형식에서 인식되는 형식으로 변환 지원한 다음 응답에서 응답을 변환하여 모델을 Genkit에서 사용하는 GenerateResponseData 형식으로 변환합니다.

때로는 모델 제한을 해결하기 위해 데이터를 마사지하거나 조작해야 할 수도 있습니다. 예를 들어 모델이 기본적으로 system 메시지를 지원하지 않는 경우 프롬프트의 시스템 메시지를 사용자/모델 메시지 쌍으로 변환해야 할 수 있습니다.

모델 참조

defineModel를 사용하여 모델을 등록하면 다음 경우에 항상 사용할 수 있습니다. 지정할 수 있습니다. 그러나 입력 및 IDE 자동 완성을 개선하기 위해 패키지에서 애플리케이션의 메타데이터만 포함된 모델 참조를 구현되지 않은 모델입니다.

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

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

generate()를 호출할 때는 모델 참조와 문자열 모델 이름을 서로 바꿔서 사용할 수 있습니다.

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

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

원격 분석 플러그인

Genkit Telemetry 플러그인 작성을 참고하세요.

플러그인 게시

Genkit 플러그인은 일반 NPM 패키지로 게시할 수 있습니다. 증가 검색 가능성과 일관성을 극대화하려면 패키지 이름은 genkitx-{name}: Genkit 플러그인임을 나타내며 다음과 같이 포함해야 합니다. 귀하의 package.json에 있는 다음 keywords 중 다수 플러그인:

  • genkit-plugin: 항상 이 키워드를 패키지에 포함하여 Genkit 플러그인임을 나타냅니다.
  • genkit-model: 패키지가 모델을 정의하는 경우 이 키워드를 포함합니다.
  • genkit-retriever: 패키지가 검색기를 정의하는 경우 이 키워드를 포함합니다.
  • genkit-indexer: 패키지에서 색인 생성기를 정의하는 경우 이 키워드를 포함합니다.
  • genkit-embedder: 패키지에서 색인 생성기를 정의하는 경우 이 키워드를 포함합니다.
  • genkit-tracestore: 패키지가 트레이스 저장소를 정의하는 경우 이 키워드를 포함합니다.
  • genkit-statestore: 패키지가 상태 저장소를 정의하는 경우 이 키워드를 포함합니다.
  • genkit-telemetry: 패키지가 원격 분석 제공자를 정의하는 경우 이 키워드를 포함합니다.
  • genkit-deploy: 패키지에 Genkit 앱을 클라우드 제공업체에 배포하기 위한 도우미가 포함된 경우 이 키워드를 포함합니다.
  • genkit-flow: 패키지가 Genkit 흐름을 개선하는 경우 이 키워드를 포함합니다.

검색기, 임베딩기, 모델을 제공하는 플러그인에는 다음과 같은 package.json가 있을 수 있습니다.

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