Módulo 5: Keyword vs Semantic Search
3. Semantic Search: Búsqueda Vectorial por Significado
Descripción
Semantic search (búsqueda semántica) usa embeddings (vectores) para buscar por significado en lugar de palabras exactas. Encuentra documentos conceptualmente similares aunque usen vocabulario diferente. Es la base de RAG y sistemas modernos de búsqueda.
Cómo funciona semantic search
Algoritmo:
1. Convertir query a embedding (vector 1536D)
Query: "perros domésticos" → [0.23, -0.45, ..., -0.34]
2. Convertir todos los documentos a embeddings (una vez, offline)
Doc 1 → [0.23, -0.45, ..., -0.34]
Doc 2 → [0.25, -0.43, ..., -0.32]
...
3. Calcular similaridad coseno entre query y cada documento
4. Retornar top-K documentos con mayor similaridad
Ejemplo: Semantic search en acción
Query: "perros domésticos"
Query embedding: [0.23, -0.45, ..., -0.34]
Documentos:
Doc 1: "Los perros son animales domésticos leales"
→ Embedding: [0.23, -0.45, ..., -0.34]
→ Similaridad: 0.98 ✅ (casi idéntico)
Doc 2: "El can es un animal de compañía"
→ Embedding: [0.24, -0.44, ..., -0.33]
→ Similaridad: 0.95 ✅ (muy alto, aunque no contiene "perro")
Doc 3: "Los gatos son mascotas independientes"
→ Embedding: [0.25, -0.43, ..., -0.32]
→ Similaridad: 0.85 ✅ (alto, concepto relacionado)
Doc 4: "Los autos tienen ruedas"
→ Embedding: [9.34, 5.21, ..., 7.56]
→ Similaridad: 0.12 ❌ (bajo, no relacionado)
Ranking:
- Doc 1 (0.98)
- Doc 2 (0.95) — ✅ Encontrado aunque NO contiene "perro"
- Doc 3 (0.85) — ✅ Encontrado aunque NO contiene "perro" ni "doméstico"
Ventajas de semantic search
1. Entiende sinónimos:
Query: "perro"
Doc: "El can es leal"
→ ✅ Match (embeddings similares)
2. Entiende conceptos relacionados:
Query: "animales domésticos"
Doc: "Los gatos son mascotas"
→ ✅ Match (conceptos relacionados)
3. Entiende intención:
Query: "cómo mejorar velocidad de mi app"
Doc: "Guía de optimización de performance"
→ ✅ Match (mismo concepto, vocabulario diferente)
4. Robusto a variaciones:
Query: "machine learning"
Doc: "Introducción a ML"
→ ✅ Match (ML = abreviatura)
Limitaciones de semantic search
Limitación 1: No garantiza palabras exactas
Query: "artículo 42"
Doc: "El artículo 41 dice..."
→ Puede tener similaridad alta ❌ (aunque es artículo incorrecto)
Solución: Usar keyword search para exactos, o híbrido.
Limitación 2: Dependencia del modelo
Si el modelo NO fue entrenado con tu dominio:
→ Embeddings pueden ser subóptimos
Solución: Fine-tuning o modelo especializado.
Limitación 3: Costo computacional
Generar embeddings → Requiere API (OpenAI) o modelo local
Costo por query > keyword search
Solución: Cachear embeddings, usar modelos eficientes.
Limitación 4: "Caja negra"
¿Por qué este documento tiene score 0.87?
→ Difícil explicar (vectores son abstractos)
Solución: Keyword search es más explicable.
Comparación directa: Query idéntica
Query: "animales domésticos"
Con keyword search:
Doc 1: "Los perros son animales domésticos"
→ ✅ Contiene "animales" y "domésticos" → Score alto
Doc 2: "El can es leal"
→ ❌ NO contiene "animales" ni "domésticos" → Score 0
Doc 3: "Los gatos son mascotas"
→ ❌ NO contiene "animales" ni "domésticos" → Score 0
Resultado: Solo Doc 1 encontrado.
Con semantic search:
Doc 1: "Los perros son animales domésticos"
→ Embedding similar a query → Similaridad 0.95 ✅
Doc 2: "El can es leal"
→ "can" tiene embedding similar a "perro" → Similaridad 0.82 ✅
Doc 3: "Los gatos son mascotas"
→ "mascotas" es concepto relacionado → Similaridad 0.78 ✅
Resultado: 3 documentos encontrados (Doc 1, 2, 3).
Ventaja de semantic search: Encuentra Doc 2 y Doc 3 aunque NO contengan las palabras exactas.
Flujo técnico (conceptual)
Fase 1: Indexación (offline, una vez):
Para cada documento:
1. Documento → Embedding (via OpenAI API o modelo local)
2. Guardar embedding en vector database (Pinecone, Weaviate)
Fase 2: Búsqueda (online, cada query):
1. Query → Embedding
2. Buscar en vector database (kNN con índice HNSW/IVF)
3. Retornar top-K documentos con mayor coseno
Tecnologías típicas
Modelos de embeddings:
- OpenAI
text-embedding-3-small(1536D) - OpenAI
text-embedding-3-large(3072D) - Sentence-BERT (768D)
- Cohere embeddings (1024D)
Vector databases:
- Pinecone (managed, HNSW)
- Weaviate (open-source, HNSW)
- Qdrant (open-source, HNSW)
- FAISS (library, IVF)
- Milvus (open-source, múltiples índices)
Costo de semantic search
Costo de indexación:
1M documentos × $0.00013/1K tokens (OpenAI ada-002)
Asumiendo promedio 500 tokens/documento
→ 500M tokens total
→ Costo: ~$65 (una vez)
Costo de queries:
Query típica: 10-50 tokens
→ $0.0000013 - $0.0000065 por query con OpenAI
1000 queries/día = $0.0013 - $0.0065/día
Alternativa: Modelo local (Sentence-BERT) → Costo 0 después de setup inicial.
Resumen
Puntos clave:
- Semantic search: Embeddings + coseno
- Ventajas: Sinónimos, conceptos relacionados, intención
- Limitaciones: No garantiza exactas, dependencia del modelo, costo
- Flujo: Indexar docs (offline) → Query embedding → kNN (online)
- Tecnologías: OpenAI, Pinecone, Weaviate, BERT
Próxima cápsula: 04-comparison.md — Keyword vs semantic lado a lado.