Использование сторонних языковых моделей в ArcGIS

Группа инструментов Анализ текста в наборе инструментов GeoAI предоставляет набор инструментов для задач обработки текста, таких как классификация текста, извлечение элементов и перевод текста. Модели обработки естественного языка (natural language processing (NLP)), которые созданы при помощи этих инструментов, встроены в языковые модели, такие как BERT, RoBERTa и T5, и большие языковые модели (large language models (LLM)), такие, как Mistral, чтобы обеспечить высокопроизводительный анализ текста.

Хотя эти готовые модели надежны, вам может понадобиться пользовательский рабочий процесс NLP, например, при использовании LLM для стандартизации адресов, выполнения анализа настроений или извлечения пользовательских элементов или отношений, который в данный момент не поддерживаются в группе инструментов Анализ текста. В этих целях вы можете интегрировать ArcGIS с внешними сторонними языковыми моделями. Сюда относятся LLM из открытых источников, а также размещенные в облаке коммерческие LLM, доступные при использовании веб API. Имейте в виду, что при использовании LLM, размещенной в веб, данные, обрабатываемые вами, будут отправлены для обработки к провайдеру LLM. Разработчики Python могут создавать пользовательские функции NLP для интеграции с внешними моделями и упаковывать свои модели как пакеты глубокого обучения Esri (файл .dlpk) для использования со следующими инструментами:

Пользовательская функция Python NLP

Вы можете изменить функцию NLP в Python, чтобы интегрировать сторонние языковые модели в конвейер обработки текста. Функции NLP обрабатывают текстовые данные и выполняют различные задачи по обработке текста.

Методы функции NLP перечислены в следующей таблице и более подробно описаны в разделах ниже.

МетодОписание

__init__

Инициализируйте переменные экземпляра, такие как name, description, и другие атрибуты, необходимые для функции NLP.

initialize

Загрузите модели NLP и установите любые исходные конфигурации. Используйте этот метод в начале функции NLP Python.

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

После создания пользовательской функции NLP Python включите ссылку на функцию в файл .emd, указав ее рядом с параметром InferenceFunction. Это гарантирует, что файл .emd правильно ссылается на функцию, делая ее доступной для использования в конвейере обработки NLP.


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


    # additional keys here
    ...
}
Примечание:

Файл .emd должен содержать следующие ключи:

  • InferenceFunction — указывает имя файла, содержащего пользовательскую функцию NLP.
  • ModelType — указывает тип модели на основании ее задачи. Поддерживаются значения TextClassifier, SequenceToSequence и EntityRecognizer.
  • OutputField — предоставляет имя выходного поля, которое будет хранить результаты моделей TextClassifier или SequenceToSequence.

Пользовательский файл .dlpk

Для завершения настройки пользовательской NLP создайте файл модели .dlpk. Файл .dlpk позволяет использовать модель с инструментами логического ввода в группе инструментов Анализ текста.

Организуйте файлы следующим образом:

  • Создайте папку и включите в нее файл пользовательской функции NLP (например, MyTextClassifier.py) и файл Esri .emd (например, TextClassifier.emd). Имя папки должно совпадать с именем файла .emd.
    
    TextClassifier/
    ├── MyTextClassifier.py
    └── TextClassifier.emd
    Включите любые дополнительные файлы или папки, необходимые для функции NLP.
  • Выполните сжатие папки в архив ZIP. Переименуйте файл .zip по имени файла .emd, но с расширением .dlpk. Файл .dlpk теперь готов для использования с инструментами ввода в группе инструментов Анализ текста.