Написание плагина модели Genkit

Плагины моделей Genkit добавляют одну или несколько генеративных моделей искусственного интеллекта в реестр Genkit. Модель представляет собой любую генеративную модель, которая способна принимать приглашение в качестве входных данных и генерировать текст, мультимедиа или данные в качестве выходных данных.

Прежде чем вы начнете

Прочтите статью «Написание плагинов Genkit» , чтобы получить информацию о написании любых плагинов Genkit, включая плагины моделей. В частности, обратите внимание, что каждый плагин должен экспортировать функцию Init , которую пользователи должны вызывать перед использованием плагина.

Определения моделей

Как правило, плагин модели выполняет один или несколько вызовов ai.DefineModel в своей функции Init — один раз для каждой модели, для которой плагин предоставляет интерфейс.

Определение модели состоит из трех компонентов:

  1. Метаданные, объявляющие возможности модели.
  2. Тип конфигурации с любыми конкретными параметрами, поддерживаемыми моделью.
  3. Функция генерации, которая принимает ai.GenerateRequest и возвращает ai.GenerateResponse , предположительно используя модель искусственного интеллекта для генерации последнего.

На высоком уровне вот как это выглядит в коде:

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

Объявление возможностей модели

Каждое определение модели должно содержать в составе метаданных значение ai.ModelCapabilities , которое объявляет, какие функции поддерживает модель. Genkit использует эту информацию для определения определенного поведения, например для проверки допустимости определенных входных данных для модели. Например, если модель не поддерживает многооборотные взаимодействия, то передавать ей историю сообщений будет ошибкой.

Обратите внимание, что эти объявления относятся к возможностям модели, предоставляемым вашим плагином, и не обязательно однозначно сопоставляются с возможностями базовой модели и API модели. Например, даже если API модели не предоставляет конкретного способа определения системных сообщений, ваш плагин все равно может объявить поддержку системной роли и реализовать ее как специальную логику, которая вставляет системные сообщения в приглашение пользователя.

Определение схемы конфигурации вашей модели

Чтобы указать параметры генерации, которые поддерживает модель, определите и экспортируйте тип конфигурации. Genkit имеет тип ai.GenerationCommonConfig , который содержит параметры, часто поддерживаемые службами генеративных моделей ИИ, которые вы можете встроить или использовать напрямую.

Ваша функция генерации должна проверить, что запрос содержит правильный тип параметров.

Преобразование запросов и ответов

Функция генерации выполняет основную работу плагина модели Genkit: преобразует ai.GenerateRequest из общего формата Genkit в формат, поддерживаемый API вашей модели, а затем преобразует ответ вашей модели в формат ai.GenerateResponse , используемый Генкит.

Иногда для обхода ограничений модели может потребоваться обработка данных или манипулирование ими. Например, если ваша модель изначально не поддерживает system сообщение, вам может потребоваться преобразовать системное сообщение приглашения в пару сообщений модели пользователя.

Экспорт

В дополнение к ресурсам, которые все плагины должны экспортировать — функции Init и типу Config — плагин модели также должен экспортировать следующее:

  • Тип конфигурации генерации, как обсуждалось ранее .

  • Функция Model , которая возвращает ссылки на модели, определенные вашим плагином. Часто это может быть просто:

    func Model(name string) *ai.Model {
        return ai.LookupModel(providerID, name)
    }
    
  • Необязательно : функция DefineModel , которая позволяет пользователям определять модели, которые может предоставить ваш плагин, но которые вы не определяете автоматически. Есть две основные причины, по которым вам может потребоваться предоставить такую ​​функцию:

    • Ваш плагин предоставляет доступ к слишком большому количеству моделей, чтобы практически зарегистрировать каждую. Например, плагин Ollama может предоставить доступ к десяткам различных моделей, причем часто добавляются новые. По этой причине он не определяет модели автоматически, а вместо этого требует, чтобы пользователь вызывал DefineModel для каждой модели, которую он хочет использовать.

    • Чтобы дать вашим пользователям возможность использовать недавно выпущенные модели, которые вы еще не добавили в свой плагин.

    Функция DefineModel плагина обычно является интерфейсом к ai.DefineModel , который определяет функцию генерации, но позволяет пользователю указать имя модели и возможности модели.