Fragmentación y vectorización compatibles con la estructura en Búsqueda de Azure AI
Nota:
Esta característica actualmente está en su versión preliminar pública. Esta versión preliminar se ofrece sin contrato de nivel de servicio y no es aconsejable usarla para cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.
Las estrategias de fragmentación de datos de texto desempeñan un papel clave en la optimización de las respuestas y el rendimiento de RAG. Con la nueva aptitud Diseño de documento que se encuentra actualmente en versión preliminar, puede fragmentar el contenido en función de los párrafos o fragmentos semánticamente coherentes de una representación de oración. Estos fragmentos se pueden procesar de forma independiente y volver a asociarse como representaciones semánticas sin pérdida de información, interpretación o relevancia semántica. El significado inherente del texto se usa como guía para el proceso de fragmentación.
La aptitud Diseño de documento usa la sintaxis de Markdown (encabezados y contenido) para articular la estructura del documento en el documento de búsqueda. El contenido que se puede buscar y se obtiene del documento origen es texto sin formato, pero puede agregar vectorización integrada para generar inserciones para cualquier campo.
En este artículo, aprenderá a:
- Uso de la aptitud Diseño de documento para detectar secciones y generar contenido de Markdown
- Uso de la aptitud División de texto para restringir el tamaño del fragmento a cada sección Markdown
- Generación de inserciones para cada fragmento
- Uso de proyecciones de índice para asignar inserciones a campos en un índice de búsqueda
Requisitos previos
- Una canalización de indexación basada en indexador con un índice que acepta la salida.
- Un origen de datos compatible con el contenido de texto que desea fragmentar.
- Un conjunto de aptitudes con la aptitud Diseño de documento que divide documentos en función de los límites de párrafo.
- Una aptitud Inserción de Azure OpenAI que genera inserciones vectoriales.
- Una proyección de índice para la indexación de uno a varios.
Preparación de los archivos de datos
Las entradas sin procesar deben estar en un origen de datos compatible y el archivo debe tener un formato que admita la aptitud Diseño de documento.
Entre los formatos de archivos admitidos se incluyen PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX y HTML.
Los indexadores admitidos pueden ser cualquier indexador que pueda controlar los formatos de archivos admitidos. Entre estos se incluyen indexadores de blobs, indexadores OneLake e indexadores de archivos.
Entre las regiones admitidas para esta característica se incluyen: Este de EE. UU., Oeste de EE. UU. 2, Oeste de Europa y Centro-norte de EE. UU. Asegúrese de comprobar esta lista para encontrar actualizaciones en cuanto a la disponibilidad regional.
Puede usar Azure Portal, las API REST o un paquete de Azure SDK para crear un origen de datos.
Sugerencia
Cargue los archivos de ejemplo PDF del plan de mantenimiento en el origen de datos compatible para probar la aptitud Diseño de documento y la fragmentación compatible con la estructura en su propio servicio de búsqueda. El Asistente para la importación y vectorización de datos es un enfoque sin código sencillo para probar esta aptitud. Asegúrese de seleccionar el modo de análisis predeterminado para usar la fragmentación compatible con la estructura. De lo contrario, se usa el modo de análisis de Markdown en su lugar.
Creación de un índice para la indexación de uno a varios
Esta es una carga de ejemplo de un único documento de búsqueda diseñado en torno a fragmentos. En este ejemplo, los campos primarios son el text_parent_id. Los campos secundarios son los fragmentos vectoriales y no vectoriales de la sección Markdown.
Puede usar Azure Portal, las API de REST o un SDK de Azure para crear un índice.
Debe existir un índice en el servicio de búsqueda antes de crear el conjunto de aptitudes o ejecutar el indexador.
{
"name": "my_consolidated_index",
"fields": [
{
"name": "chunk_id",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": true,
"facetable": false,
"key": true,
"analyzer": "keyword"
},
{
"name": "text_parent_id",
"type": "Edm.String",
"searchable": false,
"filterable": true,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "chunk",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "title",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_1",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_2",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_3",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "text_vector",
"type": "Collection(Edm.Single)",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false,
"dimensions": 1536,
"stored": false,
"vectorSearchProfile": "profile"
}
],
"vectorSearch": {
"profiles": [
{
"name": "profile",
"algorithm": "algorithm"
}
],
"algorithms": [
{
"name": "algorithm",
"kind": "hnsw"
}
]
}
}
Definición del conjunto de aptitudes para la fragmentación y vectorización compatibles con la estructura
Dado que la aptitud Diseño de documento se encuentra en versión preliminar, debe usar la API REST Creación del conjunto de aptitudes (2024-11-01-preview) para este paso.
Esta es una carga de definición del conjunto de aptitudes de ejemplo para proyectar fragmentos de secciones Markdown individuales y sus salidas vectoriales como documentos en el índice de búsqueda mediante la aptitud Diseño de documento y la aptitud Inserción de Azure OpenAI
POST {endpoint}/skillsets?api-version=2024-11-01-preview
{
"name": "my_skillset",
"description": "A skillset for structure-aware chunking and vectorization with a index projection around markdown section",
"skills": [
{
"@odata.type": "#Microsoft.Skills.Util.DocumentIntelligenceLayoutSkill",
"name": "my_document_intelligence_layout_skill",
"context": "/document",
"outputMode": "oneToMany",
"inputs": [
{
"name": "file_data",
"source": "/document/file_data"
}
],
"outputs": [
{
"name": "markdown_document",
"targetName": "markdownDocument"
}
],
"markdownHeaderDepth": "h3"
},
{
"@odata.type": "#Microsoft.Skills.Text.SplitSkill",
"name": "my_markdown_section_split_skill",
"description": "A skill that splits text into chunks",
"context": "/document/markdownDocument/*",
"inputs": [
{
"name": "text",
"source": "/document/markdownDocument/*/content",
"inputs": []
}
],
"outputs": [
{
"name": "textItems",
"targetName": "pages"
}
],
"defaultLanguageCode": "en",
"textSplitMode": "pages",
"maximumPageLength": 2000,
"pageOverlapLength": 500,
"unit": "characters"
},
{
"@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
"name": "my_azure_openai_embedding_skill",
"context": "/document/markdownDocument/*/pages/*",
"inputs": [
{
"name": "text",
"source": "/document/markdownDocument/*/pages/*",
"inputs": []
}
],
"outputs": [
{
"name": "embedding",
"targetName": "text_vector"
}
],
"resourceUri": "https://<subdomain>.openai.azure.com",
"deploymentId": "text-embedding-3-small",
"apiKey": "<Azure OpenAI api key>",
"modelName": "text-embedding-3-small"
}
],
"cognitiveServices": {
"@odata.type": "#Microsoft.Azure.Search.CognitiveServicesByKey",
"key": "<Cognitive Services api key>"
},
"indexProjections": {
"selectors": [
{
"targetIndexName": "my_consolidated_index",
"parentKeyFieldName": "text_parent_id",
"sourceContext": "/document/markdownDocument/*/pages/*",
"mappings": [
{
"name": "text_vector",
"source": "/document/markdownDocument/*/pages/*/text_vector"
},
{
"name": "chunk",
"source": "/document/markdownDocument/*/pages/*"
},
{
"name": "title",
"source": "/document/title"
},
{
"name": "header_1",
"source": "/document/markdownDocument/*/sections/h1"
},
{
"name": "header_2",
"source": "/document/markdownDocument/*/sections/h2"
},
{
"name": "header_3",
"source": "/document/markdownDocument/*/sections/h3"
}
]
}
],
"parameters": {
"projectionMode": "skipIndexingParentDocuments"
}
}
}
Ejecución del indexador
Una vez creados el origen de datos, el índice y el conjunto de aptitudes, ya puede crear y ejecutar el indexador. Este paso pone la canalización en ejecución.
Al usar la aptitud Diseño de documento, asegúrese de establecer los parámetros siguientes en la definición del indexador:
- El parámetro
allowSkillsetToReadFileData
debe establecerse entrue
. - el parámetro
parsingMode
debe establecerse endefault
.
Esta es una carga de ejemplo
{
"name": "my_indexer",
"dataSourceName": "my_blob_datasource",
"targetIndexName": "my_consolidated_index",
"skillsetName": "my_skillset",
"parameters": {
"batchSize": 1,
"configuration": {
"dataToExtract": "contentAndMetadata",
"parsingMode": "default",
"allowSkillsetToReadFileData": true
}
},
"fieldMappings": [
{
"sourceFieldName": "metadata_storage_path",
"targetFieldName": "title"
}
],
"outputFieldMappings": []
}
Comprobar los resultados
Puede consultar el índice de búsqueda después de que finalice el procesamiento para probar la solución.
Para comprobar los resultados, ejecute una consulta en el índice. Use el Explorador de búsqueda como cliente de búsqueda o cualquier herramienta que envíe solicitudes HTTP. La consulta siguiente selecciona campos que contienen la salida del contenido no vectorial de la sección Markdown y su vector.
Para el Explorador de búsqueda, puede copiar solo el JSON y pegarlo en la vista JSON para la ejecución de consultas.
POST /indexes/[index name]/docs/search?api-version=[api-version]
{
"search": "*",
"select": "metadata_storage_path, markdown_section, vector"
}