การเขียนปลั๊กอิน Genkit

ความสามารถของ Firebase Genkit ได้รับการออกแบบมาเพื่อให้ขยายความสามารถด้วยปลั๊กอิน ปลั๊กอิน Genkit คือโมดูลที่กำหนดค่าได้ซึ่งสามารถจัดหาโมเดล เครื่องมือดึงข้อมูล ตัวจัดทําดัชนี พื้นที่เก็บข้อมูลการติดตาม และอื่นๆ คุณได้เห็นการทำงานของปลั๊กอินแล้วเพียงใช้ Genkit

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

const ai = genkit({
  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
npm i --save-dev typescript
npx tsc --init

จากนั้นกําหนดและส่งออกปลั๊กอินจากจุดแรกเข้าหลัก ดังนี้

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(...)
    // ....
  });
};

คำแนะนำเกี่ยวกับตัวเลือกปลั๊กอิน

โดยทั่วไปแล้ว ปลั๊กอินควรใช้อาร์กิวเมนต์ options รายการเดียวที่มีการกำหนดค่าทั่วทั้งปลั๊กอินที่จำเป็นต่อการทำงาน สําหรับตัวเลือกปลั๊กอินที่ต้องใช้ค่าลับ เช่น คีย์ API คุณควรระบุทั้งตัวเลือกและตัวแปรสภาพแวดล้อมเริ่มต้นเพื่อกําหนดค่า ดังนี้

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(...)
    
    // ....
  });
};

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

ปลั๊กอินเดียวสามารถเปิดใช้งานสิ่งใหม่ๆ หลายอย่างภายใน 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, 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);
    });
  });
};


การเปลี่ยนรูปแบบคำขอและการตอบกลับ

งานหลักของปลั๊กอินโมเดล 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 สามารถเผยแพร่เป็นแพ็กเกจ 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.
}