カスタムモデルの統合
このドキュメントでは、Difyでカスタムモデルを統合する方法を、Xinferenceモデルを例に詳しく説明します。ドキュメントには、モデルプロバイダーファイルの作成、モデルタイプに応じたコードの記述、モデル呼び出しロジックと例外処理の実装、デバッグと公開までの完全なプロセスが含まれています。特に、LLM呼び出し、トークン計算、認証情報検証、パラメータ生成などのコアメソッドの実装について詳しく説明しています。
カスタムモデルとは、自身でデプロイまたは設定する必要があるLLMを指します。本稿では、Xinferenceモデルを例に、モデルプラグイン内でカスタムモデルを統合する方法を説明します。
カスタムモデルはデフォルトでモデルタイプとモデル名の2つのパラメータを含んでおり、プロバイダーの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
コードファイルの作成方法を説明します。コード作成時には、XinferenceAILargeLanguageModel
という名前のXinference LLMクラスを作成し、__base.large_language_model.LargeLanguageModel
ベースクラスを継承し、以下のいくつかのメソッドを実装する必要があります:
-
LLM呼び出し
LLM呼び出しのコアメソッドであり、ストリーミングと同期の両方のレスポンスをサポートします。
コードを実装する際には、同期応答とストリーミング応答をそれぞれ処理するために、2つの関数を使用してデータを返す必要があることに注意してください。
Pythonは、関数内にyield
キーワードが含まれる関数をジェネレータ関数として認識し、返されるデータ型はGenerator
に固定されるため、同期応答とストリーミング応答をそれぞれ実装する必要があります。例えば、以下のサンプルコードです:
この例では簡略化されたパラメータを使用しています。実際のコード作成時には、上記のパラメータリストを参照してください。
-
入力トークンの事前計算
モデルがトークンを事前計算するインターフェースを提供していない場合は、直接0を返すことができます。
場合によっては、直接0を返したくない場合は、self._get_num_tokens_by_gpt2(text: str)
メソッドを使用してトークンを計算できます。このメソッドはAIModel
ベースクラスにあり、GPT-2のTokenizerを使用して計算します。ただし、これは代替案であり、計算結果にはある程度の誤差が生じる可能性があることに注意してください。
-
モデル認証情報検証
プロバイダーの認証情報検証と同様に、ここでは個別のモデルに対して検証を行います。
-
モデルパラメータスキーマ
事前定義済みモデルタイプとは異なり、YAMLファイルでモデルがサポートするパラメータが事前設定されていないため、モデルパラメータのスキーマを動的に生成する必要があります。
例えば、Xinferenceは
max_tokens
、temperature
、top_p
の3つのモデルパラメータをサポートしています。しかし、一部のプロバイダー(例えばOpenLLM)は、具体的なモデルによって異なるパラメータをサポートします。例を挙げると、プロバイダー
OpenLLM
のAモデルはtop_k
パラメータをサポートしていますが、Bモデルはtop_k
をサポートしていません。この場合、各モデルに対応するパラメータスキーマを動的に生成する必要があります。サンプルコードは以下の通りです:
-
呼び出し例外エラーマッピング表
モデル呼び出しが例外をスローした場合、Runtimeが指定する
InvokeError
タイプにマッピングする必要があります。これにより、Difyが異なるエラーに対して異なる後続処理を行うのに便利です。Runtimeエラー:
InvokeConnectionError
呼び出し接続エラーInvokeServerUnavailableError
呼び出しサービス利用不可InvokeRateLimitError
呼び出しレート制限到達InvokeAuthorizationError
呼び出し認証失敗InvokeBadRequestError
呼び出しパラメータ不正
より多くのインターフェースメソッドについては、インターフェースドキュメント:Modelを参照してください。
本稿で扱った完全なコードファイルを入手するには、GitHubコードリポジトリにアクセスしてください。
3. プラグインのデバッグ
プラグインの開発が完了したら、次にプラグインが正常に動作するかをテストする必要があります。詳細については、以下を参照してください:
4. プラグインの公開
プラグインをDify Marketplaceに公開したい場合は、以下の内容を参照してください:
さらに探索
クイックスタート:
プラグインインターフェースドキュメント: