Pisanie wtyczki modelu Genkit

Wtyczki modelu Genkit dodają do Genkit co najmniej 1 model generatywnej AI rejestr. Model reprezentuje dowolny model generatywny, który może otrzymać jako dane wejściowe i generować tekst, multimedia lub dane jako dane wyjściowe.

Zanim zaczniesz

Więcej informacji o pisaniu znajdziesz w artykule Pisanie wtyczek Genkit. wszelkiego rodzaju wtyczki Genkit, łącznie z wtyczkami do modeli. Zwróć szczególną uwagę na to, każda wtyczka musi eksportować funkcję Init, którą użytkownicy powinni wywoływać przed użyciem wtyczki.

Definicje modelu

Ogólnie rzecz biorąc, wtyczka modelu wywoła w swoim działaniu ai.DefineModel co najmniej 1 wywołanie funkcji Init – raz dla każdego modelu wtyczka udostępnia interfejs. do.

Definicja modelu składa się z 3 komponentów:

  1. Metadane deklarujące możliwości modelu.
  2. Typ konfiguracji z dowolnymi parametrami obsługiwanymi przez model.
  3. Funkcja generowania, która akceptuje ai.GenerateRequest i zwraca ai.GenerateResponse, prawdopodobnie przy użyciu modelu AI do wygenerowania tego drugiego.

Ogólnie kod wygląda tak:

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
	},
)

Deklarowanie możliwości modelu

Każda definicja modelu musi jako część metadanych zawierać Wartość ai.ModelCapabilities określająca cechy obsługiwane przez model. Genkit używa tych informacji do wykrywania określonych zachowań, na przykład weryfikacji czy określone dane wejściowe są prawidłowe dla modelu. Na przykład, jeśli model nie obsługuje interakcji wieloetapowych, przekazanie wiadomości jest błędem historię.

Pamiętaj, że te deklaracje odnoszą się do podanych możliwości modelu przez wtyczkę i nie muszą bezpośrednio mapować możliwości funkcji bazowego modelu i interfejsu API modelu. Na przykład nawet jeśli interfejs API modelu nie pozwoli na definiowanie komunikatów systemowych, wtyczka może zadeklarować obsługę roli systemowej i zastosować ją w postaci specjalnej logiki, wstawia komunikaty systemowe do promptu użytkownika.

Definiowanie schematu konfiguracji modelu

Aby określić opcje generowania obsługiwane przez model, zdefiniuj i wyeksportuj typ konfiguracji. Genkit ma typ ai.GenerationCommonConfig, który zawiera opcji często obsługiwanych przez usługi modeli generatywnej AI. Możesz lub używać jej od razu.

Funkcja generowania powinna sprawdzić, czy żądanie zawiera prawidłową wartość typ opcji.

Przekształcanie żądań i odpowiedzi

Funkcja generowania wykonuje główne działanie wtyczki modelu Genkit: przekształcenie pola ai.GenerateRequest z popularnego formatu Genkit na format obsługiwane przez interfejs API Twojego modelu, a następnie przekształcenie odpowiedzi z model do formatu ai.GenerateResponse używanego przez Genkit.

Czasami do opracowania modelu może być wymagane masowanie lub manipulowanie danymi. i ograniczeniach. Jeśli na przykład Twój model natywnie nie obsługuje funkcji system może być konieczne przekształcenie komunikatu systemowego prompta w model użytkownika .

Eksporty

Oprócz zasobów, które muszą eksportować wszystkie wtyczki, Init i typu Config, wtyczka modelu powinna również eksportować :

  • Typ konfiguracji generowania, jak omówiliśmy wcześniej.

  • Funkcja Model, która zwraca odwołania do zdefiniowanych przez wtyczkę modeli. Często jest to po prostu:

    func Model(name string) *ai.Model {
        return ai.LookupModel(providerID, name)
    }
    
  • Opcjonalnie: funkcja DefineModel, która umożliwia użytkownikom definiowanie modeli, które może zapewnić wtyczka, ale nie jest ona definiowana automatycznie. Istnieją dwa główne powody, dla których warto udostępnić taką funkcję:

    • Wtyczka zapewnia dostęp do zbyt wielu modeli, aby każdy mógł zostać zarejestrowany jeden. Na przykład wtyczka Ollama może zapewnić dostęp do dziesiątek różne modele i częściej są dodawane. Z tego powodu automatycznie definiować dowolne modele i zamiast tego wymaga od użytkownika wywołania DefineModel dla każdego modelu, którego chce używać.

    • Aby umożliwić użytkownikom korzystanie z nowo opublikowanych modeli, które są nie został jeszcze dodany do wtyczki.

    Funkcja DefineModel wtyczki jest zwykle frontendem ai.DefineModel definiującą funkcję generowania, ale pozwalają użytkownikowi określić nazwę modelu i możliwości modelu.