Módulo 1: Por qué Vector Databases para AI Engineers
Cuándo SÍ necesitas vector database
Descripción de la cápsula
Has visto las limitaciones de SQL, NoSQL y numpy. Ahora la pregunta crítica: ¿Cuándo SÍ necesitas una vector database?
Esta cápsula te da criterios claros y cuantitativos para decidir. No es "siempre usa vector DB" ni "nunca uses numpy". Es: "SI cumples estos 4 criterios, vector DB es necesaria. Si no, alternatives pueden ser suficientes."
Al final de esta cápsula, podrás evaluar tu proyecto RAG en 5 minutos y decidir si necesitas vector DB o no.
Los 4 criterios de decisión
Criterio 1: Scale (# de vectores)
Regla simple:
<1K vectores: numpy suficiente (prototipo)
1K-10K vectores: numpy aceptable (desarrollo)
10K-100K: zona gris (evaluar latency)
>100K vectores: vector DB necesaria (producción)
Por qué 100K es el punto de inflexión:
- numpy con 100K: ~150ms latency (límite aceptable)
- numpy con 500K: ~750ms latency (inutilizable para RAG)
- ChromaDB con 100K: ~8ms (excelente)
- ChromaDB con 500K: ~12ms (excelente)
Cálculo rápido:
# Estima # de vectores en tu proyecto
docs = 50_000 # documentos
chunks_per_doc = 3 # promedio de chunks por doc
total_vectors = docs * chunks_per_doc
print(f"Total vectores: {total_vectors:,}")
# Output: Total vectores: 150,000
# Decisión:
if total_vectors > 100_000:
print("→ Vector DB necesaria")
else:
print("→ numpy puede ser suficiente (evaluar latency)")
Criterio 2: Latency (<500ms retrieval)
Regla simple:
Latency requirement | Opción
----------------------|-------------------
Sin requisito | numpy (batch processing)
<5s | numpy/SQL pueden servir
<1s | Zona gris (evaluar)
<500ms | Vector DB necesaria
<100ms | Vector DB obligatoria
Por qué <500ms es crítico:
RAG total latency:
Query embedding: 200ms (OpenAI API)
Retrieval: ???ms (búsqueda en vectores)
Generation: 2,500ms (GPT-4)
-----------------------------------
Total: 2,700ms + retrieval
Para cumplir <3s total:
- Retrieval debe ser: 3000ms - 2700ms = <300ms
- Idealmente <100ms (buffer para variabilidad)
Benchmark tu setup:
import numpy as np
import time
# Tu database actual
embeddings = np.load('your_embeddings.npy') # Shape: (n_vectors, 1536)
query = np.random.randn(1536)
# Medir latency
start = time.time()
similarities = np.dot(embeddings, query)
top_5 = np.argsort(similarities)[-5:][::-1]
latency_ms = (time.time() - start) * 1000
print(f"Retrieval latency: {latency_ms:.1f}ms")
# Decisión:
if latency_ms > 500:
print("→ Vector DB necesaria (numpy muy lento)")
elif latency_ms > 100:
print("→ Zona gris (vector DB recomendada si crecerá)")
else:
print("→ numpy suficiente (por ahora)")
Criterio 3: Persistencia (storage duradero)
Regla simple:
Tipo de deployment | Persistencia | Opción
----------------------|--------------|------------------
Jupyter notebook | No crítica | numpy en memoria
Script one-off | No crítica | numpy + .npy save
Servicio con uptime | Crítica | Vector DB necesaria
API production | Crítica | Vector DB obligatoria
Por qué persistencia importa:
Sin persistencia robusta (numpy):
- Reinicio/crash = pérdida de datos O recarga de 30-60s
- Deployment = downtime de 30-60s (recargar embeddings)
- Corruption risk (proceso interrumpido durante
.save())
Con persistencia (Vector DB):
- Reinicio/crash = reconexión <1ms (índice persiste)
- Deployment = zero downtime (índice ya en disk)
- ACID transactions (no corruption)
Evaluación:
¿Tu servicio necesita uptime 99%+?
├─ SÍ → Vector DB necesaria
└─ NO → numpy puede servir
¿Toleras 30-60s downtime en cada deploy?
├─ SÍ → numpy puede servir
└─ NO → Vector DB necesaria
¿Tienes >10K vectores que tardan horas en generar?
├─ SÍ → Vector DB necesaria (no quieres perder trabajo)
└─ NO → numpy puede servir (re-generar es rápido)
Criterio 4: Concurrencia (múltiples usuarios)
Regla simple:
# de usuarios concurrentes | Opción
---------------------------|-------------------
1 usuario (desarrollo) | numpy suficiente
2-10 usuarios | Zona gris
>10 usuarios concurrentes | Vector DB necesaria
>100 usuarios | Vector DB obligatoria
Por qué concurrencia importa:
numpy no es thread-safe para writes:
import numpy as np
from threading import Thread
embeddings = np.load('embeddings.npy')
# ❌ Race condition: múltiples usuarios agregando docs
def add_doc(user_id, doc_embedding):
global embeddings
embeddings = np.vstack([embeddings, doc_embedding]) # ❌ Not thread-safe
np.save('embeddings.npy', embeddings) # ❌ Corruption risk
# Múltiples requests concurrentes
threads = [Thread(target=add_doc, args=(i, emb)) for i, emb in enumerate(new_docs)]
for t in threads: t.start()
Vector DB thread-safe:
import chromadb
client = chromadb.PersistentClient(path="./chroma_db")
collection = client.get_collection("docs")
# ✅ Thread-safe: múltiples usuarios pueden add concurrentemente
def add_doc(user_id, doc_embedding, doc_id):
collection.add(embeddings=[doc_embedding], ids=[doc_id]) # ✅ Safe
# Múltiples requests concurrentes → Sin problemas
Evaluación:
¿Cuántos usuarios usarán tu sistema simultáneamente?
├─ 1-2 (desarrollo/demo) → numpy suficiente
├─ 3-10 (equipo pequeño) → numpy con locks (complicado) O vector DB (simple)
└─ >10 (production) → Vector DB necesaria
¿Necesitas agregar/actualizar docs mientras otros consultan?
├─ SÍ → Vector DB necesaria (maneja read/write concurrentemente)
└─ NO → numpy puede servir (read-only)
Matriz de decisión completa
Combina los 4 criterios
| Scale | Latency | Persistencia | Concurrencia | Decisión |
|---|---|---|---|---|
| <10K | >1s | No crítica | 1 usuario | ✅ numpy suficiente |
| <10K | <500ms | No crítica | 1-5 usuarios | ⚠️ numpy/SQL (zona gris) |
| 10K-100K | <500ms | Crítica | >5 usuarios | ⚠️ Vector DB recomendada |
| >100K | <500ms | Crítica | >10 usuarios | ✅ Vector DB necesaria |
| >500K | <100ms | Crítica | >50 usuarios | ✅ Vector DB obligatoria |
Casos de uso: Cuándo SÍ necesitas
Caso 1: Chatbot de soporte técnico (empresa)
Requisitos:
- 500,000 artículos de documentación (1.5M chunks)
- 1,000 empleados usando simultáneamente
- <3s respuesta total (<500ms retrieval)
- Uptime 99.9% (24/7)
Evaluación:
- Scale: 1.5M vectores → ✅ Vector DB necesaria
- Latency: <500ms → ✅ Vector DB necesaria
- Persistencia: 99.9% uptime → ✅ Vector DB necesaria
- Concurrencia: 1,000 usuarios → ✅ Vector DB necesaria
Decisión: ✅ Vector DB necesaria (4/4 criterios cumplidos)
Recomendación:
- Development: ChromaDB local (gratis, rápido)
- Production: Pinecone managed ($200-500/mes) o ChromaDB self-hosted en server robusto
Caso 2: Q&A sobre documentos legales (startup)
Requisitos:
- 50,000 documentos legales (150K chunks)
- 50 abogados internos usando
- <2s respuesta total (<300ms retrieval)
- Uptime 99% (horario laboral)
Evaluación:
- Scale: 150K vectores → ✅ Vector DB recomendada
- Latency: <300ms → ✅ Vector DB recomendada
- Persistencia: 99% uptime → ✅ Vector DB recomendada
- Concurrencia: 50 usuarios → ✅ Vector DB recomendada
Decisión: ✅ Vector DB recomendada (4/4 criterios)
Recomendación:
- ChromaDB self-hosted (gratis, suficiente para 150K vectores)
- O Pinecone ($70-150/mes) si prefieren managed
Caso 3: Sistema RAG multi-tenant (SaaS)
Requisitos:
- 100 clientes, cada uno con 10K-50K documentos
- Total: 1M-5M vectores (aggregado)
- <100ms retrieval (competitivo)
- Multi-tenancy (aislamiento de datos por cliente)
- Uptime 99.99% (SLA contractual)
Evaluación:
- Scale: 1M-5M vectores → ✅ Vector DB obligatoria
- Latency: <100ms → ✅ Vector DB obligatoria
- Persistencia: 99.99% uptime → ✅ Vector DB obligatoria
- Concurrencia: 100s-1000s usuarios → ✅ Vector DB obligatoria
- Plus: Multi-tenancy → ✅ Vector DB con feature nativa
Decisión: ✅ Vector DB obligatoria + managed preferred
Recomendación:
- Pinecone managed ($500-2000/mes) - mejor opción para multi-tenant SaaS
- O Weaviate Cloud ($300-1000/mes) - flexible, GraphQL API
- NO ChromaDB self-hosted (requiere manejo de multi-tenancy manual)
Caso 4: Research paper search (personal)
Requisitos:
- 100,000 papers científicos (300K chunks)
- 1 usuario (investigador)
- <1s retrieval (análisis exploratorio)
- Local en laptop (privacidad)
Evaluación:
- Scale: 300K vectores → ⚠️ Zona gris (numpy tarda ~500ms)
- Latency: <1s → ⚠️ numpy podría servir (~500ms aceptable para exploración)
- Persistencia: Local laptop → ⚠️ No crítica (tolerás reload)
- Concurrencia: 1 usuario → ✅ numpy suficiente
Decisión: ⚠️ Zona gris (2/4 criterios no favorecen vector DB)
Opciones:
-
numpy + pgvector (Postgres local):
- Setup moderado (install Postgres + pgvector)
- 50-80ms retrieval (suficiente para exploración)
- Persistencia mejor que numpy raw
-
ChromaDB local:
- pip install chromadb (simple)
- 15-30ms retrieval (excelente)
- Persistencia nativa
-
numpy raw:
- pip install numpy (más simple)
- 500ms retrieval (aceptable para 1 usuario explorando)
- Sin persistencia (recarga 60s después de reinicio)
Recomendación: ChromaDB local (mejor balance simplicidad/performance)
Señales claras de que necesitas vector DB
SI respondes "SÍ" a 3+ de estas:
- ✅ Tienes >100K vectores (o crecerás a eso)
- ✅ Necesitas <500ms retrieval latency
- ✅ Necesitas uptime >99% (production service)
- ✅ Tienes >10 usuarios concurrentes
- ✅ Necesitas metadata filtering (categoría, fecha, autor)
- ✅ Necesitas agregar/actualizar docs dinámicamente
- ✅ Necesitas backup/restore robusto
- ✅ Necesitas monitoring (latency, throughput, usage)
→ Vector DB es necesaria
SI respondes "NO" a todas:
- Solo tienes <1K vectores
- No importa latency (batch processing)
- No necesitas uptime (script one-off)
- 1 solo usuario (desarrollo)
- No necesitas features avanzadas
- No agregarás docs dinámicamente
- No necesitas backup/monitoring
→ numpy es suficiente
Resumen
Lo que aprendiste:
- ✅ Criterio 1: Scale - >100K vectores → vector DB necesaria
- ✅ Criterio 2: Latency - <500ms → vector DB recomendada, <100ms → obligatoria
- ✅ Criterio 3: Persistencia - uptime >99% → vector DB necesaria
- ✅ Criterio 4: Concurrencia - >10 usuarios → vector DB necesaria
- ✅ Matriz de decisión - Combina criterios para decidir
Casos típicos:
- Production RAG (empresa): 4/4 criterios → Vector DB necesaria
- Prototipo/MVP: 0-1/4 criterios → numpy suficiente
- Zona gris: 2/4 criterios → Evaluar trade-offs (simplicidad vs performance)
Por qué importa:
- No sobre-ingenierizar: Si numpy cumple requisitos, úsalo (simplicidad)
- No sub-ingenierizar: Si necesitas vector DB, no pierdas tiempo con numpy (performance)
- Decisión informada = tiempo ahorrado
Siguiente cápsula: Ahora que sabes cuándo SÍ necesitas vector DB, verás cuándo NO (casos donde alternatives son mejores).
Recursos adicionales
- Choosing a Vector Database - Decision framework
- ChromaDB vs Pinecone - Self-hosted vs managed
- RAG at Scale - Production considerations
- Vector DB Benchmarks - Performance comparisons
- Multi-tenant RAG - SaaS use case
- Vector Database Comparison - Landscape overview
Tiempo de lectura: 6-8 minutos
Siguiente: 06-cuando-no-necesitas-vector-database.md