DeepSeek Reasoner — Plan Maestro de IA para Map Apps 🧠🗺️
Visión
"Tres apps. Un motor de IA. Cero complejidad para el usuario.
DeepSeek Reasoner es el cerebro invisible que convierte datos brutos en experiencias inteligentes.
El usuario ve simplicidad. Detrás hay razonamiento."
1. La Filosofía: "Invisible AI"
Principio fundamental
┌──────────────────────────────────────────────────┐
│ │
│ LO QUE VE EL USUARIO LO QUE HAY DETRÁS│
│ ═══════════════════ ═════════════════ │
│ │
│ Un número (78/100) ← Modelo multifactorial │
│ Un color (🟢) ← Análisis de tendencia │
│ Una frase ("Llena hoy") ← Predicción de precios │
│ 3 spots recomendados ← Cruce de 8 variables │
│ "Abierta, a 800m" ← Scraping + geospatial │
│ │
│ SENCILLEZ TOTAL INTELIGENCIA TOTAL │
│ │
└──────────────────────────────────────────────────┘
Reglas de diseño
- El usuario NUNCA ve "IA" o "inteligencia artificial" en la UI
- Los datos parecen "datos de siempre" — como si alguien los hubiera metido a mano
- Las recomendaciones parecen "lógica básica" — el usuario no sabe que hay ML detrás
- Los textos descriptivos parecen escritos por un experto humano
- Los scores parecen "un cálculo sencillo" — no un modelo multifactorial
2. DeepSeek Reasoner: Por Qué Este Modelo
Comparativa de modelos para nuestro caso de uso
| Aspecto | GPT-4o | Claude 3.5 | DeepSeek Reasoner | Gemini 1.5 |
|---|---|---|---|---|
| Razonamiento complejo | ✅✅ | ✅✅ | ✅✅✅ | ✅✅ |
| Conocimiento España | ✅✅ | ✅ | ✅✅ | ✅✅ |
| Datos geográficos | ✅✅ | ✅ | ✅✅✅ | ✅✅ |
| Datos de pesca/ríos | ✅ | ✅ | ✅✅ | ✅ |
| Coste por token | $$$$ | $$$ | $ | $$$ |
| JSON estructurado | ✅✅ | ✅✅✅ | ✅✅ | ✅✅ |
| Disponibilidad API | ✅✅✅ | ✅✅ | ✅✅ | ✅✅ |
¿Por qué DeepSeek Reasoner?
- Razonamiento profundo: El modelo "piensa" antes de responder (chain of thought largo)
- Excelente con datos geográficos españoles: Conoce ríos, embalses, pueblos, carreteras
- Coste 10-20x menor que GPT-4o para tareas de seeding masivo
- Genera JSON consistente cuando se le pide bien
- Ya probado: Generó 294 spots + 1.581 asociaciones con 98% de éxito (49/50 zonas)
Configuración actual
const DEEPSEEK_CONFIG = {
url: 'https://api.deepseek.com/v1/chat/completions',
model: 'deepseek-reasoner',
api_key: process.env.DEEPSEEK_API_KEY, // sk-f359...
timeout: 120000, // 2 min per request (el modelo piensa mucho)
max_retries: 2,
temperature: 0.3, // Bajo para datos factuales
};
3. Arquitectura de Seeding con IA
3.1 — Pipeline General
┌──────────────┐
│ PROMPT │
│ TEMPLATE │
└──────┬───────┘
│
┌──────▼───────┐
│ DeepSeek │
│ Reasoner │
│ (API call) │
└──────┬───────┘
│ JSON response
┌──────▼───────┐
│ VALIDATION │
│ LAYER │
│ - Schema │
│ - Coords │
│ - Dedup │
└──────┬───────┘
│ Clean JSON
┌──────▼───────┐
│ SQL │
│ GENERATOR │
└──────┬───────┘
│ .sql file
┌──────▼───────┐
│ D1 │
│ EXECUTE │
└──────────────┘
3.2 — Prompt Engineering Patterns
Patrón 1: "Expert Persona"
Eres un {EXPERT_ROLE} con {YEARS} años de experiencia en España.
- FishMap: "experto en pesca continental española con 30 años"
- FarmaMap: "farmacéutico colegiado con 20 años en Madrid/Barcelona"
- FuelMap: "analista del sector de combustibles español con 15 años"
Patrón 2: "Structured Output"
Genera un JSON array con EXACTAMENTE este schema:
{schema_example}
REGLAS:
- Solo genera el JSON, sin texto adicional
- Coordenadas reales y precisas (5 decimales)
- Solo datos verificables y reales
- Si no estás seguro de un dato, pon null
Patrón 3: "Zone-by-Zone"
Genera datos para la zona "{zone_name}" de España.
Límites: lat {min_lat}-{max_lat}, lng {min_lng}-{max_lng}
Genera entre {min_items}-{max_items} registros.
Patrón 4: "Enrichment"
Dado estos datos existentes:
{existing_data_json}
Enriquece cada registro con:
{enrichment_fields}
Mantén todos los campos originales intactos.
Solo añade los nuevos campos.
Patrón 5: "Analysis + Insight"
Analiza estos datos:
{raw_data}
Genera:
1. Un resumen ejecutivo en 1 párrafo
2. Top 5 insights clave
3. Recomendación principal
4. JSON estructurado con métricas
3.3 — Validación Post-IA
Cada output de DeepSeek pasa por validación automática:
function validateSpot(spot) {
const errors = [];
// Coordenadas en España
if (spot.lat < 27.5 || spot.lat > 43.8) errors.push('lat fuera de España');
if (spot.lng < -18.2 || spot.lng > 4.4) errors.push('lng fuera de España');
// Campos obligatorios
if (!spot.name || spot.name.length < 3) errors.push('nombre inválido');
if (!spot.type) errors.push('tipo requerido');
// Tipos válidos
const validTypes = ['rio','embalse','costa','puerto','escollera','playa','pantano','lago'];
if (!validTypes.includes(spot.type)) errors.push(`tipo ${spot.type} no válido`);
// Deduplicación por proximidad
// Si hay otro spot a <100m, es duplicado
return { valid: errors.length === 0, errors };
}
4. Plan de Seeding por App
4.1 — FishMap (Pesca de Río)
| Seeding Task | Registros | Prompt tipo | Sesiones |
|---|---|---|---|
| Spots de río (200+ nuevos) | 200-270 | Zone-by-zone + Expert | 1 |
| Ríos como entidad (50) | 50 | Expert + Structured | 0.5 |
| Normativa por CCAA (17×~10 sp) | ~170 reglas | Expert + Structured | 1 |
| Enriquecimiento spots existentes | 294 | Enrichment | 0.5 |
| Perfiles de comportamiento por especie | 52 | Expert + Analysis | 0.5 |
| Cotos de pesca (1.200 en España) | 500-800 | Zone-by-zone | 1 |
| Total FishMap río | ~1.500 registros | ~4 sesiones |
Script: seed-fishmap-rivers.cjs
Zonas de seeding:
1. Pirineo Aragonés (Gállego, Cinca, Ésera, Ara)
2. Pirineo Catalán (Noguera Pallaresa, Segre, Ter)
3. Asturias/Cantabria (Sella, Cares, Deva, Nansa)
4. Galicia (Miño, Sil, Ulla)
5. País Vasco (Bidasoa, Nervión)
6. Castilla y León (Duero, Pisuerga, Esla, Tormes)
7. Extremadura (Tajo, Guadiana, Jerte)
8. Andalucía interior (Guadalquivir, Genil)
9. Aragón meseta (Ebro medio/bajo)
10. Castilla-La Mancha (Tajo medio, Júcar alto)
Prompt de enriquecimiento de spots existentes:
Tengo estos spots de pesca de agua dulce ya en mi base de datos:
[JSON de spots existentes con name, type, lat, lng, provincia]
Para cada uno, añade:
- river_name: nombre del río/embalse exacto
- cuenca: confederación hidrográfica
- best_technique: técnica de pesca principal
- best_bait: JSON array de 3 cebos recomendados
- substrate: tipo de fondo
- wading_possible: boolean
- difficulty: facil/media/dificil/experto
- pro_tip: consejo de 1 línea para este spot
Devuelve solo el JSON con los campos originales + nuevos.
4.2 — FarmaMap (Valor Urbano)
| Seeding Task | Registros | Prompt tipo | Sesiones |
|---|---|---|---|
| Especialidades por farmacia (MAD+BCN) | 5.500 | Enrichment | 1-2 |
| Perfiles de zona/barrio | ~100 zonas | Expert + Analysis | 0.5 |
| Catálogo probabilístico productos | ~50 perfiles tipo | Expert | 0.5 |
| Transit stops por farmacia | 5.500 | Enrichment (coords) | 1 |
| Traducciones zonas turísticas | ~500 farmacias | Enrichment | 0.5 |
| Total FarmaMap | ~12.000 registros enriquecidos | ~4 sesiones |
Prompt de enriquecimiento de farmacias:
Tengo esta farmacia en mi base de datos:
Nombre: {name}
Dirección: {address}
Ciudad: {city}
Barrio/Zona: {zone}
Es 24h: {is_24h}
Basándote en su ubicación y tipo, genera:
{
"specialties": ["dermocosmética", "ortopedia", ...], // probables
"target_demographic": "joven_adulto" | "familias" | "tercera_edad" | "turistas",
"estimated_size": "pequeña" | "mediana" | "grande",
"nearest_metro": { "name": "Sol", "line": "L1", "distance_m": 200 },
"nearest_bus_stop": { "name": "Gran Vía 42", "distance_m": 50 },
"tourist_zone": true | false,
"affluence_pattern": {
"peak_hours": ["09:00-10:00", "18:00-19:00"],
"quiet_hours": ["11:00-12:00", "15:00-16:00"]
}
}
4.3 — FuelMap (Tendencias)
| Seeding Task | Registros | Prompt tipo | Sesiones |
|---|---|---|---|
| Rutas principales (50) | 50 | Expert + Structured | 0.5 |
| Perfiles de zona de precios | ~100 zonas | Analysis | 0.5 |
| Perfiles de marca (comportamiento) | ~30 marcas | Expert + Analysis | 0.5 |
| Paradas óptimas por ruta | 50×3 opciones | Expert + Structured | 0.5 |
| Perfiles de estación enriquecidos | 12.000 | Enrichment batch | 2 |
| Total FuelMap | ~12.500 registros | ~4 sesiones |
Prompt de análisis de zona:
Analiza el mercado de combustibles en la provincia de {province}.
Datos: {price_data_last_30_days}
Genera:
{
"zone_name": "Barcelona provincia",
"avg_price_g95": 1.479,
"cheapest_brand": "Bonárea",
"most_expensive_brand": "Shell",
"price_spread_cents": 18,
"cheapest_day_of_week": "martes",
"most_expensive_day": "viernes",
"pre_holiday_markup_cents": 3,
"trend_30d": "stable",
"lowcost_share_pct": 14,
"ev_chargers_count": 340,
"savings_potential_annual_eur": 280,
"recommendation": "Repostar en lowcost martes-miércoles"
}
5. Costes Estimados de DeepSeek
Precios DeepSeek (abril 2025)
- Input: $0.14 / 1M tokens (cache miss), $0.014 / 1M (cache hit)
- Output: $2.19 / 1M tokens
- Reasoner (thinking tokens): No se cobran
Estimación por tarea de seeding
| Tarea | Tokens in | Tokens out | Coste est. |
|---|---|---|---|
| 50 zonas FishMap río (~5K in, ~2K out each) | 250K | 100K | ~$0.25 |
| 52 species profiles (~2K in, ~3K out each) | 104K | 156K | ~$0.36 |
| 17 CCAA regulations (~3K in, ~5K out each) | 51K | 85K | ~$0.20 |
| 5.500 farmacias enrichment (batch 100) | 500K | 300K | ~$0.73 |
| 50 rutas principales | 100K | 150K | ~$0.35 |
| 100 zone analytics FuelMap | 200K | 300K | ~$0.69 |
| Total todo el seeding | ~1.2M | ~1.1M | ~$2.58 |
Coste total estimado: < $5 por TODO el seeding de las 3 apps.
Comparado con:
- GPT-4o: ~$45 para el mismo trabajo
- Claude 3.5: ~$35
- Contratar a alguien: miles de euros
6. Workers Cron: IA Continua
No solo seeding inicial. La IA trabaja continuamente:
Worker 1: FishMap Conditions (cada 6h)
Trigger: Cron 0 */6 * * *
1. Fetch AEMET (presión, temp, viento) para zonas con spots
2. Fetch SAIH (caudal, nivel embalse) para ríos principales
3. Calcular Fishing Score para cada spot
4. Actualizar fishmap_spot_conditions en D1
5. Si score > 80 en zona popular → (futuro) push notification
Worker 2: FarmaMap Guardia (cada 6h)
Trigger: Cron 0 */6 * * *
1. Scrape turnos de guardia de colegios oficiales
2. Parse con DeepSeek si el formato cambia
3. Actualizar farmamap_schedules en D1
4. Validar: si 0 farmacias de guardia → alerta (scraping roto)
Worker 3: FuelMap Prices (cada 2h)
Trigger: Cron 0 */2 * * *
1. Fetch MINETUR API (12K+ estaciones)
2. Parse y actualizar fuelmap_prices
3. Insertar en fuelmap_price_history (1 por día como mínimo)
4. Recalcular zone_analytics (semanal)
5. Generar Fill Score por zona
Worker 4: Weekly AI Digest (lunes 08:00)
Trigger: Cron 0 8 * * 1
1. Recopilar datos de la semana anterior para cada app
2. Llamar a DeepSeek con datos → generar resúmenes
3. FuelMap: resumen de precios por zona, tendencia, consejo
4. FishMap: mejores spots de la semana (por fishing score medio)
5. Guardar en D1 para queries desde la app
7. Calidad de Datos: El Factor Crítico
Verificación en 3 capas
CAPA 1: Validación automática (código)
├── Coordenadas en España (27.5-43.8 lat, -18.2-4.4 lng)
├── Campos obligatorios presentes
├── Tipos/enums válidos
├── No duplicados por proximidad (<100m)
└── JSON schema validation
CAPA 2: Cross-reference (automático)
├── ¿El río que dice DeepSeek realmente pasa por esas coords?
├── ¿La CCAA/provincia coincide con las coordenadas?
├── ¿La farmacia existe en el colegio oficial?
├── ¿La gasolinera existe en MINETUR?
└── Geocoding inverso para validar ubicación
CAPA 3: Crowdsourcing (futuro)
├── Usuarios reportan datos incorrectos
├── Rating bajo = más probabilidad de error
├── Flag "datos desactualizados"
└── Admin review queue para datos flaggeados
Tasa de error esperada
- Seeding IA: ~2-5% de spots con coords ligeramente incorrectas
- Enriquecimiento: ~10-15% de especialidades/perfiles imprecisos
- Normativa: ~5% de errores en fechas/cupos (varía por CCAA)
Mitigación: Disclaimer "Datos orientativos. Verifica en fuente oficial antes de actuar."
8. Roadmap Consolidado de IA
Mes 1 — Seeding Masivo
| Semana | App | Tarea IA | Registros |
|---|---|---|---|
| S1 | FishMap | Spots de río (10 zonas) | 200-270 |
| S1 | FishMap | Ríos + normativa | 50 + 170 |
| S2 | FarmaMap | Enriquecimiento MAD+BCN | 5.500 |
| S2 | FuelMap | Rutas + zonas | 50 + 100 |
| S3 | FishMap | Perfiles especie + cotos | 52 + 500 |
| S3 | FuelMap | Perfiles estación (batch) | 12.000 |
| S4 | QA | Validación cross-reference | All |
Mes 2 — IA Continua
| Semana | Tarea |
|---|---|
| S5 | Workers Cron: AEMET, SAIH, MINETUR |
| S6 | Fishing Score + Fill Score implementados |
| S7 | Weekly AI Digest worker |
| S8 | UI para scores/recomendaciones |
Mes 3 — Polish + Features
| Semana | Tarea |
|---|---|
| S9 | "¿Dónde pico hoy?" (FishMap) |
| S10 | "¿Lleno hoy o espero?" (FuelMap) |
| S11 | Modo nocturno + transporte (FarmaMap) |
| S12 | Testing, feedback, iteración |
9. Scripts de Seeding Planificados
| Script | App | Descripción | Estado |
|---|---|---|---|
seed-fishmap-species.cjs |
FishMap | 52 especies de pesca | ✅ DONE |
seed-fishmap-spots.cjs |
FishMap | 294 spots costeros + embalses | ✅ DONE |
seed-fishmap-rivers.cjs |
FishMap | 200+ spots de río + 50 ríos | 📋 PLANNED |
seed-fishmap-regulations.cjs |
FishMap | Normativa 17 CCAA | 📋 PLANNED |
seed-fishmap-cotos.cjs |
FishMap | 500+ cotos de pesca | 📋 PLANNED |
seed-fishmap-enrich.cjs |
FishMap | Enriquecer 294 spots con datos río | 📋 PLANNED |
seed-fishmap-behavior.cjs |
FishMap | Perfiles de comportamiento por especie | 📋 PLANNED |
seed-farmamap-enrich.cjs |
FarmaMap | Especialidades + zona + transit | 📋 PLANNED |
seed-farmamap-products.cjs |
FarmaMap | Catálogo probabilístico | 📋 PLANNED |
seed-fuelmap-routes.cjs |
FuelMap | 50 rutas principales | 📋 PLANNED |
seed-fuelmap-zones.cjs |
FuelMap | 100 perfiles de zona | 📋 PLANNED |
seed-fuelmap-brands.cjs |
FuelMap | 30 perfiles de marca | 📋 PLANNED |
10. Resumen Ejecutivo
| Métrica | Valor |
|---|---|
| Modelo IA | DeepSeek Reasoner |
| Coste total seeding | < $5 |
| Registros nuevos total | ~26.000 (3 apps combinadas) |
| Workers Cron | 4 (conditions, guardia, prices, digest) |
| Tiempo de seeding | ~12 sesiones (4 por app) |
| IA visible al usuario | 0% |
| IA real | Seeding, enrichment, scoring, predictions, recommendations |
| Filosofía | "Parece que el dato siempre estuvo ahí" |
Filosofía Final
Tres apps que parecen tres bases de datos bien curadas.
En realidad, un único motor de IA (DeepSeek Reasoner) que:
- Genera datos que un equipo de 10 personas tardaría meses en recopilar
- Enriquece cada registro con contexto experto
- Calcula scores en tiempo real cruzando múltiples fuentes
- Predice tendencias basándose en históricos
- Genera textos y recomendaciones como si fueran de un experto humano
Y el usuario nunca se entera. Solo piensa:
"Qué buena app. Tiene todos los datos."Eso es Invisible AI. Eso es lo que construimos.