- 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.
Payload mínimo
{
"tenant_id": "cliente_acme",
"workspace_id": "legal",
"document_id": "contrato-001",
"page": 12,
"visibility": "internal",
"allowed_roles": ["admin", "legal"],
"source": "contratos/contrato-001.pdf"
}Filtro antes de buscar
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,
)Prueba de fuga
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.
Si has guardado la evidencia de esta lección, continúa con «Prompt injection en RAG». Si no, repite la comprobación antes de avanzar.