Cursos/RAG avanzado y seguro/Qdrant y permisos

Qdrant multiusuario y permisos

El fallo más peligroso en RAG multiusuario no es responder mal: es recuperar el documento correcto de la persona equivocada. Los permisos deben aplicarse antes de mandar contexto al modelo.

Objetivos de aprendizaje
  • Diseñar payloads para aislar clientes, usuarios y documentos.
  • Aplicar filtros antes de recuperar chunks.
  • Evitar una colección por cliente cuando no hace falta.
En cristiano: payload. Son los metadatos que acompañan a cada vector: cliente, usuario, documento, página, permisos, fecha o tipo de contenido.

Payload mínimo

Terminal
{
  "tenant_id": "cliente_acme",
  "workspace_id": "legal",
  "document_id": "contrato-001",
  "page": 12,
  "visibility": "internal",
  "allowed_roles": ["admin", "legal"],
  "source": "contratos/contrato-001.pdf"
}
Idea clave. Qdrant recomienda normalmente una colección por modelo de embeddings y separar tenants con payload/filtros. Es más manejable que crear cientos de colecciones pequeñas sin necesidad.

Filtro antes de buscar

Terminal
from qdrant_client import QdrantClient, models

client = QdrantClient("http://localhost:6333")

filtro = models.Filter(
    must=[
        models.FieldCondition(
            key="tenant_id",
            match=models.MatchValue(value="cliente_acme"),
        ),
        models.FieldCondition(
            key="allowed_roles",
            match=models.MatchAny(any=["legal"]),
        ),
    ]
)

resultados = client.query_points(
    collection_name="documentos",
    query=[0.01, 0.02, 0.03],
    query_filter=filtro,
    limit=5,
)
Cuidado. No recuperes todo y filtres después en el prompt. Si el texto prohibido llega al modelo, ya perdiste el aislamiento.

Prueba de fuga

Terminal
Caso:
- Usuario A pertenece a cliente_acme
- Usuario B pertenece a cliente_beta
- Ambos tienen una pregunta parecida

Test:
1. Indexa documentos con tenant_id distinto.
2. Pregunta como usuario A.
3. Verifica que ningún chunk de cliente_beta aparece en la traza.
Comprueba que funciona. Antes de producción, crea tests con documentos casi iguales en dos tenants. Si el sistema mezcla resultados, para y corrige filtros.
Guardar y reabrir el proyecto.
Permisos en RAG significan “filtrar antes de recuperar”. El prompt puede reforzar, pero no sustituye al control de acceso.