การเขียนปลั๊กอิน 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' });

ปลั๊กอิน Telemetry

ดูการเขียนปลั๊กอิน 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.
}