(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo generar embeddings multimodales en Azure AI & Machine Learning

João Barros 03 de October de 2026 4 min de lectura

Generar embeddings multimodales (texto + imagen) permite comparar y buscar contenidos heterogéneos usando una representación común. Este tutorial muestra cómo crear, probar y usar embeddings multimodales en Azure AI & Machine Learning para tareas como búsqueda semántica o clustering.

Prerequisitos

  • Cuenta Azure con suscripción activa y permisos para crear recursos.
  • Azure OpenAI Service o endpoint de embeddings de Azure AI con soporte multimodal.
  • Azure Machine Learning workspace (opcional para experimentación y despliegue).
  • Python 3.9+ y pip; bibliotecas: requests, numpy, scikit-learn, pillow.
  • Conjunto de ejemplos: algunos ficheros de imagen (.jpg/.png) y textos cortos para cada ítem.

Paso 1: ¿Por qué embeddings multimodales?

Los embeddings convierten texto e imágenes en vectores numéricos en el mismo espacio. Esto hace posible comparar un texto con una imagen (p. ej. "silla roja") o agrupar ítems similares. En Azure AI & Machine Learning usamos un endpoint de embeddings multimodal para generar estos vectores y luego herramientas estándar de ML para indexación y búsqueda.

Paso 2: Preparar el entorno y las credenciales

Guarde el endpoint y la clave del servicio Azure OpenAI o del servicio de embeddings multimodal. Instale las bibliotecas necesarias y prepare una carpeta con imágenes y un fichero CSV con texto asociado.

python -m venv venv && source venv/bin/activate
pip install requests numpy scikit-learn pillow
export AZURE_EMBED_ENDPOINT="https://seu-endpoint.openai.azure.com"
export AZURE_EMBED_KEY="sua_chave"

Paso 3: Función mínima para generar embedding de texto

Llame al endpoint de embeddings para texto. El ejemplo usa requests y supone un endpoint compatible con la API de embeddings de Azure OpenAI.

import os, requests, numpy as np

ENDPOINT = os.environ['AZURE_EMBED_ENDPOINT']
KEY = os.environ['AZURE_EMBED_KEY']
HEADERS = {"api-key": KEY, "Content-Type": "application/json"}

def embed_text(text):
    url = ENDPOINT + "/openai/deployments/embeddings/deploy-id/embeddings?api-version=2024-06-01"
    data = {"input": text}
    r = requests.post(url, headers=HEADERS, json=data)
    r.raise_for_status()
    vec = r.json()["data"][0]["embedding"]
    return np.array(vec, dtype=float)

Paso 4: Generar embedding de imagen (preprocesamiento)

Algunos endpoints multimodales aceptan imagen como input directo; en otros casos, convertimos la imagen a base64 o extraemos características locales con un modelo ligero. Aquí mostramos cómo enviar la imagen en base64 en caso de que el endpoint lo acepte.

import base64
from PIL import Image
import io

def embed_image(path):
    with open(path, "rb") as f:
        b64 = base64.b64encode(f.read()).decode('utf-8')
    url = ENDPOINT + "/openai/deployments/embeddings-multimodal/deploy-id/embeddings?api-version=2024-06-01"
    data = {"input": {"image": b64}}
    r = requests.post(url, headers=HEADERS, json=data)
    r.raise_for_status()
    vec = r.json()["data"][0]["embedding"]
    return np.array(vec, dtype=float)

Paso 5: Construir un índice simple y hacer búsqueda semántica

Guarde todos los vectores en un array y use el coseno para medir similitud. A continuación un ejemplo simple con scikit-learn para calcular distancias y devolver los top-k similares.

from sklearn.metrics.pairwise import cosine_similarity

# Ejemplo de colección mixta
items = [
    {"id": "img1", "type": "image", "path": "images/cadeira_vermelha.jpg"},
    {"id": "txt1", "type": "text", "text": "cadeira vermelha em madeira"},
]

vectors = []
meta = []
for it in items:
    if it['type'] == 'image':
        v = embed_image(it['path'])
    else:
        v = embed_text(it['text'])
    vectors.append(v)
    meta.append(it)

vectors = np.vstack(vectors)

def search(query_text, top_k=3):
    qv = embed_text(query_text).reshape(1, -1)
    sims = cosine_similarity(qv, vectors)[0]
    idx = sims.argsort()[::-1][:top_k]
    return [(meta[i], float(sims[i])) for i in idx]

# Ejemplo de búsqueda
print(search("cadeira vermelha"))

Paso 6: Errores comunes y cómo resolverlos

Errores frecuentes: 401/403 (clave o endpoint incorrectos), 415 (formato de la imagen no soportado), vectores de dimensiones diferentes (usar el mismo deployment/modelo). Verifique el api-version y el deploy-id; si el endpoint no soporta imagen en base64, use un modelo local para extraer características antes de comparar.

Verificar el resultado

Pruebe con varias consultas textuales y compare las imágenes/textos devueltos. El resultado es correcto si los ítems semánticamente relacionados aparecen en la parte superior. Verifique también que los embeddings tienen dimensión fija y que la similitud coseno devuelve valores próximos a 1 para ítems idénticos.

Conclusión

Con embeddings multimodales en Azure AI & Machine Learning puede unir texto e imagen en el mismo espacio vectorial para búsqueda semántica, clustering o clasificación. Próximos pasos: indexar vectores con FAISS o Azure Cognitive Search para producción, y experimentar thresholds de similitud. Consejo: comience con un conjunto pequeño y verifique las dimensiones del embedding antes de escalar.