Sistema de Soporte Tecnico con Busqueda Semantica
Plataforma de chat en vivo para soporte tecnico con busqueda semantica (pgvector + embeddings locales), arboles de diagnostico, soluciones guiadas y workflow de escalacion entre 4 roles.
El Reto
Empresas con productos tecnicos complejos (equipos de topografia, drones, GPS, software industrial) reciben tickets repetitivos: 'el GPS no engancha satelites', 'el dron no calibra brujula', 'el software pide una licencia'. El agente de nivel 1 pierde 15-20 minutos buscando manualmente en PDFs, wiki interno y Slack la solucion correcta — y muchas veces escala al experto sin necesidad porque no la encontro.
El reto era construir un workspace de soporte donde el agente, mientras chatea con el cliente, vea sugerencias automaticas de soluciones similares, arboles de diagnostico que ya resolvieron casos parecidos, y secciones especificas de documentacion — todo via busqueda semantica (no keywords) para que 'el GPS no agarra satelite' encuentre la solucion incluso si el documento dice 'el receptor pierde fix'.
Restriccion clave: el cliente queria evitar dependencia de OpenAI/Anthropic para los embeddings — costos imprevisibles, posible bloqueo, datos sensibles saliendo del sistema. La busqueda semantica tenia que correr local con un modelo gratis y suficientemente bueno para el caso de uso.
La Solucion
Plataforma fullstack en Docker Compose con 3 servicios: PostgreSQL 16 + pgvector, backend Flask + Flask-SocketIO con eventlet (single worker para preservar estado de WebSockets), frontend React 18 + TypeScript + Vite. Embeddings locales con sentence-transformers (all-MiniLM-L6-v2, dim=384) — modelo singleton cargado una vez al inicio, latencia <50ms por embedding.
Schema PostgreSQL con 26+ tablas, 16 ENUMs, indices HNSW pgvector en 3 tablas semanticas: secciones_documento (chunks de PDFs subidos), soluciones_escenario (soluciones cataloguadas), arboles_diagnostico (workflows de diagnostico paso a paso). Busqueda hibrida: keyword overlap + similitud coseno semantica, con cast obligatorio %s::vector en queries psycopg2.
Workspace del agente con 3 paneles: cola de tickets (250px), chat (flex), panel de busqueda/diagnostico (380px) con 4 tabs: Busqueda semantica, Sondeo (preguntas guiadas via state machine idle→cargando→pregunta→escenario), Pasos (recorrido del arbol), Escalar (al experto, contexto pre-llenado).
Features Clave
Busqueda Semantica con pgvector + sentence-transformers
Embeddings dimension 384 con modelo all-MiniLM-L6-v2 corriendo local (singleton). Indices HNSW en 3 tablas. Cast obligatorio %s::vector en queries. Buscar 'GPS no agarra' encuentra docs que dicen 'receptor pierde fix' por similitud coseno.
Arboles de Diagnostico Interactivos
Workflows tipo decision tree: agente sigue preguntas, cliente responde, sistema sugiere siguiente paso. State machine idle→cargando→pregunta→escenario. Cada arbol mejora con feedback de cuantas veces resolvio sin escalar.
4 Roles con Vistas Especializadas
Agente (cola + workspace), Experto (escalaciones + documentacion + creacion de arboles), Gerente (dashboard equipo + reportes), Admin (config + usuarios). ProtectedRoute acepta arrays de roles. JWT en localStorage con rehidratacion automatica.
Chat Publico Sin Login para Clientes
Cliente abre widget, deja email + descripcion del problema, recibe ticket TKT-NNNNNN. El chat publico almacena en localStorage 'sst_chat' la sesion (ticket_id, token, prioridad, tiempo de espera estimado). Sin necesidad de cuenta.
SLA y Reapertura Automatica
sla_scheduler.py daemon vigila tiempos de primera respuesta segun prioridad (config: get_config_sistema(sla_alta_primera_respuesta) → minutos). Reapertura dentro de 7 dias revierte feedback positivo de la solucion para no inflar metricas.
Pipeline de Documentos con Chunking
Subir PDF/DOCX/TXT/MD → daemon extrae texto → divide en chunks → genera embeddings → marca listo. Secciones individuales se pueden revisar, editar (PATCH con re-embedding), dividir, fusionar y confirmar antes de exponerlas a busqueda.
Sugerencia Automatica de Crear Arbol
Despues de cada escalacion, daemon thread mide keyword overlap con escalaciones similares (90 dias). Si pasa de un threshold (default 5 similares), notifica a expertos: 'considera crear un arbol de diagnostico para este patron'.
Como se Ve
Workspace del Agente (3 paneles)
Panel izquierdo (cola), panel central (chat con cliente), panel derecho (4 tabs: Busqueda, Sondeo, Pasos, Escalar). Sugerencias semanticas aparecen mientras el agente teclea.
Pipeline de Documentos
Vista del experto: PDF subido → chunks generados → embeddings → revisar/editar/fusionar. Estado por seccion: pendiente, listo, requiere revision.
Dashboard del Gerente
KPIs del equipo: tiempo promedio de resolucion, tasa de escalacion, NPS implicito (% de feedback positivo), top 5 problemas recurrentes. Bricolage Grotesque para numeros grandes, Syne Mono para codigos de ticket.
Arbol de Diagnostico Interactivo
El agente recorre nodos: pregunta → respuesta del cliente → siguiente nodo. Cada nodo registra cuantas veces se uso y cual respuesta lleva al cierre exitoso.
Detalles Tecnicos
| Componente | Tecnologia |
|---|---|
| Frontend | React 18 + TypeScript + Vite (alias @/ → frontend/src/) |
| Backend | Python 3 + Flask + Flask-SocketIO |
| WebSocket | eventlet (single worker, no gevent) |
| Base de datos | PostgreSQL 16 + pgvector (HNSW indexes) |
| Embeddings | sentence-transformers all-MiniLM-L6-v2 (dim=384, local, singleton) |
| ORM | Sin ORM — psycopg2 raw SQL con ThreadedConnectionPool (min=2, max=10) |
| Auth | JWT 8h + timing-safe comparison + rol-based decorators |
| Tipografia | Bricolage Grotesque (display) + Syne (titulos) + DM Sans (body) + Syne Mono (code) |
| Infraestructura | Docker Compose 3 servicios (db / backend / frontend) |
| Pipeline docs | Daemon: extraer_texto → chunks → embeddings → listo |
| Storage | Local o S3 (storage.py abstraido) |
Resultados
26+
Tablas en schema
906
Lineas de schema.sql
3 (secciones, soluciones, arboles)
Indices HNSW pgvector
384 (all-MiniLM-L6-v2)
Dimension de embeddings
4 (agente / experto / gerente / admin)
Roles con vista propia
001-015
Migraciones aplicadas
$0 (modelo local)
Costo de inferencia por query
Servicios relacionados
¿Tu equipo de soporte pierde 20 min buscando la solucion en cada ticket?
Construimos sistemas con busqueda semantica, arboles de diagnostico y workflow de escalacion. Sin pagar OpenAI por embeddings.