Preparación para la Certificación Microsoft AI-200
Implementar búsqueda semántica e híbrida con Azure Cosmos DB for NoSQL
Almacena embeddings junto a los datos operativos, elige directivas vectoriales e índices DiskANN, clasifica resultados semánticos e híbridos y actualiza vectores con la fuente de cambios.
Tiempo de estudio sugerido: 105 minutos • Nivel intermedio • Reescritura original completa con versión resumida de cada tema, evaluación comentada y laboratorio guiado de búsqueda semántica
Por João Ricardo Dutra••Contenido original completo
1. Convertir documentos operativos en conocimiento localizable por significado
La búsqueda por palabras clave pierde contenido cuando usuario y autor emplean términos distintos. Una pregunta sobre una conexión inalámbrica interrumpida puede encontrar un artículo de diagnóstico de WiFi si ambos textos se representan mediante vectores cercanos. for guarda estos embeddings con el documento y sus , sin sincronizar otra base vectorial.
Persistir embeddings junto al contenido y los filtrables.
Configurar directivas e índices vectoriales compatibles con el modelo.
Ejecutar consultas de similitud, filtradas, híbridas y multivectoriales.
Actualizar embeddings cuando cambie el origen.
Resumen del tema
La búsqueda semántica compara significado en el espacio vectorial; reunir vectores, documentos y simplifica el recorrido de datos.
2. Modelar contenido, y embeddings en el mismo documento
Un embedding es una matriz numérica producida por machine learning a partir de texto, imagen u otro contenido. Las entradas de significado próximo ocupan posiciones vecinas en un espacio de muchas dimensiones. El modelo fija el tamaño: text-embedding-ada-002 genera 1536 valores y text-embedding-3-large puede producir 3072. Más dimensiones pueden conservar matices, pero aumentan almacenamiento e indexación.
Un elemento útil reúne id, texto, categoría, producto, fecha, atributos de acceso y embedding. Los permiten filtros exactos y el vector aporta orden semántico. Título y cuerpo pueden compartir vector o usar rutas distintas.
El modelo produce el vector; lo conserva junto a los datos representados.
Resumen del tema
Almacena contenido original, filtrables y un embedding compatible en el mismo elemento.
3. Configurar la directiva vectorial y la función de distancia
La directiva asocia cada ruta con tipo, dimensiones y función de distancia. Los valores deben coincidir con el modelo. Coseno compara dirección y suele servir para texto normalizado; producto escalar considera dirección y magnitud y equivale al coseno con vectores normalizados; Euclidiana mide distancia recta, donde menos significa más cercanía.
Habilita la búsqueda vectorial en la cuenta. Trátala como decisión inicial: la documentación actual permite agregar o quitar rutas, pero no editar directamente una configuración; elimina y vuelve a crear la directiva o el índice al cambiar parámetros.
Resumen del tema
Ruta, tipo, dimensiones y distancia deben describir exactamente los vectores.
4. Elegir tipos de datos e índices vectoriales
float32 favorece precisión y sencillez. float16 reduce aproximadamente a la mitad el almacenamiento con un efecto normalmente pequeño. int8 y uint8 requieren embeddings cuantificados y ahorran más, pero exigen validar la calidad.
Opciones de índice vectorial.
Índice
Límites y comportamiento
Uso habitual
flat
exacta; hasta 505 dimensiones.
Colecciones pequeñas o validación con recuperación total.
quantizedFlat
Examen exacto comprimido; hasta 4096 dimensiones.
Hasta unos 50 000 vectores en el ámbito.
diskANN
Índice DiskANN aproximado y rápido; hasta 4096 dimensiones.
Colecciones grandes con objetivos de latencia y RU.
quantizedFlat y diskANN necesitan al menos 1000 vectores para que actúe el índice; con menos se hace un examen completo. Excluye el embedding del índice de rango ordinario para no elevar escritura y almacenamiento sin utilidad.
Índice y consulta equilibran recuperación, latencia, cantidad de resultados y RU.
Resumen del tema
Elige precisión e índice según dimensiones, escala, latencia, recuperación y RU, con pruebas representativas.
5. Crear el contenedor y escribir embeddings sincronizados
Crea el contenedor con directivas vectorial y de indexación y una clave alineada con los filtros comunes. Una biblioteca de soporte particionada por /category puede dirigir búsquedas de categoría a una partición. Genera el embedding del contenido buscable y escribe documento y vector juntos.
Usa la misma implementación del modelo para documentos y consultas. Cuando cambie el texto, regenera el vector antes del upsert para evitar divergencias.
Resumen del tema
Crea el contenedor vectorial y persiste texto, y embedding recién generado en una operación.
VectorDistance compara la ruta almacenada con el vector de consulta mediante la función de la directiva. Genera la pregunta con el mismo modelo, pues otros modelos crean espacios incompatibles. Proyecta la puntuación en SELECT y repite la expresión en ORDER BY.
query = """
SELECT TOP 10
c.id,
c.title,
VectorDistance(c.embedding, @queryVector) AS similarity
FROM c
ORDER BY VectorDistance(c.embedding, @queryVector)
"""
results = container.query_items(
query=query,
parameters=[{"name": "@queryVector", "value": query_embedding}],
enable_cross_partition_query=True
)
Envía el vector como @queryVector para mantener la instrucción legible, reutilizar planes y evitar concatenar miles de números. Limita siempre con TOP N para controlar latencia y RU.
Resumen del tema
Vectoriza la pregunta con el modelo del documento, parametriza, ordena por VectorDistance y limita resultados.
7. Interpretar puntuaciones y equilibrar búsqueda indexada y exacta
Con coseno, números mayores indican mayor cercanía: +1 es dirección idéntica; 0,7–0,9 suele ser alta similitud; 0,5–0,7, moderada; y valores bajos o negativos, poca relación. Son referencias que deben calibrarse con ejemplos etiquetados.
RAG suele usar 5–10 fragmentos.
La búsqueda interactiva muestra 10–20 resultados y pagina.
La recomendación suele presentar 3–5 elementos.
El índice es aproximado; el tercer argumento true de VectorDistance fuerza un examen exacto.
Reserva para evaluación, colecciones pequeñas o recuperación total obligatoria. En producción usa DiskANN o quantizedFlat, proyecta pocos campos, dirige la partición y mide latencia y RU.
Resumen del tema
Mide umbrales y recuperación; optimiza con índice, TOP pequeño, proyección estrecha y partición.
8. Combinar clasificación vectorial con filtros y particiones
Las aplicaciones restringen significado por categoría, fecha, producto, versión, estado o grupo de acceso. Incluye esos predicados en WHERE para reducir candidatos. El prefiltrado selectivo ahorra trabajo; el posfiltrado conserva la clasificación global, pero puede devolver menos filas.
query = """
SELECT TOP 10 c.id, c.title,
VectorDistance(c.embedding, @queryVector) AS similarity
FROM c
WHERE c.category = @category
AND c.createdDate >= @startDate
ORDER BY VectorDistance(c.embedding, @queryVector)
"""
results = container.query_items(
query=query,
parameters=[
{"name": "@queryVector", "value": query_embedding},
{"name": "@category", "value": "networking"},
{"name": "@startDate", "value": "2026-01-01T00:00:00Z"}
],
partition_key="networking"
)
documentType separa preguntas frecuentes, guías y notas.
Los intervalos de fecha delimitan ventanas.
productId y versión fijan el producto.
ARRAY_CONTAINS comprueba grupos autorizados.
status excluye borradores, archivos y contenido obsoleto.
Si category es la clave, usa el WHERE y también partition_key para dirigir la consulta a una partición.
Resumen del tema
Filtra dentro de la consulta, indexa los campos y pasa la clave cuando identifique una partición.
9. Fusionar relevancia semántica y textual con RRF
El vector entiende paráfrasis; el texto completo reconoce códigos, productos y términos exactos. La búsqueda híbrida configura ambas directivas e índices y aplica Reciprocal Rank Fusion.
SELECT TOP 10 *
FROM c
ORDER BY RANK RRF(
VectorDistance(c.embedding, @queryVector),
FullTextScore(c.content, @term1, @term2),
[2, 1]
)
Los pesos [2, 1] hacen el vector dos veces más influyente. Eleva el peso semántico para lenguaje natural, el textual para identificadores, o empieza igual y calibra. Dos señales consumen más RU, por lo que deben mejorar la relevancia de forma medible.
Resumen del tema
ORDER BY RANK RRF une VectorDistance y FullTextScore; los pesos definen importancia relativa.
10. Clasificar varios embeddings y probar a escala real
Un documento puede guardar embeddings distintos para título y contenido o modalidades diferentes. RRF fusiona varias llamadas VectorDistance; los elementos fuertes en cualquier espacio siguen candidatos y los fuertes en ambos ascienden. Cada ruta necesita su propia directiva.
Filtros, texto completo y múltiples vectores aumentan RU. Prueba con volúmenes y selectividad de producción, inspecciona x-ms--charge y métricas, y confirma índices para los campos WHERE.
Resumen del tema
La búsqueda multivectorial amplía relevancia, pero cada señal debe justificar latencia y RU.
11. Usar la fuente de cambios como señal de actualización
La fuente de cambios está habilitada por defecto y conserva el orden dentro de cada intervalo de clave. Un consumidor reanuda tras interrupciones, pero un fallo puede repetir trabajo; el procesamiento debe ser idempotente. Es mejor que examinar periódicamente todos los documentos.
Modelos de consumo.
Modelo
Ventajas
Elegir para
Push
Entrega, equilibrio, puntos de control y operación continua automáticos.
o procesador permanente.
Pull
Programación, lotes y control explícitos.
Actualización periódica, migración u orquestación por lotes.
El contenedor de concesiones guarda checkpoints y los evitan regeneración innecesaria.
Resumen del tema
Usa la fuente como origen duradero y diseña el controlador para repetir sin efectos adversos.
12. Procesar cambios con , concesiones y actualización selectiva
El desencadenador de gestiona propiedad de particiones y checkpoints. El contenedor de concesiones registra rango y progreso, habilitando coordinación, conmutación por error y escala horizontal. Un contenedor pequeño de 400 RU/s suele bastar.
import azure.functions as func
app = func.FunctionApp()
@app.cosmos_db_trigger(
arg_name="documents",
container_name="support-knowledge",
database_name="support-db",
connection="CosmosDBConnection",
lease_container_name="leases",
create_lease_container_if_not_exists=True
)
def refresh_embeddings(documents: func.DocumentList):
for document in documents:
if needs_refresh(document):
document["embedding"] = create_embedding(document)
document["contentHash"] = content_hash(document)
container.upsert_item(document)
No regeneres por cambios solo de . Compara título, contenido, descripción y resumen o guarda del texto. Actualiza y vector juntos para evitar llamadas cuando categoría, estado o permiso cambian sin alterar significado.
Resumen del tema
Desencadenador y concesiones aportan orquestación; la comparación de contenido controla coste.
13. Escalar con seguridad y conservar control con pull
Para picos, agrupa textos, reintenta con retroceso exponencial y desacopla detección y vectorización mediante . Las colas prioritarias pueden atender guías activas antes que archivos históricos.
iterator = container.query_items_change_feed(start_time="Beginning")
for page in iterator.by_page():
for change in page:
process_idempotently(change)
save_checkpoint(iterator.continuation_token)
Persiste el de continuación.
Trata elementos eliminados como no encontrados benignos.
Usa contra sobrescrituras concurrentes.
Envía fallos repetidos a una cola de mensajes fallidos.
Supervisa ChangeFeedProcessorHostLag y agrega instancias cuando aumente el retraso.
Resumen del tema
Agrupa, reintenta, guarda checkpoint y supervisa; aísla errores y mantén idempotencia.
14. Laboratorio guiado, revisión de evaluación y referencias Microsoft
El laboratorio de unos 30 minutos implementa una cuenta de for con búsqueda vectorial, crea directivas e índices, carga incidencias con embeddings precalculados, implementa funciones Python y prueba una aplicación Flask. Requiere suscripción de con permisos, , versión actual de la CLI de y Python 3.12 o posterior.
Configurar proyecto y script inicial.
Aprovisionar cuenta y contenedor vectorial.
Crear funciones VectorDistance parametrizadas.
Cargar incidencias y validar coincidencias.
Probar el flujo mediante Flask.
Revisión de la evaluación
text-embedding-ada-002: float32, 1536 dimensiones y coseno.
Reducir TOP de 100 a 10–20 resultados.
Filtrar category en WHERE y pasar partition_key.
Combinar VectorDistance y FullTextScore con ORDER BY RANK RRF.
Usar un desencadenador de para actualizar sin sondeo.