ArcGIS でのサードパーティの言語モデルの使用

GeoAI ツールボックスのテキスト分析ツールセットは、テキスト分類、エンティティ抽出、テキスト変換などのテキスト処理タスク用のツール セットを提供します。 これらのツールを使用して作成される自然言語処理 (NLP) モデルは、BERTRoBERTaT5 などの言語モデルと、Mistral などの大規模言語モデル (LLM) に基づいて構築されており、高性能なテキスト分析を実現します。

これらの事前構築されたモデルは堅牢ですが、テキスト分析ツールセットで現在サポートされていない LLM を使用した住所の標準化、感情分析の実行、カスタム エンティティやリレーションシップの抽出など、カスタム NLP ワークフローが必要になる場合があります。 これらのニーズを満たすために、ArcGIS を外部のサードパーティの言語モデルと統合することができます。 これには、オープン ソースの LLM だけでなく、Web API を使用してアクセスするクラウドホスト型の商用 LLM も含まれます。 Web でホストされる LLM を使用している場合、処理中のデータは処理のために LLM プロバイダーに送信されることに注意してください。 Python 開発者は、外部モデルと統合するカスタム NLP 関数を作成し、そのモデルを Esri ディープ ラーニング パッケージ (.dlpk ファイル) としてパッケージ化して、次のツールで使用することができます。

カスタム Python NLP 関数

Python で NLP 関数を作成して、サードパーティの言語モデルをテキスト処理パイプラインに統合することができます。 NLP 関数はテキスト データを処理し、さまざまなテキスト処理タスクを実行します。

NLP 関数のメソッドを次の表に示します。以下のサブセクションでは、さらに詳しく説明します。

方法説明

__init__

namedescription、などのインスタンス変数や、NLP 関数に不可欠な他の属性を初期化します。

initialize

NLP モデルを読み込み、初期構成を設定します。 このメソッドは、Python NLP 関数の開始時に使用します。

getParameterInfo

NLP 関数が受け入れるパラメーターを定義します。 これには、モデルの読み込みや接続に必要な構成設定や、テキスト処理に必要なパラメーターなどがあります。

getConfiguration

ツールが入力処理を実行し、出力を生成する方法を説明します。 これには、関数に必要な前処理や後処理の手順の詳細が含まれます。

predict

入力テキストを目的の出力に変換する関数。 定義されたパラメーターと処理ロジックを使用して、最終結果を生成します。

関数のメソッド

以下では、NLP 関数のメソッドについて説明します。

__init__

__init__ メソッドはカスタム NLP 関数のコンストラクターで、名前、説明、その他の重要な属性などのインスタンス変数を初期化します。 このメソッドは、NLP 関数の動作と特性を定義するプロパティを設定します。

コンストラクターは、処理と解析に必要なすべての属性を持つカスタム NLP クラスのインスタンスを作成します。 このメソッドは、NLP クラスのインスタンスを作成するときに、必要な設定とデフォルト値が確保します。 たとえば、NLP 関数に特定の設定 (モデルへのパスや特殊なトークンなど) が必要な場は、このメソッドで設定できます。


class MyTextClassifier:
    def __init__(self, **kwargs):
        """
        It sets up the initial state of an object by defining its attributes,
        such as name, description, and other properties.

        """
        self.name = "Text classifier"
        self.description = '''The `MyTextClassifier` class is designed to perform text classification tasks
                            such as categorizing text data into predefined categories.'''
        # Additional initialization code here
        ...

initialize

initialize メソッドは、カスタム Python NLP 関数の開始時に呼び出され、kwargs['model'] がこのメソッドに渡されます。 kwargs['model'] 引数は、Esri モデル定義ファイル (.emd) へのパスです。 このメソッドは、モデルのウェイトを読み込んで NLP モデルを設定し、後続の操作でそのモデルを参照できるようにするために使用されます。


def initialize(self, **kwargs):
    """
    Initialize model parameters, such as loading pretrained model weights.
    """
    json_file = kwargs['model']
    with open(json_file, 'r') as f:
        self.json_info = json.load(f)
    
    # access the model path in the model definition file
    model_path = json_info['ModelFile']
    # load your model and keep an instance for the model
    self.model = load_your_model(model_path)
    
    # Additional initialization code here
    ...

getParameterInfo

getParameterInfo メソッドは、initialize メソッドの後にテキスト分析ツールから呼び出され、モデルに必要なパラメーターを定義します。 このメソッドは、カスタム NLP 関数に必要な入力パラメーターのリストを返します。 各パラメーターの記述には、以下に示すように、パラメーターの名前、データ タイプ、表示名、説明、およびパラメーターが必須かどうかを示すブール型パラメーターを含むディクショナリが使用されます。


def getParameterInfo(self):
    return [
        {
            "name": "class_names",
            "dataType": "string",
            "required": True,
            "displayName": "class_names",
            "description": "Comma-separated list of class names used for classification.",
            "value": "positive,negative"
        },
        {
            "name": "prompt",
            "dataType": "string",
            "required": False,
            "displayName": "prompt",
            "description": "The number of samples processed in one forward pass through the model.",
            "value": "Classify the following text into the defined classes."
        },
        # Additional code here
        ...
    ]

このメソッドは、ディクショナリのリストを返します。それぞれがパラメーターを記述しています。 ディクショナリの主な属性は次のとおりです。

  • name - パラメーターの文字列の識別子
  • dataType - パラメーターが受け入れるデータのタイプ (文字列、ブール型、リストなど)
  • value - パラメーターのデフォルト値
  • required - パラメーターが必須かどうかを示すブール値
  • displayName - パラメーターのわかりやすい名前
  • domain - 許容値のセット (該当する場合)
  • description - パラメーターの詳細な説明

パラメーターのリストは、テキスト分析ツールでカスタム モデルのモデル引数を通じてユーザーに表示されます。 モデルのユーザーは、ツールのユーザー インターフェイスを使用してこれらの値を対話的に設定したり、プログラムでキーワード引数として getConfiguration メソッドに渡したりできます。

getConfiguration

getConfiguration メソッドは、NLP 関数のパラメーターを設定および管理します。 モデルのユーザーがツールまたは指定したプログラムを通じて更新したパラメーターを含むキーワード引数が渡されます。 このメソッドは、更新されたパラメーターに基づいて、関数がデータを処理および出力する方法も制御します。 このメソッドは、getParameterInfo メソッドの後、predict メソッドの前に起動します。 関数の戻り値は、モデルが一度に処理できる文字列の数を示す batch_size の値を含むディクショナリです。 このメソッドの戻り値は、モデルが一度にまとめて処理できるように入力データに必要な分割をツールに通知します。


def getConfiguration(self, **kwargs):
    """
    This method configures the supported NLP function parameters and
    controls further processing based on them.
    """
    # Set the class names from the provided arguments
    self.class_names = kwargs.get("class_names", "")
    self.prompt = kwargs.get("prompt", "")
    # Set the batch size, limiting it to a maximum of 4
    if kwargs.get("batch_size", 0) > 4:
        kwargs["batch_size"] = 4
       
    # Additional code here
    ...
    
    # Return the updated parameter values
    return kwargs

上記の例では、カスタム NLP 関数は次の手順で構成されます。

  • 指定された引数から class_names パラメーターを設定します。
  • 指定された引数から prompt パラメーターを設定します。
  • batch_size パラメーターを最大 4 に制限します (より大きな値が指定された場合)。
  • 更新されたパラメーター値を返します。

predict

predict メソッドは推論を実行します。つまり、NLP モデルを使用して予測を生成します。 このメソッドには、入力フィーチャ (テーブルの場合は行) を含む FeatureSet と、入力文字列が含まれるフィールド名を含む kwargs が渡されます。 このメソッドは、結果を FeatureSet オブジェクトの形式で返します。 典型的なワークフローは次のとおりです。

  • 処理する入力テキストを指定された FeatureSet から抽出し、モデルの要件に合わせて前処理します。
  • 前処理されたテキストに NLP モデルを適用して予測を生成します。
  • 必要に応じて、モデルの予測を調整または書式設定します。
  • 処理された予測を FeatureSet オブジェクトにパッケージ化して返します。


def predict(self, feature_set: FeatureSet, **kwargs):
    """
    Predicts the classification of text data from the input FeatureSet and returns a new FeatureSet with the predictions.
    """
    # read the text from the input Featureset, when calling this function from ArcGIS Pro tools, be sure to use the name of the column that contains the text data instead of `input_str`.
    field = kwargs["input_field"]
    input_text = feature_set.df[field].to_list() 
    # Preprocessing input code here
    # 
    ... 
    
    # Make Predictions
    results = self.model.predict(input_text, self.class_names, self.prompt)
    
    # Additional code here
    ... 
    
    # Create featureset
    feature_dict = {
        "fields": [
            {"name": "input_str", "type": "esriFieldTypeString"},
            {"name": "class", "type": "esriFieldTypeString"}
        ],
        'geometryType': "",
        'features': [{'attributes': {'input_str': inputs, "class": result}}]
    }
    
    # Return the featureset
    return FeatureSet.from_dict(feature_dict)

Esri .emd ファイル

カスタム Python NLP 関数を作成したら、関数への参照を InferenceFunction パラメーターの横に指定して、.emd ファイルに関数への参照を含めます。 これにより、.emd ファイルが関数に正しくリンクされ、NLP 処理パイプラインで使用できるようになります。


{
    "InferenceFunction": "MyTextClassifier.py",
    "ModelType": "TextClassifier",
    "OutputField": "ClassLabel",
    "Labels": [
        "positive",
        "negative"
    ],


    # additional keys here
    ...
}
注意:

.emd ファイルには、次のキーが含まれている必要があります。

  • InferenceFunction - カスタム NLP 関数が含まれるファイルの名前を指定します。
  • ModelType - タスクに基づくモデルのタイプを示します。 サポートされている値は、TextClassifierSequenceToSequence、および EntityRecognizer です。
  • OutputField - TextClassifier または SequenceToSequence モデルの結果を格納する出力フィールドの名前を指定します。

カスタム .dlpk ファイル

カスタム NLP のセットアップを完了するには、.dlpk モデル ファイルを作成します。 .dlpk ファイルを使用すると、テキスト分析ツールセットの推論ツールでモデルを使用することができます。

ファイルを次のように整理します。

  • フォルダーを作成し、カスタム NLP 関数ファイル (たとえば、MyTextClassifier.py) および Esri .emd ファイル (たとえば、TextClassifier.emd) を含めます。 フォルダーの名前は、.emd ファイルの名前と一致する必要があります。
    
    TextClassifier/
    ├── MyTextClassifier.py
    └── TextClassifier.emd
    必要に応じて、NLP 関数のその他のファイルやフォルダーを含めます。
  • フォルダーを ZIP アーカイブに圧縮します。 .emd ファイルの名前と一致するように .zip ファイルの名前を変更します。ただし、拡張子は .dlpk にします。 これで、この .dlpk ファイルをテキスト分析ツールセットの推論ツールで使用できるようになりました。