Dar forma a los datos para la proyección en un almacén de conocimiento

En Azure AI Search, "dar forma a los datos" describe un paso del flujo de trabajo del almacén de conocimiento en el que se crea una representación de datos del contenido que se quiere proyectar en las tablas, objetos y archivos de Azure Storage.

A medida que se ejecutan las habilidades, los resultados se escriben en un árbol de enriquecimiento en una jerarquía de nodos y, aunque es posible que desee ver y consumir este árbol en su totalidad, es más probable que desee algo más específico, por lo que creará subconjuntos de nodos para diferentes escenarios, como colocar en tablas específicas los nodos relacionados con el texto traducido o las entidades extraídas.

Por sí mismo, el árbol de enriquecimiento no incluye ninguna lógica que informe de cómo se representa su contenido en un almacén de conocimiento. Las formas de datos rellenan esta carencia proporcionando el esquema de lo que irá en cada proyección de tablas, objetos y archivos. Puede considerar una forma de datos como una definición o vista personalizada de los datos enriquecidos. Puede crear tantas formas como necesite y, luego, asignarlas a proyecciones en una definición de almacén de conocimiento.

Enfoques para crear formas

Hay dos maneras de dar forma al contenido enriquecido para que se pueda proyectar en un almacén de conocimiento:

  • Usar la aptitud Conformador para crear nodos en un árbol de enriquecimiento que se usen expresamente para la proyección. La mayoría de las aptitudes crean contenido nuevo. Por el contrario, una aptitud Conformador funciona con nodos existentes, normalmente para consolidar varios nodos en un único objeto complejo. Esto es útil para las tablas, donde quiere que la salida de varios nodos se exprese físicamente como columnas de la tabla.

  • Usar una forma insertada dentro de la propia definición de la proyección.

El uso de la aptitud Conformador externaliza la forma para que la puedan usar varias proyecciones o incluso otras aptitudes. También garantiza que todas las mutaciones del árbol de enriquecimiento se encuentran dentro de la aptitud y que la salida es un objeto que se puede reutilizar. Por el contrario, el modelado insertado permite crear la forma que se necesite, pero es un objeto anónimo y sólo está disponible para la proyección para la que se ha definido.

Estos enfoques se pueden usar juntos o por separado. En este artículo se muestran ambos: una aptitud Conformador para las proyecciones de tablas y el modelado insertado con la proyección de tablas de frases clave.

Uso de una aptitud Conformador

Las aptitudes Conformador normalmente se colocan al final de un conjunto de aptitudes, lo que crea una vista de los datos que quiere pasar a una proyección. En este ejemplo se crea una forma denominada "tableprojection" que contiene los siguientes nodos: "reviews_text", "reviews_title", "AzureSearch_DocumentKey" y puntuaciones de opinión y frases clave de las revisiones paginadas.

{
    "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
    "name": "#5",
    "description": null,
    "context": "/document",
    "inputs": [        
        {
            "name": "reviews_text",
            "source": "/document/reviews_text",
            "sourceContext": null,
            "inputs": []
        },
        {
            "name": "reviews_title",
            "source": "/document/reviews_title",
            "sourceContext": null,
            "inputs": []
        },
        {
            "name": "AzureSearch_DocumentKey",
            "source": "/document/AzureSearch_DocumentKey",
            "sourceContext": null,
            "inputs": []
        },  
        {
            "name": "pages",
            "source": null,
            "sourceContext": "/document/reviews_text/pages/*",
            "inputs": [
                {
                    "name": "Sentiment",
                    "source": "/document/reviews_text/pages/*/Sentiment",
                    "sourceContext": null,
                    "inputs": []
                },
                {
                    "name": "LanguageCode",
                    "source": "/document/Language",
                    "sourceContext": null,
                    "inputs": []
                },
                {
                    "name": "Page",
                    "source": "/document/reviews_text/pages/*",
                    "sourceContext": null,
                    "inputs": []
                },
                {
                    "name": "keyphrase",
                    "sourceContext": "/document/reviews_text/pages/*/Keyphrases/*",
                    "inputs": [
                        {
                            "source": "/document/reviews_text/pages/*/Keyphrases/*",
                            "name": "Keyphrases"
                        }
                    ]
                }
            ]
        }
    ],
    "outputs": [
        {
            "name": "output",
            "targetName": "tableprojection"
        }
    ]
}

Propiedad SourceContext

Dentro de una aptitud Conformador, una entrada puede tener un elemento sourceContext. Esta misma propiedad también se puede usar en formas insertadas en proyecciones.

sourceContext se usa para construir objetos anidados de varios niveles en una canalización de enriquecimiento. Si la entrada está en un contexto diferente al de la aptitud, use sourceContext. sourceContext exige definir una entrada anidada con el elemento específico considerado como origen.

En el ejemplo anterior, el análisis de sentimiento y la extracción de frases clave se realizaron sobre texto que se dividió en páginas para facilitar el análisis. Suponiendo que quiera que las puntuaciones y frases se proyecten en una tabla, este es el momento de establecer el contexto en la entrada anidada que proporciona la puntuación y la frase.

Proyección de una forma en varias tablas

Con el nodo tableprojection definido en la sección outputs anterior, puede segmentar partes del nodo tableprojection en tablas individuales relacionadas:

"projections": [
    {
        "tables": [
            {
                "tableName": "hotelReviewsDocument",
                "generatedKeyName": "Documentid",
                "source": "/document/tableprojection"
            },
            {
                "tableName": "hotelReviewsPages",
                "generatedKeyName": "Pagesid",
                "source": "/document/tableprojection/pages/*"
            },
            {
                "tableName": "hotelReviewsKeyPhrases",
                "generatedKeyName": "KeyPhrasesid",
                "source": "/document/tableprojection/pages/*/keyphrase/*"
            }
        ]
    }
]

Forma insertada para proyecciones de tabla

El modelado insertado es la capacidad de crear formas dentro de la propia definición de proyección. El modelado insertado tiene estas características:

  • La forma solo la puede usar la proyección que la contiene.
  • La forma puede ser idéntica a la que produciría una aptitud Conformador.

Se crea una forma insertada mediante sourceContext y inputs.

Propiedad Descripción
sourceContext Establece la raíz de la proyección.
inputs Cada entrada es una columna de la tabla. "name" es el nombre de la columna. "source" es el nodo de enriquecimiento que proporciona el valor.

Para proyectar los mismos datos que en el ejemplo anterior, la opción de proyección en línea tendría el siguiente aspecto:

"projections": [
    {
        "tables": [
            {
                "tableName": "hotelReviewsInlineDocument",
                "generatedKeyName": "Documentid",
                "sourceContext": "/document",     
                "inputs": [
                    {
                        "name": "reviews_text",
                        "source": "/document/reviews_text"
                    },
                    {
                        "name": "reviews_title",
                        "source": "/document/reviews_title"
                    },
                    {
                        "name": "AzureSearch_DocumentKey",
                        "source": "/document/AzureSearch_DocumentKey"
                    }                             
                ]
            },
            {
                "tableName": "hotelReviewsInlinePages",
                "generatedKeyName": "Pagesid",
                "sourceContext": "/document/reviews_text/pages/*",
                "inputs": [
                        {
                    "name": "Sentiment",
                    "source": "/document/reviews_text/pages/*/Sentiment"
                    },
                    {
                        "name": "LanguageCode",
                        "source": "/document/Language"
                    },
                    {
                        "name": "Page",
                        "source": "/document/reviews_text/pages/*"
                    }
                ]
            },
            {
                "tableName": "hotelReviewsInlineKeyPhrases",
                "generatedKeyName": "KeyPhraseId",
                "sourceContext": "/document/reviews_text/pages/*/Keyphrases/*",
                "inputs": [
                    {
                        "name": "Keyphrases",
                        "source": "/document/reviews_text/pages/*/Keyphrases/*"
                    }
                ]
            }
        ]
    }
]

Una observación de ambos enfoques es cómo los valores de "Keyphrases" se proyectan mediante "sourceContext". El nodo "Keyphrases", que contiene una colección de cadenas, es en sí mismo un elemento secundario del texto de la página. Sin embargo, dado que las proyecciones requieren un objeto JSON y la página es primitiva (cadena), "sourceContext" se usa para encapsular la frase clave en un objeto con una propiedad con nombre. Esta técnica permite que incluso se proyecten primitivas de forma independiente.

Forma insertada para proyecciones de objetos

Puede generar una nueva forma mediante la aptitud Conformador o usar el modelado insertado de la proyección de objeto. Aunque en el ejemplo de tablas se mostró el método para crear una forma y segmentarla, en este ejemplo se muestra el uso del modelado insertado.

El modelado insertado es la capacidad de crear una forma en la definición de las entradas para una proyección. El modelado insertado crea un objeto anónimo que es idéntico a lo que produciría una aptitud de conformador (en este caso, projectionShape). El modelado insertado resulta útil si se va a definir una forma que no se va a reutilizar.

La propiedad projections es una matriz. En este ejemplo se agrega una nueva instancia de proyección a la matriz, donde la definición de knowledgeStore contiene proyecciones insertadas. Cuando use proyecciones insertadas, puede omitir la aptitud de conformador.

"knowledgeStore" : {
    "storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
    "projections": [
            {
            "tables": [ ],
            "objects": [
                {
                    "storageContainer": "sampleobject",
                    "source": null,
                    "generatedKeyName": "myobject",
                    "sourceContext": "/document",
                    "inputs": [
                        {
                            "name": "metadata_storage_name",
                            "source": "/document/metadata_storage_name"
                        },
                        {
                            "name": "metadata_storage_path",
                            "source": "/document/metadata_storage_path"
                        },
                        {
                            "name": "content",
                            "source": "/document/content"
                        },
                        {
                            "name": "keyPhrases",
                            "source": "/document/merged_content/keyphrases/*"
                        },
                        {
                            "name": "entities",
                            "source": "/document/merged_content/entities/*/name"
                        },
                        {
                            "name": "ocrText",
                            "source": "/document/normalized_images/*/text"
                        },
                        {
                            "name": "ocrLayoutText",
                            "source": "/document/normalized_images/*/layoutText"
                        }
                    ]

                }
            ],
            "files": []
        }
    ]
}

Pasos siguientes

En este artículo se describen los conceptos y principios de las formas de proyección. Como siguiente paso, vea cómo se aplican en patrones para proyecciones de tablas, objetos y archivos.