Utilizar modelos de lenguaje de terceros con ArcGIS

El conjunto de herramientas Análisis de texto de la caja de herramientas GeoAI proporciona un conjunto de herramientas para tareas de procesamiento de textos, como la clasificación de textos, la extracción de entidades y la traducción de textos. Los modelos de procesamiento del lenguaje natural (PLN) que se crean con estas herramientas se basan en modelos de lenguaje como BERT, RoBERTa y T5, y en modelos extensos de lenguaje (LLM), como Mistral, para garantizar un análisis de textos de alto rendimiento.

Aunque estos modelos preconstruidos son robustos, es posible que necesite un flujo de trabajo de PLN personalizado, como cuando utiliza un LLM para normalizar direcciones, realizar análisis de sentimientos o extraer entidades o relaciones personalizadas que actualmente no son compatibles con el conjunto de herramientas Análisis de texto. Para satisfacer estas necesidades, puede integrar ArcGIS con modelos externos de lenguaje de terceros. Esto incluye tanto los LLM de código abierto como los LLM comerciales alojados en la nube a los que se accede mediante una API web. Tenga en cuenta que si utiliza un LLM alojado en la web, los datos que esté procesando se enviarán al proveedor del LLM para su procesamiento. Los desarrolladores de Python pueden crear una función de PLN personalizada para integrarla con modelos externos y empaquetar su modelo como un paquete de aprendizaje profundo de Esri (archivo .dlpk) para utilizarlo con las siguientes herramientas:

Función de PLN personalizada de Python

Puede crear una función de PLN de Python para integrar modelos de lenguaje de terceros en una canalización de procesamiento de textos. Las funciones de PLN manipulan datos de texto y realizan diversas tareas de procesamiento de texto.

Los métodos de la función de PLN se enumeran en la tabla siguiente y se describen con más detalle en las subsecciones siguientes.

MétodoDescripción

__init__

Inicialice variables de instancia como name, description y otros atributos esenciales para la función de PLN.

initialize

Cargue el modelo de PLN y establezca las configuraciones iniciales. Utilice este método al inicio de la función de PLN de Python.

getParameterInfo

Defina los parámetros que acepta la función de PLN. Esto incluye cualquier ajuste de configuración necesario para cargar o conectarse al modelo, así como los parámetros necesarios para el procesamiento de texto.

getConfiguration

Describa cómo realizará la herramienta el procesamiento de las entradas y cómo generará las salidas. Incluye detalles para cualquier paso de preprocesamiento o posprocesamiento necesario para la función.

predict

La función responsable de convertir el texto de entrada en la salida deseada. Utiliza parámetros definidos y una lógica de procesamiento para producir el resultado final.

Métodos de la función

A continuación, se describen los métodos de la función de PLN.

__init__

El método __init__ es el constructor de la función de PLN personalizada e inicializa variables de instancia como el nombre, la descripción y otros atributos esenciales. Este método establece las propiedades que definirán el comportamiento y las características de la función de PLN.

El constructor crea una instancia de una clase de PLN personalizada con todos los atributos necesarios para el procesamiento y el análisis. Al crear una instancia de una clase de PLN, este método garantiza que tenga los ajustes necesarios y los valores predeterminados. Por ejemplo, si la función de PLN necesita ajustes específicos como rutas a modelos o tokens especiales, pueden configurarse con este método.


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

El método initialize se llama al inicio de la función de PLN personalizada de Python y en este método; se le pasa kwargs['model']. El argumento kwargs['model'] es la ruta al archivo de definición del modelo de Esri (.emd). El método debe utilizarse para cargar los pesos del modelo para configurar el modelo de PLN, asegurando una referencia al mismo para las operaciones posteriores.


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

Las herramientas de Análisis de texto llaman al método getParameterInfo después del método initialize y es donde se definen los parámetros que necesita el modelo. Este método devuelve una lista de los parámetros de entrada esperados por la función de PLN personalizada. Cada parámetro se describe mediante un diccionario que contiene el nombre, el tipo de datos, el nombre de visualización y la descripción del parámetro, así como un parámetro booleano que indica si el parámetro es obligatorio, como se muestra a continuación.


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
        ...
    ]

El método devuelve una lista de diccionarios, cada uno de los cuales describe un parámetro. Los atributos clave del diccionario son los siguientes:

  • name: un identificador de cadena de caracteres para el parámetro
  • dataType: el tipo de datos que acepta el parámetro, como una cadena de caracteres, un valor booleano o una lista
  • value: el valor predeterminado para el parámetro
  • required: un booleano que indica si el parámetro es obligatorio
  • displayName: un nombre fácil de usar para el parámetro
  • domain: un conjunto de valores permitidos, si procede
  • description: una descripción detallada del parámetro

La lista de parámetros se muestra al usuario a través de los argumentos del modelo personalizado en las herramientas de Análisis de texto. Los usuarios del modelo pueden establecer estos valores de forma interactiva mediante la interfaz de usuario de la herramienta o pasarlos mediante programación al método getConfiguration como argumentos de palabra clave.

getConfiguration

El método getConfiguration establece y administra los parámetros de la función de PLN. Se le pasan argumentos de palabras clave que contienen los parámetros actualizados por los usuarios del modelo a través de la herramienta o proporcionados mediante programación. El método también controla cómo la función procesa y genera los datos basándose en los parámetros actualizados. Este método se invoca después del método getParameterInfo, pero antes del método predict. El valor de retorno de la función es un diccionario que contiene el valor de batch_size que indica cuántas cadenas de caracteres puede procesar el modelo a la vez. El valor de retorno del método informa a la herramienta de cómo deben dividirse los datos de entrada para que el modelo los procese de lote en lote.


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

En el ejemplo anterior, la función de PLN personalizada se configura haciendo lo siguiente:

  • Estableciendo el parámetro class_names a partir de los argumentos proporcionados.
  • Estableciendo el parámetro prompt a partir de los argumentos proporcionados.
  • Limitando el parámetro batch_size a un máximo de 4 si se proporciona un valor mayor.
  • Devolviendo los valores actualizados de los parámetros.

predict

El método predict realiza inferencias, es decir, genera predicciones con el modelo de PLN. A este método se le pasa FeatureSet que contiene las entidades de entrada (o filas en el caso de una tabla) y kwargs que contienen el nombre de campo con las cadenas de entrada. Este método devuelve los resultados en forma de un objeto FeatureSet. A continuación, se muestra un flujo de trabajo típico:

  • Extraiga el texto de entrada que se va a procesar del FeatureSet proporcionado y preprocéselo para que se corresponda con los requisitos del modelo.
  • Aplique el modelo de PLN al texto preprocesado para generar predicciones.
  • Refine o formatee las predicciones del modelo según sea necesario.
  • Empaquete las predicciones procesadas en un objeto FeatureSet y devuélvalo.


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)

Archivo .emd de Esri

Tras crear una función de PLN personalizada de Python, incluya una referencia a la función en el archivo .emd especificándola junto al parámetro InferenceFunction. Esto garantiza que el archivo .emd se vincule correctamente a la función, lo que habilita su uso en una canalización de procesamiento de PLN.


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


    # additional keys here
    ...
}
Nota:

El archivo .emd debe incluir las siguientes claves:

  • InferenceFunction: especifique el nombre del archivo que contiene la función de PLN personalizada.
  • ModelType: indique el tipo de modelo en función de su tarea. Los valores admitidos son TextClassifier, SequenceToSequence y EntityRecognizer.
  • OutputField: proporcione el nombre del campo de salida que almacenará los resultados para los modelos TextClassifier o SequenceToSequence.

Archivo .dlpk personalizado

Para completar una configuración de PLN personalizada, cree un archivo de modelado .dlpk. El archivo .dlpk le permite utilizar un modelo con las herramientas de inferencia del conjunto de herramientas Análisis de texto.

Organice los archivos de la siguiente manera:

  • Cree una carpeta e incluya el archivo de la función de PLN personalizada (por ejemplo, MyTextClassifier.py) y el archivo .emd de Esri (por ejemplo, TextClassifier.emd). El nombre de la carpeta debe coincidir con el nombre del archivo .emd.
    
    TextClassifier/
    ├── MyTextClassifier.py
    └── TextClassifier.emd
    Incluya los archivos o carpetas adicionales que sean necesarios para la función de PLN.
  • Comprima la carpeta en un archivo ZIP. Cambie el nombre del archivo .zip para que coincida con el nombre del archivo .emd, pero con la extensión .dlpk. Este archivo .dlpk ya está listo para su uso con las herramientas de inferencia del conjunto de herramientas Análisis de texto.