11 KiB
事前定義モデル接続
プロバイダー統合完了後、次にプロバイダーへのモデルの接続を行います。
まず、接続するモデルのタイプを決定し、対応するプロバイダーのディレクトリ内に対応するモデルタイプのモジュールを作成する必要があります。
現在サポートされているモデルタイプは以下の通りです:
LLMテキスト生成モデルtext_embeddingテキスト埋め込みrerankランク再評価モデルspeech2text音声からテキストTTSテキストから音声moderation審査
ここではAnthropicを例に取ります。AnthropicはLLMのみをサポートしているため、model_providers.anthropicにllmという名前のモジュールを作成します。
事前定義のモデルの場合、まずllmモジュール内にモデル名をファイル名とするYAMLファイルを作成する必要があります。例:claude-2.1.yaml
モデルYAMLの準備
model: claude-2.1 # モデル識別子
# モデル表示名。en_US英語、zh_Hans中国語の二つの言語を設定できます。zh_Hansが設定されていない場合、デフォルトでen_USが使用されます。
# ラベルを設定しない場合、モデル識別子が使用されます。
label:
en_US: claude-2.1
model_type: llm # モデルタイプ、claude-2.1はLLM
features: # サポートする機能、agent-thoughtはエージェント推論、visionは画像理解をサポート
- agent-thought
model_properties: # モデルプロパティ
mode: chat # LLMモード、completeはテキスト補完モデル、chatは対話モデル
context_size: 200000 # 最大コンテキストサイズ
parameter_rules: # モデル呼び出しパラメータルール、LLMのみ提供が必要
- name: temperature # 呼び出しパラメータ変数名
# デフォルトで5つの変数内容設定テンプレートが用意されています。temperature/top_p/max_tokens/presence_penalty/frequency_penalty
# use_template内でテンプレート変数名を設定すると、entities.defaults.PARAMETER_RULE_TEMPLATE内のデフォルト設定が使用されます
# 追加の設定パラメータを設定した場合、デフォルト設定を上書きします
use_template: temperature
- name: top_p
use_template: top_p
- name: top_k
label: # 呼び出しパラメータ表示名
zh_Hans: 取样数量
en_US: Top k
type: int # パラメータタイプ、float/int/string/booleanがサポートされています
help: # ヘルプ情報、パラメータの作用を説明
zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
en_US: Only sample from the top K options for each subsequent token.
required: false # 必須かどうか、設定しない場合もあります
- name: max_tokens_to_sample
use_template: max_tokens
default: 4096 # パラメータデフォルト値
min: 1 # パラメータ最小値、float/intのみ使用可能
max: 4096 # パラメータ最大値、float/intのみ使用可能
pricing: # 価格情報
input: '8.00' # 入力単価、つまりプロンプト単価
output: '24.00' # 出力単価、つまり返答内容単価
unit: '0.000001' # 価格単位、上記価格は100Kあたりの単価
currency: USD # 価格通貨
すべてのモデル設定を準備完了後にモデルコードの実装を開始することをお勧めします。
同様に、他のプロバイダーの対応モデルタイプディレクトリ内のYAML設定情報を参照することもできます。完全なYAMLルールについては、Schema1をご覧ください。
モデル呼び出しコードの実装
次に、llmモジュール内に同名のPythonファイルllm.pyを作成し、コード実装を行います。
llm.py内にAnthropic LLMクラスを作成し、AnthropicLargeLanguageModel(任意の名前)と名付け、基底クラス__base.large_language_model.LargeLanguageModelを継承し、以下のメソッドを実装します:
-
LLM呼び出し
LLM呼び出しのコアメソッドを実装し、ストリーミングと同期返答の両方をサポートします。
def _invoke(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], model_parameters: dict, tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, stream: bool = True, user: Optional[str] = None) \ -> Union[LLMResult, Generator]: """ LLMを呼び出す :param model: モデル名 :param credentials: モデル認証情報 :param prompt_messages: プロンプトメッセージ :param model_parameters: モデルパラメータ :param tools: ツール呼び出し用ツール :param stop: 停止ワード :param stream: ストリーム応答かどうか :param user: ユーザーID :return: 完全な応答またはストリーミング応答チャンク生成結果 """実装時には、同期返答とストリーミング返答を処理するために2つの関数を使用する必要があります。Pythonは
yieldキーワードを含む関数をジェネレータ関数として認識し、返されるデータタイプが固定されるため、同期返答とストリーミング返答を別々に実装する必要があります。以下のように(以下の例では簡略化されたパラメータを使用していますが、実際の実装では上記のパラメータリストに従う必要があります):def _invoke(self, stream: bool, **kwargs) \ -> Union[LLMResult, Generator]: if stream: return self._handle_stream_response(**kwargs) return self._handle_sync_response(**kwargs) def _handle_stream_response(self, **kwargs) -> Generator: for chunk in response: yield chunk def _handle_sync_response(self, **kwargs) -> LLMResult: return LLMResult(**response) -
事前計算入力トークン
モデルが事前計算トークンインターフェースを提供していない場合は、0を返しても構いません。
def get_num_tokens(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], tools: Optional[list[PromptMessageTool]] = None) -> int: """ 指定されたプロンプトメッセージのトークン数を取得 :param model: モデル名 :param credentials: モデル認証情報 :param prompt_messages: プロンプトメッセージ :param tools: ツール :return: """ -
モデル認証情報検証
プロバイダーの認証情報検証と同様に、ここでは個別のモデルに対して検証を行います。
def validate_credentials(self, model: str, credentials: dict) -> None: """ モデル認証情報を検証 :param model: モデル名 :param credentials: モデル認証情報 :return: """ -
呼び出し異常エラーのマッピングテーブル
モデル呼び出し異常時に、ランタイム指定の
InvokeErrorタイプにマッピングする必要があります。これにより、Difyは異なるエラーに対して異なる後続処理を行うことができます。ランタイムエラー:
InvokeConnectionError呼び出し接続エラーInvokeServerUnavailableError呼び出しサーバー利用不可エラーInvokeRateLimitError呼び出しレート制限エラーInvokeAuthorizationError認証エラーInvokeBadRequestError呼び出し不正リクエストエラー
@property def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]: """ モデル呼び出しエラーを統一エラーにマッピング キーは呼び出し元にスローされるエラータイプ 値はモデルによってスローされるエラータイプで、 呼び出し元の統一エラータイプに変換する必要があります。 :return: 呼び出しエラーマッピング """
インターフェースメソッドの説明については:Interfacesをご覧ください。具体的な実装については:llm.pyを参照してください。
-
プロバイダー
provider(string) プロバイダー識別子、例:openailabel(object) プロバイダー表示名、i18n対応、en_US英語、zh_Hans中国語の二つの言語を設定可能zh_Hans(string) [optional] 中国語ラベル名、zh_Hansが設定されていない場合、デフォルトでen_USが使用されます。en_US(string) 英語ラベル名
description(object) [optional] プロバイダー説明、i18n対応zh_Hans(string) [optional] 中国語説明en_US(string) 英語説明
icon_small(string) [optional] プロバイダー小アイコン、対応するプロバイダー実装ディレクトリ内の_assetsディレクトリに保存、中英同様のポリシーzh_Hans(string) [optional] 中国語アイコンen_US(string) 英語アイコン
icon_large(string) [optional] プロバイダー大アイコン、対応するプロバイダー実装ディレクトリ内の_assetsディレクトリに保存、中英同様のポリシーzh_Hans(string) [optional] 中国語アイコンen_US(string) 英語アイコン
background(string) [optional] 背景色の色値、例:#FFFFFF、空白の場合はデフォルトの色が表示されます。help(object) [optional] ヘルプ情報title(object) ヘルプタイトル、i18n対応zh_Hans(string) [optional] 中国語タイトルen_US(string) 英語タイトル
url(object) ヘルプリンク、i18n対応zh_Hans(string) [optional] 中国語リンクen_US(string) 英語リンク
supported_model_types(array[ModelType]) 対応モデルタイプconfigurate_methods(array[ConfigurateMethod]) 設定方法provider_credential_schema(ProviderCredentialSchema) プロバイダー認証情報スキーマmodel_credential_schema(ModelCredentialSchema) モデル認証情報スキーマ