การเขียนปลั๊กอิน 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 ของผู้ใช้) และลงทะเบียนโมเดล เครื่องมือฝัง และอื่นๆ ที่หลากหลายกับรีจิสทรีของ Genkit รีจิสทรีขับเคลื่อน UI ภายในของ Genkit สำหรับโมเดลการเรียกใช้และการตรวจสอบ พรอมต์ และอื่นๆ รวมถึงทำหน้าที่เป็นบริการค้นหาการดำเนินการที่มีชื่อขณะรันไทม์

การสร้างปลั๊กอิน

หากต้องการสร้างปลั๊กอิน โดยทั่วไปคุณจะต้องสร้างแพ็กเกจ 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 เดียวที่มีการกำหนดค่าทั้งปลั๊กอินที่จำเป็นต่อการทำงาน สำหรับตัวเลือกปลั๊กอินที่ต้องใช้ค่าข้อมูลลับ เช่น คีย์ 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 จะเพิ่มโมเดล Generative AI อย่างน้อย 1 โมเดลลงในรีจิสทรี Genkit โมเดลจะแสดงโมเดล Generative ที่สามารถรับข้อความแจ้งเป็นอินพุตและสร้างข้อความ สื่อ หรือข้อมูลเป็นเอาต์พุต โดยทั่วไปปลั๊กอินโมเดลจะทำการเรียก defineModel อย่างน้อย 1 ครั้งในฟังก์ชันการเริ่มต้น

โดยทั่วไป รูปแบบที่กำหนดเองจะมีองค์ประกอบ 3 อย่าง ได้แก่

  1. ข้อมูลเมตาที่กำหนดความสามารถของโมเดล
  2. สคีมาการกำหนดค่าซึ่งมีพารามิเตอร์ที่เฉพาะเจาะจงซึ่งโมเดลรองรับ
  3. ฟังก์ชันที่ใช้โมเดลที่ยอมรับ GenerateRequest และแสดงผล GenerateResponse

หากต้องการสร้างปลั๊กอินโมเดล คุณจะต้องใช้แพ็กเกจ @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 เป็นรูปแบบที่ API ของโมเดลของคุณรู้จักและรองรับ จากนั้นก็เปลี่ยนการตอบกลับจากโมเดลให้เป็นรูปแบบ GenerateResponseData ที่ Genkit ใช้งานอยู่

บางครั้งการทำเช่นนี้อาจต้องมีการนวดหรือจัดการข้อมูลเพื่อเลี่ยงข้อจำกัดของโมเดล เช่น หากโมเดลของคุณไม่รองรับข้อความ 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 และคุณควรรวม keywords ต่อไปนี้ไว้ใน package.json ตามที่เกี่ยวข้องกับปลั๊กอินของคุณ

  • 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.
}