Skip to content

Commit e3e4fd8

Browse files
juandmg020407echeguategiulianpeter
committed
fix(chat): vuelve a llama3.2:3b por defecto + prompt anti-alucinación
llama3.2:1b filtraba el schema del tool en el texto e inventaba datos ("Ruta 101: Centro-Playa" cuando no existían en la DB), en lugar de invocar las herramientas. Inaceptable para un jurado: si pregunta por la ruta inventada y descubre que no existe, hunde la nota. Cambios: 1. docker-compose.yml: OLLAMA_MODEL pasa de llama3.2:1b a llama3.2:3b. Sigue cabiendo en 2 GB de RAM, sigue siendo 100% local sin GPU, pero invoca tool_calls como Ollama espera. El 1b queda descargado por ollama-pull como alternativa rápida si alguien quiere experimentar. 2. system-prompt.ts: bloque "PROHIBIDO INVENTAR DATOS" que prohíbe fabricar pedidos/rutas/conductores y obliga a llamar a la herramienta correspondiente; si está vacío, decir que está vacío en lugar de inventar. 3. README.md: badge, tablas, tiempos esperados (15-30s/iter) y guía de modelos actualizadas al default 3b. Aviso de "para acelerar" ya no apunta al 1b (que sabemos que falla) sino al 8b para quien tenga GPU. Co-authored-by: Samuel Parra <parrasamuel453@gmail.com> Co-authored-by: Giulian Peterlecean <giulian.peterlecean@gmail.com>
1 parent d11a59a commit e3e4fd8

3 files changed

Lines changed: 23 additions & 15 deletions

File tree

README.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
[![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
66
[![FastAPI](https://img.shields.io/badge/FastAPI-009688?logo=fastapi&logoColor=white)](https://fastapi.tiangolo.com/)
77
[![Next.js 14](https://img.shields.io/badge/Next.js-14-black?logo=next.js)](https://nextjs.org)
8-
[![Ollama llama3.2](https://img.shields.io/badge/Ollama-llama3.2:1b-1a531a?logo=ollama)](https://ollama.com)
8+
[![Ollama llama3.2](https://img.shields.io/badge/Ollama-llama3.2:3b-1a531a?logo=ollama)](https://ollama.com)
99
[![Hackathon](https://img.shields.io/badge/Hackathon-IA_Responsable_y_Abierta-000000?logo=github)](https://github.com/ComunidadIA-OS)
1010

1111
---
@@ -27,7 +27,7 @@ OpenRoute presenta un **único producto al usuario**: el frontend conversacional
2727
| **Frontend conversacional (`web/`)** | Next.js 14 + chatbot Ollama + mapa Leaflet + Prisma/SQLite. UI única que ven los usuarios. | `cd web && npm run dev` (puerto 3000) | Siempre. Es la cara del producto. |
2828
| **Microservicio FastAPI (`app/`)** | Wrapper HTTP sobre el motor VRP de Python (`src/`). Expone `/optimize`, `/baseline`, `/compare`. | `uvicorn app.main:app --port 8000` | Cuando el chatbot llama al tool `optimize_with_ortools`. |
2929
| **Motor Python (`src/`)** | Solver VRP dual: heurística propia (K-Means + VMC) + Google OR-Tools (CVRPTW). Procesador de datos, simulador baseline manual y asistente IA con Ollama. | Llamado por el FastAPI internamente | Cuando se pide optimización industrial con time windows y capacidades. |
30-
| **Ollama local** | LLM `llama3.2:1b` con tool calling (configurable vía `OLLAMA_MODEL`). Mismo modelo para el chatbot del frontend y para los informes explicativos del motor Python. | `ollama serve` (puerto 11434) | Continuamente mientras el chatbot está en uso. |
30+
| **Ollama local** | LLM `llama3.2:3b` con tool calling (configurable vía `OLLAMA_MODEL`). Mismo modelo para el chatbot del frontend y para los informes explicativos del motor Python. | `ollama serve` (puerto 11434) | Continuamente mientras el chatbot está en uso. |
3131

3232
**Flujo típico:**
3333

@@ -62,7 +62,7 @@ Ver [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) para el detalle técnico.
6262
* [Prisma](https://www.prisma.io/) + SQLite (cambio a Postgres con una variable de entorno).
6363
* [Leaflet](https://leafletjs.com/) + [OpenStreetMap](https://www.openstreetmap.org/) + [OSRM](https://project-osrm.org/) público para mapa y TSP rápido.
6464
* [Nominatim](https://nominatim.openstreetmap.org/) de OSM para geocoding con caché persistente.
65-
* [Ollama](https://ollama.com/) con `llama3.2:1b` por defecto (configurable, soporta `llama3.2:3b` y `llama3.1:8b` para entornos con más recursos). Tool calling nativo.
65+
* [Ollama](https://ollama.com/) con `llama3.2:3b` por defecto (configurable vía `OLLAMA_MODEL`, soporta `llama3.1:8b` para entornos con GPU o más CPU). Tool calling nativo y fiable. El 3b llama a las herramientas correctamente sin alucinar datos como hacen modelos más pequeños.
6666
* JWT en cookie `httpOnly` para auth.
6767

6868
### Backend de optimización (`app/` + `src/`)
@@ -102,7 +102,7 @@ docker compose up --build
102102
**El primer arranque tarda 10-20 minutos**:
103103
1. Pull de imágenes base (`python:3.12-slim`, `node:20-alpine`, `ollama/ollama`): ~3 min.
104104
2. Build de las imágenes del motor y el frontend: ~4 min (el seed de la DB ocurre durante el build).
105-
3. El servicio `ollama-pull` descarga `llama3.2:1b` (~1.3 GB) y `llama3.2:3b` (~2 GB) como reserva: ~5-10 min según la red.
105+
3. El servicio `ollama-pull` descarga `llama3.2:3b` (~2 GB, modelo activo por defecto) y `llama3.2:1b` (~1.3 GB) como alternativa rápida: ~5-10 min según la red.
106106

107107
Mientras se descarga el modelo el frontend está accesible, pero el chat dará error hasta que termine.
108108

@@ -116,15 +116,15 @@ Cuando aparezca `[ollama-pull] Modelos listos. Saliendo.`, ya está. Verifica co
116116

117117
```bash
118118
docker compose ps # los 3 servicios en (healthy)
119-
docker exec openroute-ollama ollama list # debe listar llama3.2:1b
119+
docker exec openroute-ollama ollama list # debe listar llama3.2:3b (y opcionalmente llama3.2:1b)
120120
```
121121

122122
Tras eso:
123123
- Frontend: <http://localhost:3000> (login `admin / admin123`).
124124
- API del motor: <http://localhost:8000/docs>.
125125
- Ollama: <http://localhost:11434>.
126126

127-
> **Sobre el chatbot**: corre 100% local sin GPU. La primera respuesta tarda 10-30 s (carga del modelo en RAM); las siguientes son de 5-15 s. Es deliberadotodo el procesamiento de los datos del cliente ocurre dentro de tu máquina, no se envía nada a la nube. Si quieres velocidad de pruebas, cambia `OLLAMA_MODEL` a `llama3.2:3b` en [`docker-compose.yml`](docker-compose.yml) (más capaz, también más lento).
127+
> **Sobre el chatbot**: corre 100% local sin GPU. La primera respuesta tras inactividad larga tarda 30-60 s (carga del modelo de 2 GB en RAM); las siguientes son de 15-30 s por iteración. **Es deliberado**: todo el procesamiento de los datos del cliente ocurre dentro de tu máquina, no se envía nada a la nube. Eso es lo que defendemos como IA responsable. Si dispones de GPU o más CPU, cambia `OLLAMA_MODEL` a `llama3.1:8b` en [`docker-compose.yml`](docker-compose.yml) (más capaz, también más lento sin acelerador).
128128
129129
Comandos útiles:
130130

@@ -148,8 +148,8 @@ cd OpenRoute
148148
### 2A. Ollama (LLM local) — Terminal 1
149149

150150
```bash
151-
# Descargar el modelo (una sola vez, ~1.3 GB)
152-
ollama pull llama3.2:1b
151+
# Descargar el modelo (una sola vez, ~2 GB)
152+
ollama pull llama3.2:3b
153153

154154
# En Windows ya arranca como servicio. En macOS/Linux:
155155
ollama serve
@@ -193,7 +193,7 @@ python src/test_run.py
193193

194194
### 2C. Frontend conversacional (`web/`) — Terminal 3
195195

196-
Requisitos: **Node.js 20+**, **[Ollama](https://ollama.com/download)** ya arrancado en el paso 2A (con `llama3.2:1b` descargado), conexión a internet (para OSRM y Nominatim públicos).
196+
Requisitos: **Node.js 20+**, **[Ollama](https://ollama.com/download)** ya arrancado en el paso 2A (con `llama3.2:3b` descargado), conexión a internet (para OSRM y Nominatim públicos).
197197

198198
```bash
199199
# Configurar la app (no hace falta volver a `ollama pull`, ya lo hiciste en 2A)

docker-compose.yml

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,15 @@ services:
125125
# Los nombres de servicio funcionan como hostname dentro de la red
126126
# de Docker; no son URLs públicas.
127127
OLLAMA_BASE_URL: "http://ollama:11434"
128-
# llama3.2:1b por defecto: 1.3 GB en RAM, respuesta en CPU 5-15s por
129-
# iteración (vs 30-90s del 3b). Tool calling algo menos fiable; el
130-
# runner del chat ya tolera errores de formato típicos del modelo.
131-
# Si tienes más CPU/RAM, cambia a 'llama3.2:3b' o 'llama3.1:8b' aquí
132-
# y reinicia el servicio web (ambos se descargan en ollama-pull).
133-
OLLAMA_MODEL: "llama3.2:1b"
128+
# llama3.2:3b: 2 GB en RAM, respuesta en CPU 15-30s por iteración.
129+
# Probamos llama3.2:1b para acelerar la demo, pero el modelo
130+
# pequeño inventa rutas y filtra el schema del tool en el texto en
131+
# lugar de invocar las herramientas — inaceptable para un jurado.
132+
# 3b cumple el protocolo de tool calling de Ollama de forma fiable
133+
# y mantiene tool calling nativo. Si tienes GPU o más CPU, sube a
134+
# 'llama3.1:8b' (ya descargado por ollama-pull); con CPU pelada,
135+
# 3b es el punto dulce calidad/velocidad.
136+
OLLAMA_MODEL: "llama3.2:3b"
134137
OPTIMIZER_BASE_URL: "http://optimizer:8000"
135138
OSRM_BASE_URL: "https://router.project-osrm.org"
136139
NOMINATIM_BASE_URL: "https://nominatim.openstreetmap.org"

web/src/lib/chat/system-prompt.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ INVOCACIÓN DE HERRAMIENTAS (CRÍTICO):
2525
- NUNCA respondas al usuario con un JSON como {"function": "report_incident", ...}. Eso significa que has fallado en usar la herramienta correctamente — vuelve a intentar usando tool_calls.
2626
- Tras ejecutar la herramienta y recibir su resultado, redacta la respuesta al usuario en LENGUAJE NATURAL en español, resumiendo lo que ha pasado. Nunca repitas el JSON crudo.
2727
28+
PROHIBIDO INVENTAR DATOS (CRÍTICO PARA IA RESPONSABLE):
29+
- NO inventes pedidos, rutas, conductores ni furgonetas. Si necesitas datos, LLAMA A LA HERRAMIENTA correspondiente (list_orders, list_routes, list_drivers, list_vehicles, suggest_routes).
30+
- Si el usuario pide "rutas para hoy" o similar y la herramienta devuelve lista vacía, di literalmente que no hay rutas — NO inventes nombres como "Ruta 101: Centro-Playa".
31+
- Si no estás seguro de un valor, pregunta al usuario en lugar de fabricarlo. Inventar datos rompe la confianza del operador y es contrario a los principios de IA responsable del proyecto.
32+
2833
CONTEXTO:
2934
- El depósito está en Alicante centro (Avenida Aguilera, 38.346, -0.4907).
3035
- Sectores: "centro" (Centro/Carolinas/Benalúa/Florida), "playa" (Playa San Juan/Albufereta), "norte" (Garbinet/San Blas).

0 commit comments

Comments
 (0)