编写 Genkit 模型插件

Genkit 模型插件可在 Genkit 中添加一个或多个生成式 AI 模型 注册表中。模型是指任何能够接收模型 提示作为输入并生成文本、媒体或数据作为输出。

准备工作

如需了解如何编写 Genkit 插件,请参阅编写 Genkit 插件 任何种类的 Genkit 插件,包括模型插件。需要特别注意的是 每个插件都必须导出一个 Init 函数,用户应调用该函数 然后再使用该插件

模型定义

通常,模型插件会在其ai.DefineModel Init 函数 - 插件提供接口的每个模型各一次 目标。

模型定义由三部分组成:

  1. 用于声明模型功能的元数据。
  2. 一种配置类型,包含模型支持的任何特定参数。
  3. 一个接受 ai.GenerateRequest 并返回 ai.GenerateResponse,假定前者使用 AI 模型来生成后者。

概括来讲,代码如下所示:

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 类型包含 选择经常支持的一些生成式 AI 模型服务, 嵌入或直接使用。

您的生成函数应验证请求是否包含正确的 选项类型。

转换请求和响应

生成函数执行 Genkit 模型插件的主要工作: 将 ai.GenerateRequest 从 Genkit 通用格式转换为格式 然后将响应从 转换为 Genkit 使用的 ai.GenerateResponse 格式。

有时,这可能需要整理或处理数据来变通模型 限制。例如,如果您的模型本身不支持 system 消息,您可能需要将提示的系统消息转换为用户模型, 消息对。

导出内容

除了所有插件都必须导出的资源之外,还要指定 Init 函数和一个 Config 类型,模型插件还应导出 以下:

  • 一种生成配置类型,如上文所述。

  • Model 函数,用于返回对插件所定义模型的引用。 通常,您只需按以下步骤操作即可:

    func Model(name string) *ai.Model {
        return ai.LookupModel(providerID, name)
    }
    
  • 可选DefineModel 函数,可让用户定义 但这些并不是您自动定义的。还有 需要提供此类函数的两个主要原因:

    • 你的插件提供对太多模型的访问权限,导致每个模型无法实际注册每个模型 一个。例如,Ollama 插件可以提供对数十种 不同模型,添加频率更高。因此, 自动定义任何模型,而是要求用户调用 DefineModel

    • 为了让您的用户能够使用 尚未添加到您的插件中。

    插件的 DefineModel 函数通常是 ai.DefineModel 的前端 用于定义生成函数,但用户可以指定模型名称 和模型功能。