接入自定义模型
自定义模型指的是需要自行部署或配置的 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. 调试插件
插件开发完成后,接下来需测试插件是否可以正常运行。详细说明请参考:
debug-plugins.md
debug-plugins.md
4. 发布插件
如果想要将插件发布至 Dify Marketplace,请参考以下内容:
publish-to-dify-marketplace
publish-to-dify-marketplace
探索更多
快速开始:
插件接口文档:
- Manifest 结构
- Endpoint 详细定义
- 反向调用 Dify 能力
- 工具
- 模型
此页面对您有帮助吗?