接入自定义模型

自定义模型指的是需要自行部署或配置的 LLM。本文将以 Xinference 模型为例,演示如何在模型插件内接入自定义模型。

自定义模型默认包含模型类型和模型名称两个参数,无需在供应商 yaml 文件定义。

供应商配置文件无需实现 validate_provider_credential。Runtime 会根据用户选择的模型类型或模型名称,自动调用对应模型层的 validate_credentials 方法进行验证。

接入自定义模型插件

接入自定义模型分为以下步骤:

  1. 创建模型供应商文件

    明确自定义模型中所包含的模型类型。

  2. 根据模型类型创建代码文件

    根据模型的类型(如 llmtext_embedding)创建代码文件。确保每种模型类型有独立的逻辑分层,便于维护和扩展。

  3. 根据不同的模型模块,编写模型调用代码

    在对应的模型类型模块下,创建一个与模型类型同名的 Python 文件(例如 llm.py)。在文件中定义实现具体模型逻辑的类,该类应符合系统的模型接口规范。

  4. 调试插件

    为新增的供应商功能编写单元测试和集成测试,确保所有功能模块符合预期,并能够正常运行。


1. 创建模型供应商文件

在插件项目的 /provider 路径下,新建 xinference.yaml 文件。

Xinference 家族模型支持 LLM``,Text EmbeddingRerank 模型类型,因此需要在 xinference.yaml 文件中包含上述模型类型。

示例代码:

接着需要定义 provider_credential_schema 字段。Xinference 支持 text-generation,embeddings 和 reranking 模型,示例代码如下:

Xinference 中的每个模型都需要定义名称 model_name

Xinference 模型需要使用者输入模型的本地部署地址,插件内需要提供允许填写 Xinference 模型的本地部署地址(server_url)和模型 UID 的位置,示例代码如下:

填写所有参数后即可完成自定义模型供应商 yaml 配置文件的创建。接下来需为配置文件内定义的模型添加具体的功能代码文件。

2. 编写模型代码

Xinference 模型供应商的模型类型包含 llm、rerank、speech2text、tts 类型,因此需要在 /models 路径下为每个模型类型创建独立的分组,并创建对应的功能代码文件。

下文将以 llm 类型为例,说明如何创建 llm.py 代码文件。创建代码时需创建一个 Xinference LLM 类,可以取名为 XinferenceAILargeLanguageModel,继承 __base.large_language_model.LargeLanguageModel 基类,实现以下几个方法:

  • LLM 调用

LLM 调用的核心方法,同时支持流式和同步返回。

实现代码时,需要注意使用两个函数来返回数据,分别用于处理同步返回和流式返回。

Python 会将函数中包含 yield 的关键字函数识别为生成器函数,返回的数据类型固定为 Generator,因此需要分别实现同步和流式返回,例如以下示例代码:

该示例使用了简化参数,实际编写代码时需参考上文中的参数列表。

  • 预计算输入 Tokens

如果模型未提供预计算 tokens 的接口,可以直接返回 0。

在某些情况下,如果不想直接返回 0,可以使用 self._get_num_tokens_by_gpt2(text: str) 方法计算 tokens。该方法位于 AIModel 基类中,使用 GPT-2 的 Tokenizer 进行计算。但请注意,这是一个替代方案,计算结果可能存在一定误差。

  • 模型凭据校验

与供应商凭据校验类似,这里针对单个模型进行校验。

  • 模型参数 Schema

预定义模型类型不同,由于未在 YAML 文件中预设模型所支持的参数,因此需要动态生成模型参数的 Schema。

例如,Xinference 支持 max_tokenstemperaturetop_p 三种模型参数。然而一些供应商(例如 OpenLLM)会根据具体模型支持不同的参数。

举例来说,供应商 OpenLLM 的 A 模型支持 top_k 参数,而 B 模型则不支持 top_k。在该情况下,需要动态生成每个模型对应的参数 Schema,示例代码如下:

  • 调用异常错误映射表

当模型调用异常时需要映射到 Runtime 指定的 InvokeError 类型,方便 Dify 针对不同错误做不同后续处理。

Runtime Errors:

  • InvokeConnectionError 调用连接错误

  • InvokeServerUnavailableError 调用服务方不可用

  • InvokeRateLimitError 调用达到限额

  • InvokeAuthorizationError 调用鉴权失败

  • InvokeBadRequestError 调用传参有误

如需了解更多接口方法,请参考接口文档:Model

如需获取本文所涉及的完整代码文件,请访问 GitHub 代码仓库

3. 调试插件

插件开发完成后,接下来需测试插件是否可以正常运行。详细说明请参考:

插件调试

4. 发布插件

如果想要将插件发布至 Dify Marketplace,请参考以下内容:

发布至 Dify Marketplace

探索更多

快速开始:

插件接口文档:

Last updated