事前定義されたモデルの追加

プロバイダー統合完了後、次にプロバイダーへのモデルの接続を行います。

まず、接続するモデルのタイプを決定し、対応するプロバイダーのディレクトリ内に対応するモデルタイプのmoduleを作成する必要があります。

現在サポートされているモデルタイプは以下の通りです:

  • LLM テキスト生成モデル

  • text_embedding テキスト埋め込みモデル

  • rerank ランク付けモデル

  • speech2text 音声からテキストへの変換モデル

  • TTS テキストから音声への変換モデル

  • moderation 審査

ここではAnthropicを例に挙げると、AnthropicはLLMのみをサポートしているため、model_providers.anthropicllmという名前のmoduleを作成します。

事前に定義されたモデルについては、llm module の下に、モデル名をファイル名とする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  # 価格通貨

すべてのモデル構成が完了した後に、モデルコードの実装を開始することをお勧めします。

同様に、model_providersディレクトリ内の他のサプライヤーの対応するモデル タイプ ディレクトリにあるYAML構成情報を参照することもできます。全てのYAMLルールについては、「」をご覧ください。

モデル呼び出しコードの実装

次に、llm module内に同名の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]:
        """
        Invoke large language model
    
        :param model: model name
        :param credentials: model credentials
        :param prompt_messages: prompt messages
        :param model_parameters: model parameters
        :param tools: tools for tool calling
        :param stop: stop words
        :param stream: is stream response
        :param user: unique user id
        :return: full response or stream response chunk generator result
        """

    実装時には、同期返答とストリーミング返答を処理するために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:
        """
        Get number of tokens for given prompt messages
    
        :param model: model name
        :param credentials: model credentials
        :param prompt_messages: prompt messages
        :param tools: tools for tool calling
        :return:
        """
  • モデル認証情報検証

    プロバイダーの認証情報検証と同様に、ここでは個別のモデルに対して検証を行います。

    def validate_credentials(self, model: str, credentials: dict) -> None:
        """
        Validate model credentials
    
        :param model: model name
        :param credentials: model credentials
        :return:
        """
  • 呼び出し異常エラーのマッピングテーブル

    モデル呼び出し異常時に、Runtime時に指定のInvokeErrorタイプにマッピングする必要があります。これにより、Difyは異なるエラーに対して異なる後続処理を行うことができます。

    ランタイムエラー(Runtime Errors):

    • InvokeConnectionError 呼び出し接続エラー

    • InvokeServerUnavailableError 呼び出しサーバー利用不可エラー

    • InvokeRateLimitError 呼び出しレート制限エラー

    • InvokeAuthorizationError 認証エラー

    • InvokeBadRequestError 呼び出し不正リクエストエラー

    @property
    def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]:
        """
        Map model invoke error to unified error
        The key is the error type thrown to the caller
        The value is the error type thrown by the model,
        which needs to be converted into a unified error type for the caller.
    
        :return: Invoke error mapping
        """

インターフェースメソッドの説明については:Interfacesをご覧ください。具体的な実装については:llm.pyを参照してください。

Last updated