🧩 Caso 12: 🧠 Python (LLM) → 🌉 n8n → ⚡ FastAPI RAG + pgvector#
Pipeline RAG (Retrieval-Augmented Generation) a nivel de infraestructura: cada post se convierte en un embedding y se indexa en pgvector; el endpoint /search recupera los posts más parecidos a una consulta por similitud coseno — el paso retrieval que alimentaría a un LLM.
🏗️ Arquitectura del Flujo#
- 📤 Origen —
origin/bot.py: emisor Python (stdliburllib) que reenvía los posts vencidos a n8n. - 🌉 Puente — n8n: guardrails canónicos (fingerprint → circuit breaker → idempotencia → HTTP con reintentos → DLQ).
- 📥 Destino —
dest/main.py: FastAPI que embebe el texto (vector 256d) y lo persiste en pgvector conINSERT ... ON CONFLICT. - 📁 Persistencia — pgvector (PostgreSQL 16 + extensión
vector): búsqueda por operador coseno<=>.
Nota
El embedding es una función hashing determinista (bag-of-words → 256d, L2-normalizada): sin descargar modelos ni claves de API. Es un stand-in reproducible; se sustituye por
sentence-transformerso un endpoint de embeddings sin tocar el resto del flujo.
🚀 Cómo levantarlo#
bash
docker-compose --profile case12 up -d # pgvector + receptor FastAPI| Servicio | Rol | Puerto host |
|---|---|---|
db-pgvector-12 | PostgreSQL 16 + pgvector | interno |
dest-rag-12 | FastAPI RAG + dashboard | 8092 |
- Dashboard del caso (con búsqueda semántica): http://localhost:8092
- Retrieval directo:
curl "http://localhost:8092/search?q=embeddings" - Probar desde el dashboard maestro: http://localhost:8080 → tarjeta CASE-12.
🎯 Objetivos didácticos#
- RAG end-to-end: embed → index → retrieve por similitud coseno.
- pgvector: columnas
vector(N)y el operador de distancia<=>en SQL. - Desacople del modelo: la función de embedding es un punto de extensión aislado.
⚠️ Consideraciones (modelo del laboratorio)#
- Puerto
8092=8080 + 12(regla canónica, ver docs/PORTS.md). - Bind a
127.0.0.1; el receptor validaid/text(→ HTTP 422).
✅ Estado#
Implementado y verificado (build + boot + health + retrieval). Parte del Lote 2 del roadmap v5.0 → v4.6.