Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Azure AI Search puede extraer e indexar texto e imágenes de documentos PDF almacenados en Azure Blob Storage. En este tutorial se muestra cómo crear una canalización de indexación incremental que fragmenta los datos basados en la estructura del documento y usa incrustaciones incrementales para vectorizar texto e imágenes del mismo documento. Las imágenes recortadas se almacenan en un almacén de conocimiento y tanto el contenido visual como el texto se vectorizan e ingieren en un índice que se puede buscar. La fragmentación se basa en el modelo de diseño de Azure Document Intelligence en Foundry Tools que reconoce la estructura del documento.
En este tutorial, usará:
Documento PDF de 36 páginas que combina contenido visual enriquecido, como gráficos, infografías y páginas escaneadas, con texto tradicional.
Un indexador y un conjunto de habilidades para crear una canalización de indexación que incluya el enriquecimiento con IA a través de habilidades.
La habilidad de Diseño de Documento para extraer texto e imágenes normalizadas con sus
locationMetadatade varios documentos, como números de página o regiones delimitadas.La habilidad de incrustaciones multimodales de Azure Vision para vectorizar texto e imágenes.
Índice de búsqueda configurado para almacenar el texto extraído y el contenido de la imagen. Algunos contenidos se vectorizan para la búsqueda de similitud basada en vectores.
Prerequisites
Recurso de Microsoft Foundry. Este recurso proporciona acceso tanto al modelo de inserción bidireccional de Azure Vision como al modelo de diseño de Azure Document Intelligence que usan las aptitudes de este tutorial. Debe usar un recurso de Foundry para el acceso del conjunto de aptitudes a estos recursos.
Búsqueda de Azure AI. Configure el servicio de búsqueda para el control de acceso basado en rol y una identidad administrada. El servicio debe estar en el nivel Básico o superior. Este tutorial no se admite en el nivel Gratis.
Azure Storage, que se usa para almacenar datos de ejemplo y para crear un almacén de conocimiento.
Visual Studio Code con un cliente REST.
Limitations
La habilidad de Diseño de documento tiene disponibilidad regional limitada. Al crear el recurso Foundry, elija una región que proporcione incrustaciones multimodales. Para obtener una lista de las regiones admitidas, consulte Regiones admitidas por la habilidad Diseño de documentos.
La habilidad de incrustaciones multimodales de Azure Vision también tiene una disponibilidad regional limitada. Para obtener una lista actualizada de las regiones que proporcionan instalaciones multimodales, consulte la documentación de Azure Vision.
Preparación de datos
Las instrucciones siguientes se aplican a Azure Storage, que proporciona los datos de ejemplo y también hospeda el almacén de conocimiento. Una identidad del servicio de búsqueda necesita acceso de lectura al almacenamiento de Azure para recuperar los datos de ejemplo y necesita acceso de escritura para crear el almacén de conocimiento. El servicio de búsqueda crea el contenedor para las imágenes recortadas durante el procesamiento del conjunto de aptitudes, con el nombre que se proporciona en una variable de entorno.
Descargue el siguiente PDF de ejemplo: sustainable-ai-pdf
En Azure Storage, cree un contenedor denominado sustainable-ai-pdf.
Cree asignaciones de roles y especifique una identidad administrada en una cadena de conexión:
Asigne Lector de datos de Storage Blob para la recuperación de datos por parte del indexador. Asigne Colaborador de datos de Storage Blob y Colaborador de datos de tabla de almacenamiento para crear y cargar el almacén de conocimiento. Puede usar una identidad administrada asignada por el sistema o una identidad administrada asignada por el usuario para la asignación de roles del servicio de búsqueda.
Para las conexiones realizadas mediante una identidad administrada asignada por el sistema, obtenga una cadena de conexión que contenga un ResourceId, sin clave de cuenta ni contraseña. ResourceId debe incluir el identificador de suscripción de la cuenta de almacenamiento, el grupo de recursos de la cuenta de almacenamiento y el nombre de la cuenta de almacenamiento. La cadena de conexión es parecida a la del ejemplo siguiente:
"credentials" : { "connectionString" : "ResourceId=/subscriptions/00000000-0000-0000-0000-00000000/resourceGroups/MY-DEMO-RESOURCE-GROUP/providers/Microsoft.Storage/storageAccounts/MY-DEMO-STORAGE-ACCOUNT/;" }Para las conexiones realizadas mediante una identidad administrada asignada por el usuario, obtenga una cadena de conexión que contenga un ResourceId, sin clave de cuenta ni contraseña. ResourceId debe incluir el identificador de suscripción de la cuenta de almacenamiento, el grupo de recursos de la cuenta de almacenamiento y el nombre de la cuenta de almacenamiento. Proporcione una identidad con la sintaxis que se muestra en el ejemplo siguiente. Establezca userAssignedIdentity en la identidad administrada asignada por el usuario. La cadena de conexión es parecida a la del ejemplo siguiente:
"credentials" : { "connectionString" : "ResourceId=/subscriptions/00000000-0000-0000-0000-00000000/resourceGroups/MY-DEMO-RESOURCE-GROUP/providers/Microsoft.Storage/storageAccounts/MY-DEMO-STORAGE-ACCOUNT/;" }, "identity" : { "@odata.type": "#Microsoft.Azure.Search.DataUserAssignedIdentity", "userAssignedIdentity" : "/subscriptions/00000000-0000-0000-0000-00000000/resourcegroups/MY-DEMO-RESOURCE-GROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/MY-DEMO-USER-MANAGED-IDENTITY" }
Preparación de modelos
En este tutorial se da por supuesto que tiene un recurso Foundry existente mediante el cual la habilidad llama al modelo de embeddings multimodal de Azure Vision 4.0. El servicio de búsqueda se conecta al modelo durante el procesamiento del conjunto de aptitudes mediante su identidad administrada. En esta sección se proporcionan instrucciones y vínculos para asignar roles para el acceso autorizado.
La misma asignación de roles también se usa para acceder al modelo de diseño de Azure Document Intelligence a través de un recurso Foundry.
Inicie sesión en Azure Portal (no en el portal de Foundry) y busque el recurso Foundry. Asegúrese de que se encuentra en una región que proporciona la API multimodal 4.0 y el modelo de diseño de Azure Document Intelligence.
Seleccione Control de acceso (IAM).
Seleccione Agregar y, a continuación, Agregar asignación de roles.
Busque Usuario de Cognitive Services y selecciónelo.
Elija Identidad administrada y, a continuación, asigne la identidad administrada del servicio de búsqueda.
Configuración del archivo REST
En este tutorial, la conexión del cliente REST local a Azure AI Search requiere un punto de conexión y una clave de API. Puede obtener estos valores en Azure Portal. Para obtener métodos de conexión alternativos, consulte Conexión a un servicio de búsqueda.
Para las conexiones autenticadas que se producen durante el procesamiento del indexador y del conjunto de aptitudes, el servicio de búsqueda usa las asignaciones de roles que definió anteriormente.
Inicie Visual Studio Code y cree un nuevo archivo.
Proporcione valores para las variables usadas en la solicitud. Para
@storageConnection, asegúrese de que la cadena de conexión no termine con un punto y coma ni con comillas. En@imageProjectionContainer, proporcione un nombre de contenedor único en Blob Storage. Azure AI Search crea este contenedor automáticamente durante el procesamiento de aptitudes.@searchUrl = PUT-YOUR-SEARCH-SERVICE-ENDPOINT-HERE @searchApiKey = PUT-YOUR-ADMIN-API-KEY-HERE @storageConnection = PUT-YOUR-STORAGE-CONNECTION-STRING-HERE @cognitiveServicesUrl = PUT-YOUR-AZURE-AI-FOUNDARY-ENDPOINT-HERE @modelVersion = 2023-04-15 @imageProjectionContainer=sustainable-ai-pdf-imagesGuarde el archivo mediante una extensión de archivo
.resto.http. Para obtener ayuda con el cliente REST, consulte Inicio rápido: Búsqueda de texto completo mediante REST.
Para obtener el punto de conexión y la clave de API de Azure AI Search:
Inicie sesión en Azure Portal, vaya a la página Información general del servicio de búsqueda y copie la dirección URL. Un punto de conexión de ejemplo podría ser similar a
https://mydemo.search.windows.net.En Configuración>Claves, copie una clave de administrador. Las claves de administrador se utilizan para agregar, modificar y eliminar objetos. Hay dos claves de administrador intercambiables. Copie una de las dos.
Creación de un origen de datos
Crear origen de datos (REST) crea una conexión de origen de datos que especifica qué datos se van a indexar.
### Create a data source using system-assigned managed identities
POST {{searchUrl}}/datasources?api-version=2025-11-01-preview HTTP/1.1
Content-Type: application/json
api-key: {{searchApiKey}}
{
"name": "doc-intelligence-multimodal-embedding-ds",
"description": "A data source to store multimodal documents",
"type": "azureblob",
"subtype": null,
"credentials":{
"connectionString":"{{storageConnection}}"
},
"container": {
"name": "sustainable-ai-pdf",
"query": null
},
"dataChangeDetectionPolicy": null,
"dataDeletionDetectionPolicy": null,
"encryptionKey": null,
"identity": null
}
Envíe la solicitud. La respuesta debería tener este aspecto:
HTTP/1.1 201 Created
Transfer-Encoding: chunked
Content-Type: application/json; odata.metadata=minimal; odata.streaming=true; charset=utf-8
Location: https://<YOUR-SEARCH-SERVICE-NAME>.search.windows-int.net:443/datasources('doc-extraction-multimodal-embedding-ds')?api-version=2025-11-01-preview -Preview
Server: Microsoft-IIS/10.0
Strict-Transport-Security: max-age=2592000, max-age=15724800; includeSubDomains
Preference-Applied: odata.include-annotations="*"
OData-Version: 4.0
request-id: 4eb8bcc3-27b5-44af-834e-295ed078e8ed
elapsed-time: 346
Date: Sat, 26 Apr 2025 21:25:24 GMT
Connection: close
{
"name": "doc-extraction-multimodal-embedding-ds",
"description": null,
"type": "azureblob",
"subtype": null,
"indexerPermissionOptions": [],
"credentials": {
"connectionString": null
},
"container": {
"name": "sustainable-ai-pdf",
"query": null
},
"dataChangeDetectionPolicy": null,
"dataDeletionDetectionPolicy": null,
"encryptionKey": null,
"identity": null
}
Creación de un índice
Crear índice (REST) crea un índice de búsqueda en el servicio de búsqueda. Un índice especifica todos los parámetros y sus atributos.
Para JSON anidado, los campos de índice deben ser idénticos a los campos de origen. Actualmente, Azure AI Search no admite asignaciones de campos a JSON anidados, por lo que los nombres de campo y los tipos de datos deben coincidir completamente. El índice siguiente se alinea con los elementos JSON del contenido sin procesar.
### Create an index
POST {{searchUrl}}/indexes?api-version=2025-11-01-preview HTTP/1.1
Content-Type: application/json
api-key: {{searchApiKey}}
{
"name": "doc-intelligence-multimodal-embedding-index",
"fields": [
{
"name": "content_id",
"type": "Edm.String",
"retrievable": true,
"key": true,
"analyzer": "keyword"
},
{
"name": "text_document_id",
"type": "Edm.String",
"searchable": false,
"filterable": true,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false
},
{
"name": "document_title",
"type": "Edm.String",
"searchable": true
},
{
"name": "image_document_id",
"type": "Edm.String",
"filterable": true,
"retrievable": true
},
{
"name": "content_text",
"type": "Edm.String",
"searchable": true,
"retrievable": true
},
{
"name": "content_embedding",
"type": "Collection(Edm.Single)",
"dimensions": 1024,
"searchable": true,
"retrievable": true,
"vectorSearchProfile": "hnsw"
},
{
"name": "content_path",
"type": "Edm.String",
"searchable": false,
"retrievable": true
},
{
"name": "offset",
"type": "Edm.String",
"searchable": false,
"retrievable": true
},
{
"name": "location_metadata",
"type": "Edm.ComplexType",
"fields": [
{
"name": "page_number",
"type": "Edm.Int32",
"searchable": false,
"retrievable": true
},
{
"name": "bounding_polygons",
"type": "Edm.String",
"searchable": false,
"retrievable": true,
"filterable": false,
"sortable": false,
"facetable": false
}
]
}
],
"vectorSearch": {
"profiles": [
{
"name": "hnsw",
"algorithm": "defaulthnsw",
"vectorizer": "demo-vectorizer"
}
],
"algorithms": [
{
"name": "defaulthnsw",
"kind": "hnsw",
"hnswParameters": {
"m": 4,
"efConstruction": 400,
"metric": "cosine"
}
}
],
"vectorizers": [
{
"name": "demo-vectorizer",
"kind": "aiServicesVision",
"aiServicesVisionParameters": {
"resourceUri": "{{cognitiveServicesUrl}}",
"authIdentity": null,
"modelVersion": "{{modelVersion}}"
}
}
]
},
"semantic": {
"defaultConfiguration": "semanticconfig",
"configurations": [
{
"name": "semanticconfig",
"prioritizedFields": {
"titleField": {
"fieldName": "document_title"
},
"prioritizedContentFields": [
],
"prioritizedKeywordsFields": []
}
}
]
}
}
Puntos clave:
Las incrustaciones de texto e imagen se almacenan en el
content_embeddingcampo y deben configurarse con dimensiones adecuadas, como 1024, y un perfil de búsqueda vectorial.location_metadatacaptura metadatos de número de página y polígono delimitador para cada fragmento de texto y imagen normalizada, lo que permite superposiciones precisas de búsqueda espacial o interfaz de usuario.Para más información sobre la búsqueda de vectores, consulte Vectores en Azure AI Search.
Para más información sobre la clasificación semántica, consulte Clasificación semántica en Azure AI Search.
Crear un conjunto de habilidades
Crear conjunto de aptitudes (REST) crea un conjunto de aptitudes en el servicio de búsqueda. Un conjunto de aptitudes define las operaciones que fragmentan e insertan contenido antes de la indexación. Este conjunto de aptitudes usa la aptitud Diseño de documento para extraer texto e imágenes, conservando los metadatos de ubicación que son útiles para las citas en aplicaciones RAG. Usa la habilidad de embeddings multimodal de Azure Vision para vectorizar contenido de imagen y texto.
### Create a skillset
POST {{searchUrl}}/skillsets?api-version=2025-11-01-preview HTTP/1.1
Content-Type: application/json
api-key: {{searchApiKey}}
{
"name": "doc-intelligence-multimodal-embedding-skillset",
"description": "A sample skillset for multimodal using multimodal embedding",
"skills": [
{
"@odata.type": "#Microsoft.Skills.Util.DocumentIntelligenceLayoutSkill",
"name": "document-layout-skill",
"description": "Azure Document Intelligence skill for document cracking",
"context": "/document",
"outputMode": "oneToMany",
"outputFormat": "text",
"extractionOptions": ["images", "locationMetadata"],
"chunkingProperties": {
"unit": "characters",
"maximumLength": 2000,
"overlapLength": 200
},
"inputs": [
{
"name": "file_data",
"source": "/document/file_data"
}
],
"outputs": [
{
"name": "text_sections",
"targetName": "text_sections"
},
{
"name": "normalized_images",
"targetName": "normalized_images"
}
]
},
{
"@odata.type": "#Microsoft.Skills.Vision.VectorizeSkill",
"name": "text-embedding-skill",
"description": "Vision Vectorization skill for text",
"context": "/document/text_sections/*",
"modelVersion": "2023-04-15",
"inputs": [
{
"name": "text",
"source": "/document/text_sections/*/content"
}
],
"outputs": [
{
"name": "vector",
"targetName": "text_vector"
}
]
},
{
"@odata.type": "#Microsoft.Skills.Vision.VectorizeSkill",
"name": "image-embedding-skill",
"description": "Vision Vectorization skill for images",
"context": "/document/normalized_images/*",
"modelVersion": "2023-04-15",
"inputs": [
{
"name": "image",
"source": "/document/normalized_images/*"
}
],
"outputs": [
{
"name": "vector",
"targetName": "image_vector"
}
]
},
{
"@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
"name": "shaper-skill",
"context": "/document/normalized_images/*",
"inputs": [
{
"name": "normalized_images",
"source": "/document/normalized_images/*",
"inputs": []
},
{
"name": "imagePath",
"source": "='my_container_name/'+$(/document/normalized_images/*/imagePath)",
"inputs": []
}
],
"outputs": [
{
"name": "output",
"targetName": "new_normalized_images"
}
]
}
],
"indexProjections": {
"selectors": [
{
"targetIndexName": "doc-intelligence-multimodal-embedding-index",
"parentKeyFieldName": "text_document_id",
"sourceContext": "/document/text_sections/*",
"mappings": [
{
"name": "content_embedding",
"source": "/document/text_sections/*/text_vector"
},
{
"name": "content_text",
"source": "/document/text_sections/*/content"
},
{
"name": "location_metadata",
"source": "/document/text_sections/*/locationMetadata"
},
{
"name": "document_title",
"source": "/document/document_title"
}
]
},
{
"targetIndexName": "{{index}}",
"parentKeyFieldName": "image_document_id",
"sourceContext": "/document/normalized_images/*",
"mappings": [
{
"name": "content_embedding",
"source": "/document/normalized_images/*/image_vector"
},
{
"name": "content_path",
"source": "/document/normalized_images/*/new_normalized_images/imagePath"
},
{
"name": "document_title",
"source": "/document/document_title"
},
{
"name": "location_metadata",
"source": "/document/normalized_images/*/locationMetadata"
}
]
}
],
"parameters": {
"projectionMode": "skipIndexingParentDocuments"
}
},
"cognitiveServices": {
"@odata.type": "#Microsoft.Azure.Search.AIServicesByIdentity",
"subdomainUrl": "{{cognitiveServicesUrl}}",
"identity": null
},
"knowledgeStore": {
"storageConnectionString": "",
"identity": null,
"projections": [
{
"files": [
{
"storageContainer": "{{imageProjectionContainer}}",
"source": "/document/normalized_images/*"
}
]
}
]
}
}
Este conjunto de habilidades extrae texto e imágenes, vectoriza ambos y estructura los metadatos de imagen para su proyección en el índice.
Puntos clave:
El
content_textcampo se rellena con texto extraído y fragmentado mediante la habilidad de diseño de documentos.content_pathcontiene la ruta de acceso relativa al archivo de imagen dentro del contenedor de proyección de imágenes designada. Este campo solo se genera para las imágenes extraídas de documentos cuandoextractOptionse establece en["images", "locationMetadata"]o["images"], y se puede asignar desde el documento enriquecido desde el campo de origen/document/normalized_images/*/imagePath.La aptitud de inserción bidireccional de Azure Vision permite insertar datos textuales y visuales mediante el mismo tipo de aptitud, diferenciado por entrada (texto frente a imagen). Para más información, consulte Habilidad de incrustaciones multimodales de Azure Vision.
Creación y ejecución de un indexador
Crear indexador crea un indexador en el servicio de búsqueda. Un indexador se conecta al origen de datos, carga datos, ejecuta un conjunto de aptitudes e indexa los datos enriquecidos.
### Create and run an indexer
POST {{searchUrl}}/indexers?api-version=2025-11-01-preview HTTP/1.1
Content-Type: application/json
api-key: {{searchApiKey}}
{
"dataSourceName": "doc-intelligence-multimodal-embedding-ds",
"targetIndexName": "doc-intelligence-multimodal-embedding-index",
"skillsetName": "doc-intelligence-multimodal-embedding-skillset",
"parameters": {
"maxFailedItems": -1,
"maxFailedItemsPerBatch": 0,
"batchSize": 1,
"configuration": {
"allowSkillsetToReadFileData": true
}
},
"fieldMappings": [
{
"sourceFieldName": "metadata_storage_name",
"targetFieldName": "document_title"
}
],
"outputFieldMappings": []
}
Realizar consultas
Puede empezar a realizar búsquedas en cuanto se cargue el primer documento.
### Query the index
POST {{searchUrl}}/indexes/doc-intelligence-multimodal-embedding-index/docs/search?api-version=2025-11-01-preview HTTP/1.1
Content-Type: application/json
api-key: {{searchApiKey}}
{
"search": "*",
"count": true
}
Envíe la solicitud. Se trata de una consulta de búsqueda de texto completo no especificada que devuelve todos los campos marcados como recuperables en el índice, junto con un recuento de documentos. La respuesta debería tener este aspecto:
{
"@odata.count": 100,
"@search.nextPageParameters": {
"search": "*",
"count": true,
"skip": 50
},
"value": [
],
"@odata.nextLink": "https://<YOUR-SEARCH-SERVICE-NAME>.search.windows.net/indexes/doc-intelligence-multimodal-embedding-index/docs/search?api-version=2025-11-01-preview "
}
Se devuelven 100 documentos en la respuesta.
En el caso de los filtros, también es posible usar operadores lógicos (and, or y not) y operadores de comparación (eq, ne, gt, lt, ge y le). La comparación de cadenas distingue mayúsculas de minúsculas. Para obtener más información y ejemplos, vea Ejemplos de consultas de búsqueda sencillas.
Note
El $filter parámetro solo funciona en campos marcados como filtrables durante la creación del índice.
### Query for only images
POST {{searchUrl}}/indexes/doc-intelligence-multimodal-embedding-index/docs/search?api-version=2025-11-01-preview HTTP/1.1
Content-Type: application/json
api-key: {{searchApiKey}}
{
"search": "*",
"count": true,
"filter": "image_document_id ne null"
}
### Query for text or images with content related to energy, returning the id, parent document, and text (only populated for text chunks), and the content path where the image is saved in the knowledge store (only populated for images)
POST {{searchUrl}}/indexes/doc-intelligence-multimodal-embedding-index/docs/search?api-version=2025-11-01-preview HTTP/1.1
Content-Type: application/json
api-key: {{searchApiKey}}
{
"search": "energy",
"count": true,
"select": "content_id, document_title, content_text, content_path"
}
Restablecer y volver a ejecutar
Los indexadores se pueden restablecer para borrar el historial de ejecución, lo que permite una nueva ejecución completa. Las siguientes solicitudes POST son para el restablecimiento, seguido de la repetición de la ejecución.
### Reset the indexer
POST {{searchUrl}}/indexers/doc-intelligence-multimodal-embedding-indexer/reset?api-version=2025-11-01-preview HTTP/1.1
api-key: {{searchApiKey}}
### Run the indexer
POST {{searchUrl}}/indexers/doc-intelligence-multimodal-embedding-indexer/run?api-version=2025-11-01-preview HTTP/1.1
api-key: {{searchApiKey}}
### Check indexer status
GET {{searchUrl}}/indexers/doc-intelligence-multimodal-embedding-indexer/status?api-version=2025-11-01-preview HTTP/1.1
api-key: {{searchApiKey}}
Limpieza de recursos
Cuando trabajes con tu propia suscripción, al final de un proyecto, es recomendable eliminar los recursos que ya no necesites. Los recursos que se dejan en ejecución pueden costarle mucho dinero. Puede eliminar recursos individualmente o eliminar el grupo de recursos para eliminar todo el conjunto de recursos.
Puede utilizar Azure Portal para eliminar índices, indexadores y fuentes de datos.
Consulte también
Ahora que está familiarizado con una implementación de ejemplo de un escenario de indexación multimodal, consulte: