M2 — Retrieval + embed CPU verificado (pyme-rag-fusion)

Fecha: 2026-09-27 Estado: M2 verificado en local (docker compose). No subido a OCI.

Qué se integró

  • Embed CPU: fastembed MiniLM multilingüe (ONNX, 384d). Corre en CPU sin servidor.
  • Retrieval: FAISS (coseno) + BM25 + fusión RRF. Multi-tenant (un dir por cliente).
  • Reranker CPU: BAAI/bge-reranker-base vía ONNX Runtime (onnxruntime + tokenizers), sin torch. Reordena el top-24 del RRF al top-k.

Verificación (local)

PruebaResultado
GET /health{"ok":true}
POST /ingest (PDF real)11 chunks indexados
POST /ask (retrieval)6 sources con score
eval/harness.pyhit@6 = 100%, MRR = 1.000

Notas técnicas

  • fastembed 0.8.1 NO tiene CrossEncoder → el reranker usa onnxruntime + tokenizers directamente con el ONNX de BAAI/bge-reranker-base (ligero, sin torch).
  • El score que devuelve /ask es el RRF (el reranker reordena pero no re-escala el score). Aceptable para M2; en M4 se combina con citation accuracy.
  • Bug corregido en M1: closing(Path) → Path (el reranker multi-hilo de FastAPI exigía quitar el with closing()).

Pendiente (M3-M5)

  • M3: LLM con cadena ZeroGPU → Groq → local.
  • M4: eval combinada (citation accuracy + escalate + RAGAS + coste).
  • M5: infra OCI (Ampere A1) + despliegue.