Asistente virtual para tienda minorista que responde consultas de stock por WhatsApp usando inteligencia artificial 100% local (sin costo de API). El sistema clasifica la intencion del cliente, consulta una base de datos SQLite real y redacta respuestas naturales en español.
Mensaje WhatsApp
|
v
┌─────────────────┐
│ 1. PLANNER │ Clasifica la intencion: consultar_stock,
│ (Ollama LLM) │ pedir_aclaracion, o no_relacionado.
│ │ Extrae: producto, marca, talla, cantidad.
└────────┬────────┘
| JSON: {accion, producto, marca, talla_o_variante...}
v
┌─────────────────┐
│ 2. INVENTARIO │ Consulta SQLite real con 20 productos
│ (SQLite) │ (zapatillas, polos, jeans, medias, etc.)
└────────┬────────┘
| JSON: {encontrado, cantidad_disponible, variantes...}
v
┌─────────────────┐
│ 3. RESPONDER │ Redacta respuesta natural, calida y breve.
│ (Ollama LLM) │ Menciona TIA MARY, ofrece variantes si hay.
└────────┬────────┘
|
v
Respuesta WhatsApp
Las pautas se inyectan automaticamente en los prompts del Planner y Responder en cada consulta, permitiendo mejora continua sin reiniciar el sistema.
| Componente | Version | Descripcion |
|---|---|---|
| Python | 3.10+ | Probado con 3.14 |
| Ollama | v0.30+ | Motor LLM local |
| Modelo | llama3.1:8b | ~4.7 GB, mejor seguimiento de schema JSON (ver src/config.py) |
cd "C:\Users\AXELL\Desktop\TIA MARY"pip install -r requirements.txtDescargar Ollama desde https://ollama.com/download e instalar. Luego descargar el modelo:
ollama pull llama3.1:8bOllama debe estar corriendo en segundo plano (normalmente se inicia automaticamente al instalar). Verificar:
ollama listDebe mostrar llama3.1:8b en la lista.
py main.py initdbEsto crea data/tienda.db y carga 20 productos de prueba desde data/seed_productos.json.
Prueba el pipeline completo desde la terminal:
py main.pyEscribe mensajes como si fueras un cliente y recibe respuestas inmediatas. Ejemplos:
"Tienen zapatillas Nike talla 42?""Busco un polo azul talla M""Venden laptops?""stats"(muestra estadisticas)
py main.py serverInicia Flask en http://0.0.0.0:5000. Endpoints disponibles:
| Endpoint | Metodo | Descripcion |
|---|---|---|
/admin |
GET | Panel de administracion web |
/api/webhook |
POST | Webhook para WhatsApp (recibe {"mensaje": "..."}) |
/api/chat |
POST | Chat de prueba (retorna respuesta + detalles internos) |
/api/feedback |
POST | Registrar feedback sobre una consulta |
/api/pautas |
GET/POST | Listar/crear pautas de mejora |
/api/stats |
GET | Estadisticas del sistema |
/api/contexto-mejora |
GET | Datos para analisis de mejora |
- Averigua la IP de tu PC:
ipconfig(buscaIPv4 Address, ej:192.168.1.45) - Inicia el servidor:
py main.py server - Desde el celular, abre el navegador y ve a
http://192.168.1.45:5000/admin - Usa la seccion "Chat de Prueba" o envia POST a
http://192.168.1.45:5000/api/webhook - Para conectar WhatsApp real: configura el webhook de Twilio/Meta/WhatsApp Business API apuntando a
/api/webhook
py main.py test11 pruebas que validan: base de datos, busqueda de productos, registro de consultas, feedback, pautas y estadisticas.
py -m pytest tests/ -v18 pruebas: 5 del parser JSON, 7 del Planner (clasificacion de intencion), 6 del Responder (generacion de respuestas).
data/tienda.db (SQLite) contiene:
| Categoria | Productos | Marcas | Tallas |
|---|---|---|---|
| Calzado | Zapatillas | Nike, Adidas | 38-42 |
| Ropa | Polos | Lacoste, Tommy Hilfiger | M, L |
| Ropa | Jeans | Levi's | 30-34 |
| Ropa | Casacas | North Face | M |
| Accesorios | Medias | Puma, Adidas | unica |
| Accesorios | Gorras | New Era, Nike | unica |
Casos incluidos a proposito para pruebas:
- Nike talla 38: sin stock (stock=0)
- Levi's talla 30: sin stock (stock=0)
- Gorra Nike: sin stock (stock=0)
- Laptops, tablets: no existen en la BD
Los datos semilla se pueden editar en data/seed_productos.json y recargar con:
del data\tienda.db
py main.py initdbAccede al panel de administracion en http://localhost:5000/admin para:
Todas las consultas de clientes, respuestas enviadas, si el producto fue encontrado o no.
Cada consulta tiene un selector 👍/👎 para marcar si la respuesta fue buena o mala. Esto alimenta las estadisticas y ayuda a identificar patrones de error.
Tres tipos de pautas que se inyectan automaticamente en los prompts:
| Tipo | Aplica a | Ejemplo |
|---|---|---|
planner |
Clasificador | "Cuando el cliente diga 'chompas', clasificalo como 'casaca'" |
responder |
Respuestas | "Siempre menciona el precio cuando haya stock disponible" |
general |
Ambos | "La tienda no vende electronicos, solo ropa y calzado" |
Consultas totales, productos con/sin stock, feedback positivo/negativo, pautas activas.
TIA MARY/
|-- main.py # Punto de entrada (demo, server, test, initdb)
|-- requirements.txt # ollama, pytest, flask
|-- README.md # Este archivo
|
|-- prompts/
| |-- planner_prompt.txt # System prompt del clasificador
| |-- responder_prompt.txt # System prompt del respondedor
|
|-- data/
| |-- tienda.db # Base de datos SQLite (autogenerada)
| |-- seed_productos.json # Datos semilla (20 productos)
|
|-- src/
| |-- config.py # Configuracion central
| |-- ollama_client.py # Cliente Ollama + parser JSON
| |-- database.py # Capa de datos SQLite
| |-- inventario.py # Capa de negocio (consulta stock)
| |-- planner.py # Modulo 1: Clasificador de intencion
| |-- responder.py # Modulo 2: Generador de respuestas
| |-- pipeline.py # Orquestador del flujo completo
| |-- learning.py # Motor de aprendizaje (pautas + feedback)
| |-- api.py # API Flask + dashboard HTML
|
|-- tests/
|-- test_planner.py # Tests del parser JSON + Planner (13 tests)
|-- test_responder.py # Tests del Responder (6 tests)
Ollama no esta corriendo. Inicialo manualmente:
ollama serveO abre la aplicacion Ollama desde el menu de inicio de Windows.
ollama pull llama3.1:8bEl proyecto usa solo caracteres ASCII en los prints. Si ves errores de encoding, asegurate de usar PowerShell o Windows Terminal (no CMD tradicional).
Edita src/config.py y cambia FLASK_PORT = 5000 por otro puerto (ej: 8080).
Uso interno - TIA MARY.