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:

  1. Doc 1 (0.98)
  2. Doc 2 (0.95) — ✅ Encontrado aunque NO contiene "perro"
  3. 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.