Crear almacenes de documentos de IA con Azure Cosmos DB for NoSQL
Volver a la ruta AI-200
AI-200Capítulo 9

Preparación para la Certificación Microsoft AI-200

Crear almacenes de documentos de IA con Azure Cosmos DB for NoSQL

Diseña particiones y rendimiento, conéctate de forma segura con el SDK de Python, implementa CRUD y concurrencia optimista y escribe consultas SQL eficientes para recomendación y RAG.

Tiempo de estudio sugerido: 95 minutos • Nivel intermedio • Reescritura original completa con versión resumida de cada tema, evaluación comentada y laboratorio RAG guiado

Escudo neón Microsoft Certified AI-200 con símbolos de IA, base de datos, consultas, desarrollo en la nube y seguridad

1. Relacionar un almacén flexible con el patrón de acceso de IA

Los motores de recomendaciones y las soluciones de generación aumentada por recuperación suelen guardar catálogos, preferencias, interacciones, salidas de modelos y fragmentos de documentos como . for combina esquema flexible, indexación automática, distribución global y rendimiento escalable con independencia del almacenamiento.

El diseño sigue dependiendo de los accesos. Hay que organizar cuentas, bases de datos, contenedores y elementos; elegir una clave de partición que reparta la carga; decidir entre rendimiento manual y escalado automático; autenticar con seguridad; y preferir lecturas puntuales o consultas dirigidas. La indexación predeterminada cubre las propiedades, aunque algunos ORDER BY necesitan índices compuestos.

  • Explicar la jerarquía y sus límites de configuración.
  • Implementar acceso seguro mediante y operaciones .
  • Elegir lectura puntual o consulta según identificadores y filtros.
  • Crear consultas similares a SQL con proyección, filtro, ordenación, agregación y control de RU.

Resumen del tema

Parte de las lecturas y escrituras de la carga de IA y alinea modelo, particiones, rendimiento, autenticación y consultas.

2. Navegar por cuenta, base de datos, contenedor y elemento

La cuenta de es el límite superior de administración y aporta un exclusivo a y . Allí se configuran consistencia predeterminada, red y regiones replicadas. Cuentas separadas pueden aislar producción, preproducción y desarrollo.

Las bases de datos son espacios de nombres para contenedores relacionados y pueden compartir rendimiento. Los contenedores guardan elementos y son el principal límite de escalabilidad: definen la clave de partición y admiten documentos con estructuras diferentes. Los elementos son los registros de la aplicación.

Una cuenta de Azure Cosmos DB contiene bases de datos, contenedores, particiones lógicas y elementos JSON usados por una aplicación de IA.
La configuración desciende desde la cuenta a los contenedores y los elementos transportan los datos.

Resumen del tema

La cuenta entrega y opciones globales, las bases agrupan, los contenedores particionan y escalan, y los elementos almacenan .

3. Seleccionar una clave de partición para distribución y consultas

La ruta de clave señala una propiedad y cada valor forma una partición lógica. El servicio aplica y asigna esas particiones a particiones físicas administradas. id y el valor de clave identifican el elemento. Como la clave del contenedor no cambia en el lugar, la decisión requiere análisis previo.

  • Elige una propiedad estable presente en todos los elementos.
  • Prefiere cardinalidad alta y distribución uniforme de almacenamiento y RU.
  • Alinea la clave con filtros de igualdad y lecturas puntuales frecuentes.
  • Usa userId o tenantId cuando la actividad se agrupe naturalmente.
  • Evita booleanos, categorías sesgadas o fechas que creen particiones activas.

Un catálogo puede utilizar categoryId si las categorías están equilibradas; los registros suelen aprovechar userId. Se admiten rutas anidadas como //region. Para cambiar la clave, crea otro contenedor y migra o copia los datos.

Resumen del tema

Una buena clave es inmutable, de alta cardinalidad, distribuye el uso y aparece en las operaciones dominantes.

4. Aprovisionar rendimiento manual o escalado automático en RU/s

Las Unidades de solicitud normalizan CPU, memoria y E/S de lecturas, escrituras, consultas y procedimientos. El rendimiento se expresa en RU/s. El rendimiento de contenedor reserva capacidad; el de base de datos la comparte entre contenedores con picos distintos.

Opciones de rendimiento.
ModoComportamientoCuándo usar
ManualConserva RU/s fijas; un contenedor dedicado comienza en 400 RU/s.Demanda predecible.
Escalado automáticoOscila entre el 10% del máximo y ese máximo; el máximo inicial es al menos 1.000 RU/s.Inferencia, promociones o ingesta con picos.
Compartido en la baseReparte un grupo entre varios contenedores.Los usos son complementarios.
La clave distribuye particiones lógicas sobre particiones físicas mientras se supervisan RU por segundo y particiones activas.
Las claves equilibradas permiten escalar almacenamiento y rendimiento sin concentrar solicitudes.

Resumen del tema

Elige alcance y modo por variación, aislamiento y coste; supervisa limitación 429 y particiones activas.

5. Comprender elementos, propiedades del sistema, índices y coste

Cada elemento incluye id, único dentro de su partición lógica. id más clave identifica el registro. El servicio agrega _rid para identidad interna, _self para , _etag para concurrencia optimista, _ts para la última modificación Unix y la ruta heredada _attachments.

La indexación automática facilita consultas, pero incrementa las escrituras. Tamaño, propiedades, política de índice, consistencia, filtros, ordenación, agregación, proyección y cantidad de particiones influyen en RU. Una lectura puntual de 1 KB cuesta aproximadamente 1 RU; una agregación entre particiones puede costar mucho más. Lee x-ms--charge y utiliza o Cosmos DB insights.

Resumen del tema

Usa id y con intención y mide la carga de RU en vez de estimarla.

6. Conectarse con el y elegir autenticación de producción

Hay oficiales para .NET, Python, JavaScript, Java y Go. CosmosClient administra conexiones, enrutamiento, conmutación por error y actualización de . El paquete -cosmos de Python comparte los conceptos de los demás lenguajes.

Las claves de cuenta son secretos compartidos de amplio acceso. Las claves primaria y secundaria permiten rotación, pero son difíciles de limitar. En producción, prefiere con de privilegio mínimo para usuarios, grupos, entidades de servicio o identidades administradas. Cosmos DB Built-in Data Reader permite lectura y Cosmos DB Built-in Data Contributor lectura/escritura. DefaultAzureCredential usa o localmente e al desplegar.

from azure.cosmos import CosmosClient
from azure.identity import DefaultAzureCredential

endpoint = "https://ai-knowledge.documents.azure.com:443/"
client = CosmosClient(endpoint, credential=DefaultAzureCredential())
database = client.get_database_client("knowledge")
chunks = database.get_container_client("chunks")

Resumen del tema

Crea CosmosClient con el y prefiere con acotado sobre claves distribuidas.

7. Reutilizar clientes y crear recursos de forma idempotente

Mantén un CosmosClient durante la vida de la aplicación. Crearlo por solicitud elimina pools y rutas almacenadas, aumenta la latencia y puede agotar conexiones. En Flask o FastAPI, inicialízalo al arrancar y conserva clientes de base y contenedor.

get_database_client() y get_container_client() devuelven referencias ligeras sin comprobar la red. create_database() y create_container() fallan si el identificador existe; las variantes *_if_not_exists hacen idempotentes el arranque y las pruebas. El contenedor necesita PartitionKey; offer_throughput fija capacidad manual y ThroughputProperties configura escalado automático.

from azure.cosmos import PartitionKey, ThroughputProperties

database = client.create_database_if_not_exists(id="knowledge")
chunks = database.create_container_if_not_exists(
    id="chunks",
    partition_key=PartitionKey(path="/tenantId"),
    offer_throughput=ThroughputProperties(auto_scale_max_throughput=4000)
)

Resumen del tema

Reutiliza un cliente único, reconoce referencias diferidas y elige creación estricta o idempotente con intención.

8. Crear, hacer upsert, reemplazar y proteger la concurrencia

create_item() inserta y devuelve 409 si ya existe el mismo id y clave. upsert_item() inserta o reemplaza, útil para actualizar caché y sincronizar. replace_item() exige un elemento existente y mantiene la ausencia como error.

document = {
    "id": "policy-42-chunk-3",
    "tenantId": "contoso",
    "sourceId": "policy-42",
    "position": 3,
    "text": "Approved retrieval context"
}

chunks.create_item(body=document)       # Fails if the item already exists
chunks.upsert_item(body=document)       # Inserts or replaces
item = chunks.read_item(item=document["id"], partition_key="contoso")
chunks.delete_item(item=document["id"], partition_key="contoso")

_etag cambia con cada modificación. Envía el valor leído mediante if_match; una diferencia genera CosmosAccessConditionFailedError y demuestra que otro proceso actualizó el elemento. Vuelve a leer antes de decidir el reintento.

from azure.cosmos import exceptions

item = chunks.read_item(item="policy-42-chunk-3", partition_key="contoso")
item["reviewed"] = True

try:
    chunks.replace_item(
        item=item["id"],
        body=item,
        if_match=item["_etag"]
    )
except exceptions.CosmosAccessConditionFailedError:
    print("The item changed; read it again before retrying.")

Resumen del tema

Usa create para unicidad, upsert para insertar o reemplazar y replace con _etag contra pérdidas de actualización.

9. Preferir lecturas puntuales y registrar

read_item() ofrece la menor latencia y coste para un documento conocido porque id y clave enrutan directamente. Diseña identificadores para perfiles, inferencias en caché y configuración. Trata CosmosResourceNotFoundError para calcular un fallo de caché, devolver un valor o comunicar ausencia.

delete_item() también requiere id y clave. El elemento deja de ocupar almacenamiento, aunque la eliminación consume RU. Registra x-ms--charge y x-ms-activity-id; el identificador de actividad ayuda a correlacionar errores con soporte de Microsoft.

Resumen del tema

Cuando conozcas id y clave, usa read_item o delete_item y conserva RU y activity ID.

10. Crear consultas SELECT y WHERE sobre

El lenguaje se parece a SQL, pero trabaja en un contenedor y recorre propiedades . FROM presenta el alias, SELECT define la forma y WHERE filtra. Proyecta solo los campos que necesita la IA para reducir respuesta y procesamiento.

  • Usa =, !=, <, >, <= y >= para comparar.
  • Combina con AND, OR y NOT.
  • Aplica CONTAINS, STARTSWITH, ENDSWITH, UPPER y LOWER al texto.
  • Usa BETWEEN para intervalos e IN o NOT IN para conjuntos.
  • La comparación de cadenas distingue mayúsculas de forma predeterminada.

El iterador puede emitir varias solicitudes. SELECT * es cómodo para explorar, pero rara vez es el contrato más eficiente de una .

Resumen del tema

Filtra mediante el lenguaje similar a SQL, proyecta una respuesta deliberada y contempla la ejecución por páginas.

11. Parametrizar valores y enrutar a una partición

No concatenes valores externos al texto. Los parámetros @ separan estructura y datos, evitan inyección y permiten reutilizar planes. Indica partition_key cuando se conoce; un predicado de igualdad también mejora el enrutamiento.

query = """
SELECT c.id, c.sourceId, c.text
FROM c
WHERE c.tenantId = @tenant AND c.sourceId = @source
ORDER BY c.position
"""

parameters = [
    {"name": "@tenant", "value": "contoso"},
    {"name": "@source", "value": "policy-42"}
]

results = chunks.query_items(
    query=query,
    parameters=parameters,
    partition_key="contoso",
    max_item_count=25
)

Una consulta entre particiones se distribuye cuando no puede deducir la clave. Para búsquedas globales, habilita enable_cross_partition_query=True y mide latencia y RU. Subir el rendimiento no corrige una consulta que omite una clave disponible.

Resumen del tema

Parametriza los valores externos y dirige a una partición siempre que el acceso proporcione la clave.

12. Ordenar, paginar, proyectar, agregar y medir consultas

ORDER BY ordena de forma ascendente o descendente y puede requerir un índice adecuado. Para resultados grandes, define max_item_count y recorre páginas; una puede entregar el de continuación opaco. Páginas grandes reducen viajes y páginas pequeñas reducen memoria.

Las proyecciones renombran, calculan y crean o usan VALUE para desenvolver escalares y matrices. COUNT, SUM, AVG, MIN y MAX resumen, pero pueden explorar muchos elementos. ARRAY_CONTAINS comprueba pertenencia; JOIN ... IN aplana matrices.

SELECT VALUE {
  "chunkId": c.id,
  "content": c.text,
  "hasEmbedding": IS_DEFINED(c.embedding)
}
FROM c
WHERE c.tenantId = @tenant

SELECT COUNT(1) AS totalChunks, MAX(c.position) AS lastPosition
FROM c
WHERE c.tenantId = @tenant AND c.sourceId = @source

SELECT c.id, tag
FROM c
JOIN tag IN c.tags
WHERE tag IN ("security", "governance")
  • Filtra pronto y de forma restrictiva.
  • Devuelve solo propiedades usadas.
  • Usa la clave y TOP si es posible.
  • Alinea índices, incluidos compuestos, con patrones medidos.
  • Lee x-ms--charge por página y analiza métricas de consulta e índice.

Resumen del tema

Controla tamaño, ruta, paginación, proyección, agregación, matrices e índices mientras mides el coste real.

13. Laboratorio guiado: crear un almacén RAG

El ejercicio de unos 30 minutos aprovisiona cuenta, base y contenedor de for para documentos fragmentados. Los permiten recuperar contexto antes de fundamentar el modelo de lenguaje. Funciones Python almacenan y consultan fragmentos, y una aplicación Flask prueba el flujo mediante la SQL de Cosmos DB.

  1. Descarga el proyecto inicial y revisa el despliegue.
  2. Despliega cuenta, base, contenedor y particiones.
  3. Implementa funciones Python para almacenar y recuperar.
  4. Consulta contexto y entrégalo a la aplicación RAG.
  5. Prueba Flask y elimina recursos facturables.

Requisitos: suscripción de con permisos, , actual y Python 3.12 o posterior.

Los documentos se dividen con metadatos, se almacenan en Azure Cosmos DB for NoSQL, un servicio Python los recupera y envía contexto a un modelo de lenguaje.
La base es la capa de recuperación; relevancia y particiones determinan la eficiencia del contexto.

Resumen del tema

El laboratorio une esquema, despliegue, de Python, consulta SQL y cliente Flask en un patrón RAG funcional.

14. Decisiones de evaluación y referencias oficiales

Revisión de evaluación.
EscenarioMejor respuestaMotivo
Recuperar registros de un usuarioUsar userId como clave.Alinea la clave con el acceso principal.
La caché puede existir o noUsar upsert_item().Inserta o reemplaza sin lectura previa.
Id y categoría conocidosUsar read_item() con id y clave.La lectura puntual es más eficiente.
Los filtros vienen del usuarioUsar consultas parametrizadas.Evitan inyección y permiten caché del plan.
Consulta de precio costosa con categoryIdAgregar categoryId al WHERE o partition_key.El enrutamiento único evita distribución.
  1. for documentation
  2. resource model
  3. Partitioning and horizontal scaling
  4. units in
  5. started with for and Python
  6. Python resources
  7. Python best practices
  8. Query performance metrics with the Python

Resumen del tema

En el examen, alinea clave y alcance, usa la operación más específica, parametriza y evita distribución innecesaria.