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.