接入自定义模型
自定义模型指的是需要自行部署或配置的 LLM。本文将以 Xinference 模型为例,演示如何在模型插件内接入自定义模型。
自定义模型默认包含模型类型和模型名称两个参数,无需在供应商 yaml 文件定义。
供应商配置文件无需实现 validate_provider_credential。Runtime 会根据用户选择的模型类型或模型名称,自动调用对应模型层的 validate_credentials 方法进行验证。
接入自定义模型插件
接入自定义模型分为以下步骤:
创建模型供应商文件
明确自定义模型中所包含的模型类型。
根据模型类型创建代码文件
根据模型的类型(如
llm或text_embedding)创建代码文件。确保每种模型类型有独立的逻辑分层,便于维护和扩展。根据不同的模型模块,编写模型调用代码
在对应的模型类型模块下,创建一个与模型类型同名的 Python 文件(例如 llm.py)。在文件中定义实现具体模型逻辑的类,该类应符合系统的模型接口规范。
调试插件
为新增的供应商功能编写单元测试和集成测试,确保所有功能模块符合预期,并能够正常运行。
1. 创建模型供应商文件
在插件项目的 /provider 路径下,新建 xinference.yaml 文件。
Xinference 家族模型支持 LLM``,Text Embedding 和 Rerank 模型类型,因此需要在 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_tokens、temperature 和 top_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