Menulis plugin model Genkit

Plugin model Genkit menambahkan satu atau beberapa model AI generatif ke registry Genkit. Model mewakili semua model generatif yang mampu menerima prompt sebagai input dan menghasilkan teks, media, atau data sebagai output.

Sebelum memulai

Baca Menulis plugin Genkit untuk mengetahui informasi tentang penulisan segala jenis plugin Genkit, termasuk plugin model. Secara khusus, perhatikan bahwa setiap plugin harus mengekspor fungsi Init, yang diharapkan akan dipanggil oleh pengguna sebelum menggunakan plugin.

Definisi model

Biasanya, plugin model akan melakukan satu atau beberapa panggilan ai.DefineModel di fungsi Init—sebanyak satu kali untuk setiap model, yang antarmukanya disediakan oleh plugin.

Definisi model terdiri dari tiga komponen:

  1. Metadata yang mendeklarasikan kemampuan model.
  2. Jenis konfigurasi dengan parameter tertentu yang didukung oleh model.
  3. Fungsi pembuatan yang menerima ai.GenerateRequest dan menampilkan ai.GenerateResponse, mungkin menggunakan model AI untuk membuat model yang kedua.

Pada tingkat tinggi, berikut ini tampilannya dalam kode:

type MyModelConfig struct {
	ai.GenerationCommonConfig
	CustomOption int
	AnotherCustomOption string
}
ai.DefineModel(
	providerID, "my-model",
	&ai.ModelMetadata{
		Label: "my-model",
		Supports: ai.ModelCapabilities{
			Multiturn:  true,  // Does the model support multi-turn chats?
			SystemRole: true,  // Does the model support syatem messages?
			Media:      false, // Can the model accept media input?
			Tools:      false, // Does the model support function calling (tools)?
		},
	},
	func(ctx context.Context,
		genRequest *ai.GenerateRequest,
		_ ai.ModelStreamingCallback,
	) (*ai.GenerateResponse, error) {
		// Verify that the request includes a configuration that conforms to
		// your schema .
		if _, ok := genRequest.Config.(MyModelConfig); !ok {
			return nil, fmt.Errorf("request config must be type MyModelConfig")
		}

		// Use your custom logic to convert Genkit's ai.GenerateRequest
		// into a form usable by the model's native API.
		apiRequest, err := apiRequestFromGenkitRequest(genRequest)
		if err != nil {
			return nil, err
		}

		// Send the request to the model API, using your own code or the
		// model API's client library.
		apiResponse, err := callModelAPI(apiRequest)
		if err != nil {
			return nil, err
		}

		// Use your custom logic to convert the model's response to Genkin's
		// ai.GenerateResponse.
		response, err := genResponseFromAPIResponse(apiResponse)
		if err != nil {
			return nil, err
		}

		return response, nil
	},
)

Mendeklarasikan kemampuan model

Setiap definisi model harus berisi, sebagai bagian dari metadatanya, nilai ai.ModelCapabilities yang mendeklarasikan fitur mana yang didukung model tersebut. Genkit menggunakan informasi ini untuk menentukan perilaku tertentu, seperti memverifikasi apakah input tertentu bersifat valid untuk model tersebut atau tidak. Misalnya, jika model tidak mendukung interaksi multi-turn, maka meneruskan histori pesan merupakan kesalahan.

Perhatikan bahwa deklarasi ini merujuk pada kemampuan model seperti yang disediakan oleh plugin Anda, dan belum tentu memetakan one-to-one ke kemampuan model dasar dan API model. Misalnya, meskipun API model tidak menyediakan cara khusus untuk mendefinisikan pesan sistem, plugin Anda mungkin masih mendeklarasikan dukungan untuk peran sistem, dan menerapkannya sebagai logika khusus yang menyisipkan pesan sistem ke dalam prompt pengguna.

Menentukan skema konfigurasi model Anda

Untuk menetapkan opsi pembuatan yang didukung model, tentukan dan ekspor jenis konfigurasi. Genkit memiliki jenis ai.GenerationCommonConfig yang berisi opsi yang sering didukung oleh layanan model AI generatif, yang juga dapat disematkan atau digunakan secara langsung.

Fungsi pembuatan harus memverifikasi bahwa permintaan berisi jenis opsi yang tepat.

Mentransformasi permintaan dan respons

Fungsi pembuatan mengerjakan tugas utama plugin model Genkit: mengubah ai.GenerateRequest dari format umum Genkit ke format yang didukung oleh API model Anda, lalu mengubah respons dari model Anda ke dalam format ai.GenerateResponse yang digunakan oleh Genkit.

Terkadang, hal ini mungkin memerlukan pengiriman pesan atau manipulasi data untuk mengatasi keterbatasan model. Misalnya, jika model Anda tidak mendukung pesan system secara native, Anda mungkin perlu mengubah pesan sistem prompt menjadi pasangan pesan pengguna-model.

Ekspor

Selain resource yang harus diekspor oleh semua plugin— fungsi Init dan jenis Config— plugin model juga harus mengekspor hal berikut ini:

  • Jenis konfigurasi pembuatan, seperti yang telah dibahas sebelumnya.

  • Fungsi Model, yang menampilkan referensi ke model yang ditentukan plugin Anda. Sering kali, hal ini bisa berupa:

    func Model(name string) *ai.Model {
        return ai.LookupModel(providerID, name)
    }
    
  • Opsional: Fungsi DefineModel, yang memungkinkan pengguna menentukan model yang yang disediakan oleh plugin Anda, tetapi tidak Anda tentukan secara otomatis. Ada dua alasan utama mengapa Anda perlu menyediakan fungsi tersebut:

    • Plugin Anda memberikan akses ke terlalu banyak model untuk mendaftarkan masing-masing model secara praktis. Misalnya, plugin Ollama dapat memberikan akses ke berbagai model, dan masih banyak lagi yang ditambahkan secara berkala. Karena alasan ini, plugin tidak secara otomatis mendefinisikan model apa pun, dan sebaliknya mengharuskan pengguna untuk memanggil DefineModel untuk setiap model yang ingin mereka gunakan.

    • Untuk memberi pengguna kemampuan menggunakan model yang baru dirilis, yang belum ditambahkan ke plugin Anda.

    Fungsi DefineModel plugin biasanya merupakan frontend untuk ai.DefineModel yang mendefinisikan fungsi pembuatan, tetapi memungkinkan pengguna menentukan nama model dan kemampuan model.