Enriquecimiento de un índice de búsqueda en Búsqueda de Azure AI con clases personalizadas y Lenguaje de Azure AI

Completado

La clasificación personalizada de texto permite asignar un pasaje de texto a diferentes clases definidas por el usuario. Por ejemplo, podría entrenar un modelo en la sinopsis de la portada posterior de los libros para identificar automáticamente un género de libros. A continuación, usar ese género identificado para enriquecer el motor de búsqueda de la tienda en línea con una faceta de género.

A diagram showing the steps needed to enrich a search index.

Aquí verá lo que debe tener en cuenta para enriquecer un índice de búsqueda mediante un modelo de clasificación personalizada de texto.

  • Almacene sus documentos para que los indizadores de Language Studio y Búsqueda de Azure AI puedan acceder a ellos
  • Crear un proyecto de clasificación de texto personalizado
  • Entrenamiento y prueba del modelo
  • Crear un índice de búsqueda basado en los documentos almacenados
  • Crear una aplicación de funciones que use el modelo entrenado implementado
  • Actualizar la solución de búsqueda, el índice, el indexador y el conjunto de aptitudes personalizadas

Almacenar los datos

Se puede acceder a Azure Blob Storage desde Language Studio y Azure AI Services. El contenedor debe ser accesible, por lo que la opción más sencilla es elegir Contenedor, pero también es posible usar contenedores privados con alguna configuración adicional.

Junto con los datos, también necesita una manera de asignar clasificaciones para cada documento. Language Studio proporciona una herramienta gráfica que se puede usar para clasificar cada documento manualmente de uno en uno.

Puede elegir entre dos tipos diferentes de proyecto. Si un documento se asigna a una sola clase, use un único proyecto de clasificación de etiquetas. Si se puede asignar un documento a más de una clase, use el proyecto de clasificación de varias etiquetas.

Si no quiere clasificar manualmente cada documento, puede etiquetar todos sus documentos antes de crear su proyecto de Lenguaje de Azure AI. Este proceso implica la creación de un documento JSON de etiquetas en este formato:

{
    "projectFileVersion": "2022-05-01",
    "stringIndexType": "Utf16CodeUnit",
    "metadata": {
      "projectKind": "CustomMultiLabelClassification",
      "storageInputContainerName": "{CONTAINER-NAME}",
      "projectName": "{PROJECT-NAME}",
      "multilingual": false,
      "description": "Project-description",
      "language": "en-us"
    },
    "assets": {
      "projectKind": "CustomMultiLabelClassification",
      "classes": [
        {
          "category": "Class1"
        },
        {
          "category": "Class2"
        }
      ],
      "documents": [
          {
              "location": "{DOCUMENT-NAME}",
              "language": "{LANGUAGE-CODE}",
              "dataset": "{DATASET}",
              "classes": [
                  {
                      "category": "Class1"
                  },
                  {
                      "category": "Class2"
                  }
              ]
          }
      ]
  }

Agregue tantas clases como tenga en la matriz classes. Agregue una entrada para cada documento de la matriz documents, incluidas las clases que coinciden con el documento.

Cree su proyecto de Lenguaje de Azure AI

Hay dos formas de crear su proyecto de Lenguaje de Azure AI. Si empieza a usar Language Studio sin crear primero un servicio de lenguaje en el Portal de Azure, Language Studio le ofrecerá crear uno automáticamente.

La forma más flexible de crear un proyecto de Lenguaje de Azure AI es crear primero su servicio lingüístico usando Azure Portal. Si elige esta opción, obtendrá la opción de agregar características personalizadas.

A screenshot showing creating a language service in the Azure portal.

Si quiere crear una clasificación personalizada de texto, seleccione esa característica personalizada al crear el servicio de lenguaje. También debe vincular el servicio de lenguaje a una cuenta de almacenamiento mediante este método.

Una vez implementado el recurso, puede ir directamente a Language Studio desde el panel de información general del servicio de lenguaje. A continuación, puede crear un nuevo proyecto de clasificación personalizada de texto.

Nota

Si ha creado el servicio de lenguaje desde Language Studio, es posible que tenga que seguir estos pasos, Establecimiento de roles para el recurso de idioma de Azure y la cuenta de almacenamiento, para conectar el contenedor de almacenamiento al proyecto de clasificación personalizada de texto.

Entrenamiento de un modelo de clasificación de texto

Al igual que con todos los modelos de IA, debe tener datos identificados que pueda usar para entrenar el modelo. El modelo debe ver ejemplos de cómo asignar datos a una clase y tener algunos ejemplos que pueda usar para probar el modelo. Puede optar por permitir que el modelo divida automáticamente los datos de entrenamiento: de forma predeterminada, usará el 80 % de los documentos para entrenar el modelo y el 20 % para probarlos a ciegas. Si tiene documentos específicos con los que desea probar el modelo, puede etiquetar los documentos para realizar pruebas.

A screenshot of Language Studio showing selecting a document to add to the test set.

En Language Studio, en el proyecto, seleccione Etiquetado de datos. Verá todos los documentos. Seleccione cada documento que quiera agregar al conjunto de pruebas y, a continuación, seleccione Probar el rendimiento del modelo. Guarde las etiquetas actualizadas y, a continuación, cree un nuevo trabajo de entrenamiento.

Creación de un índice de búsqueda

No hay que hacer nada específico para crear un índice de búsqueda que se enriquecerá mediante un modelo de clasificación personalizada de texto. Siga los pasos indicados en Creación de una solución de Búsqueda de Azure AI. Actualizará el índice, el indexador y la aptitud personalizada una vez que haya creado una aplicación de funciones.

Crear una aplicación de función de Azure

Puede elegir el lenguaje y las tecnologías que desee para la aplicación de funciones. La aplicación debe poder pasar JSON al punto de conexión de clasificación personalizada de texto, por ejemplo:

{
    "displayName": "Extracting custom text classification", 
    "analysisInput": {
        "documents": [
            {
                "id": "1", 
                "language": "en-us", 
                "text": "This film takes place during the events of Get Smart. Bruce and Lloyd have been testing out an invisibility cloak, but during a party, Maraguayan agent Isabelle steals it for El Presidente. Now, Bruce and Lloyd must find the cloak on their own because the only non-compromised agents, Agent 99 and Agent 86  are in Russia"
            }
        ]
      }, 
    "tasks": [
        {
        "kind": "CustomMultiLabelClassification", 
        "taskName": "Multi Label Classification", 
        "parameters": {
            "project-name": "movie-classifier", 
            "deployment-name": "test-release"}
        }
    ]
}

A continuación, procese la respuesta JSON del modelo, por ejemplo:

{
  "jobId": "be1419f3-61f8-481d-8235-36b7a9335bb7",
  "lastUpdatedDateTime": "2022-06-13T16:24:27Z",
  "createdDateTime": "2022-06-13T16:24:26Z",
  "expirationDateTime": "2022-06-14T16:24:26Z",
  "status": "succeeded",
  "errors": [],
  "displayName": "Extracting custom text classification",
  "tasks": {
    "completed": 1,
    "failed": 0,
    "inProgress": 0,
    "total": 1,
    "items": [
      {
        "kind": "CustomMultiLabelClassificationLROResults",
        "taskName": "Multi Label Classification",
        "lastUpdateDateTime": "2022-06-13T16:24:27.7912131Z",
        "status": "succeeded",
        "results": {
          "documents": [
            {
              "id": "1",
              "class": [
                {
                  "category": "Action",
                  "confidenceScore": 0.99
                },
                {
                  "category": "Comedy",
                  "confidenceScore": 0.96
                }
              ],
              "warnings": []
            }
          ],
          "errors": [],
          "projectName": "movie-classifier",
          "deploymentName": "test-release"
        }
      }
    ]
  }
}

Después, la función devuelve un mensaje JSON estructurado a un conjunto de aptitudes personalizadas en Búsqueda de IA, por ejemplo:

[{"category": "Action", "confidenceScore": 0.99}, {"category": "Comedy", "confidenceScore": 0.96}]

Hay cinco elementos que la aplicación de funciones debe saber:

  1. El texto que se va a clasificar.
  2. El punto de conexión para el modelo de clasificación personalizada de texto que ha entrenado e implementado.
  3. La clave principal del proyecto de clasificación personalizada de texto.
  4. Nombre del proyecto.
  5. El nombre de la implementación.

La primera se pasa desde su conjunto de aptitudes personalizadas en Búsqueda de IA a la función como entrada. Los cuatro restantes se pueden encontrar en Language Studio.

A screenshot showing where to copy the prediction endpoint from.

Los nombres del punto de conexión y de la implementación se encuentran en el panel de implementación de un modelo.

A screenshot showing where to copy the primary key for language services from.

El nombre del proyecto y la clave principal se encuentran en el panel de configuración del proyecto.

Actualice su solución de Búsqueda de Azure AI

Debe realizar tres cambios en el Portal de Azure para enriquecer el índice de búsqueda.

  1. Debe agregar un campo al índice para almacenar el enriquecimiento de clasificación personalizada de texto.
  2. Debe agregar un conjunto de aptitudes personalizado para llamar a la aplicación de funciones con el texto que se va a clasificar.
  3. Debe asignar la respuesta del conjunto de aptitudes al índice.

Agregación de un campo a un índice existente

En Azure Portal, vaya a su recurso de Búsqueda de IA, seleccione el índice y agregue JSON para en este formato:

{
  "name": "classifiedtext",
  "type": "Collection(Edm.ComplexType)",
  "analyzer": null,
  "synonymMaps": [],
  "fields": [
    {
      "name": "category",
      "type": "Edm.String",
      "facetable": true,
      "filterable": true,
      "key": false,
      "retrievable": true,
      "searchable": true,
      "sortable": false,
      "analyzer": "standard.lucene",
      "indexAnalyzer": null,
      "searchAnalyzer": null,
      "synonymMaps": [],
      "fields": []
    },
    {
      "name": "confidenceScore",
      "type": "Edm.Double",
      "facetable": true,
      "filterable": true,
      "retrievable": true,
      "sortable": false,
      "analyzer": null,
      "indexAnalyzer": null,
      "searchAnalyzer": null,
      "synonymMaps": [],
      "fields": []
    }
  ]
}

Este JSON agrega un campo compuesto al índice para almacenar la clase en un campo category que se puede buscar. El segundo campo confidenceScore almacena el porcentaje de confianza en un campo doble.

Edición del conjunto de aptitudes personalizado

En el Portal de Azure, seleccione el conjunto de aptitudes y agregue JSON en este formato:

{
  "@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
  "name": "Genre Classification",
  "description": "Identify the genre of your movie from its summary",
  "context": "/document",
  "uri": "https://learn-acs-lang-serives.cognitiveservices.azure.com/language/analyze-text/jobs?api-version=2022-05-01",
  "httpMethod": "POST",
  "timeout": "PT30S",
  "batchSize": 1,
  "degreeOfParallelism": 1,
  "inputs": [
    {
      "name": "lang",
      "source": "/document/language"
    },
    {
      "name": "text",
      "source": "/document/content"
    }
  ],
  "outputs": [
    {
      "name": "text",
      "targetName": "class"
    }
  ],
  "httpHeaders": {}
}

Esta definición de aptitud WebApiSill especifica que el idioma y el contenido de un documento se pasan como entradas a la aplicación de funciones. La aplicación devolverá un texto JSON denominado class.

Asignación de la salida de la aplicación de funciones al índice

El último cambio es asignar la salida al índice. En el Portal de Azure, seleccione el indexador y edite el JSON para que tenga una nueva asignación de salida:

{
  "sourceFieldName": "/document/class",
  "targetFieldName": "classifiedtext"
}

Ahora el indexador sabe que la salida document/class de la aplicación de funciones debe almacenarse en el campo classifiedtext. Como se ha definido como un campo compuesto, la aplicación de funciones tiene que devolver una matriz JSON que contiene los campos category y confidenceScore.

Ahora puede buscar un índice de búsqueda enriquecido para el texto clasificado de manera personalizada.