Actualizado en septiembre de 2026: quité unas cifras de escenas sin fuente del prompt de metadatos y los nombres de dos modelos multimodales que OpenAI y Anthropic ya retiraron; corregí el log del agente para que declare el sistema de coordenadas y las unidades de la pendiente, y agregué el aviso de que EXPLAIN ANALYZE ejecuta la consulta.
No llegué por moda. Llegué por fricción.
Conoces la sensación: tienes una pregunta territorial clara, pero tu día se diluye peleando con proyecciones, formatos y scripts a medianoche.
Un LLM funciona como una capa intermedia: toma tu intención ("¿dónde hay riesgo?", "¿qué variable está moviendo el valor?", "¿qué municipio se sale del patrón?") y la convierte en consultas, cálculos, cruces, resúmenes, mapas y validaciones.
Bien usado, te devuelve lo más caro: el tiempo que se te iba en proyecciones y formatos, para dedicárselo a la pregunta territorial.
Pero ahí está la trampa. Un LLM te da velocidad, y puede sonar seguro incluso cuando está inventando, simplificando o ignorando contexto local. Por eso el rol humano pesa más con un LLM que sin él. El LLM acelera; tú pones el freno de mano. Ese freno se llama control de calidad: revisar fuentes, validar supuestos, contrastar con datos, medir incertidumbre y decidir si el resultado aguanta la decisión que alguien va a tomar con él.
Aquí van mis cinco reglas para usar un LLM sin caer en el hype:
1. Copiloto SIG: Nunca le des el volante
Para tareas clásicas (buffers, joins, análisis), el LLM es un excelente asistente júnior, pero pésimo jefe.
Oblígalo a validar antes de calcular.
❌ Mal prompt:
Calcula el área de estos polígonos.
✅ Buen prompt:
Dime qué proyección usarás para calcular áreas en Colombia y por qué, antes de escribirme el código.
Flujo recomendado: tu intención, la validación del LLM, la ejecución técnica y tu revisión humana
Por qué funciona: Forzar al LLM a declarar la proyección antes de calcular convierte un error silencioso en una respuesta que puedes auditar.
2. PostGIS: Itera la estructura de la consulta
Escribir consultas espaciales complejas duele. Con un LLM puedes iterar la lógica en pocas vueltas: pides, lees qué supuso, corriges y vuelves a pedir.
Exígele que diga qué supuestos usa.
Ejemplo práctico:
Genera la consulta SQL y dime qué supones sobre:
- Unidades (metros, grados)
- SRID (qué sistema de coordenadas)
- Uniones entre atributos
Si no lo sabes, PREGUNTA.
Resultado: El error clásico, calcular distancias en grados cuando esperabas metros, se vuelve más fácil de detectar, porque el modelo tiene que decir en qué unidades está trabajando antes de darte el número.
Un paso más:
Cuando tengas la consulta, pídele que le agregue EXPLAIN ANALYZE para ver cómo la ejecuta PostgreSQL y cuánto tarda:
EXPLAIN ANALYZE
SELECT ...
Ojo: con ANALYZE, EXPLAIN ejecuta la sentencia de verdad. Si la consulta modifica datos (un UPDATE, un DELETE), envuélvela en BEGIN; … ROLLBACK; para que no toque nada.
3. Visión: Pídele hipótesis y compruébalas tú
Los modelos multimodales, los que leen imágenes además de texto, pueden ver patrones en mapas: vías, cultivos, manchas urbanas.
Úsalos para disparar preguntas.
Flujo correcto:
- LLM ve el mapa: "Parecen drenajes en patrón de espina de pescado"
- Tú preguntas: "¿Qué dato vectorial necesito para confirmar esto?"
- LLM sugiere: "Cruza con la red de drenaje de la cartografía oficial"
- Tú ejecutas: El análisis cuantitativo con esa red de drenaje
Del mapa satelital a la hipótesis del LLM, y de ahí a tu validación con datos vectoriales; si no se sostiene, ajustas la hipótesis
4. Agentes: Sin rastro no hay confianza
Un agente geoespacial, o sea, un LLM que elige las herramientas y encadena los pasos, solo sirve si es auditable. De nada me vale un mapa si no sé qué capas cruzó.
Un buen agente debe ser transparente:
- Entiende la intención: ¿qué quiere el usuario?
- Elige la herramienta: ¿una API, una librería, SQL?
- Ejecuta y documenta: ¿qué parámetros usó?
- Devuelve el resultado y el log de sus decisiones.
Ejemplo de log auditable:
{
"query": "Encuentra zonas de riesgo de inundación",
"steps": [
{
"action": "Cargar DEM de SRTM 1 Arc-Second (30m)",
"tool": "rasterio",
"params": {"bbox": [-77.5, -12.5, -76.5, -11.5], "orden_bbox": "lon_min, lat_min, lon_max, lat_max", "crs": "EPSG:4326"}
},
{
"action": "Reproyectar a UTM 18S para trabajar en metros",
"tool": "gdal.Warp",
"params": {"dstSRS": "EPSG:32718", "resampleAlg": "bilinear"}
},
{
"action": "Calcular pendiente en porcentaje",
"tool": "gdal.DEMProcessing",
"params": {"processing": "slope", "slopeFormat": "percent", "computeEdges": true}
},
{
"action": "Clasificar áreas <2% pendiente + <100m elevación",
"tool": "numpy.where",
"params": {"pendiente_max_pct": 2, "elevacion_max_m": 100, "excluir": "nodata del DEM y de la pendiente"}
}
],
"output": "riesgo_inundacion.tif"
}
Por qué importa: Si mañana te preguntan "¿Cómo salió este mapa?", puedes defender cada decisión.
5. Documentación: El héroe aburrido
Aquí los LLMs brillan con menos riesgo, siempre que les pongas límites.
Úsalos para generar lo que nadie quiere escribir:
- ✅ Metadatos ISO 19115
- ✅ README.md de repositorios
- ✅ Diccionarios de datos
- ✅ Documentación de APIs
Ejemplo práctico:
Genera los metadatos solo con estos datos:
Dataset: Sentinel-2 L2A
Región: Cuenca Amazonas (Colombia)
Bandas: B2, B3, B4, B8, B11, B12
Período: 2023-01-01 a 2024-12-31
Resolución: 10m (RGB/NIR), 20m (SWIR)
CRS: el UTM de cada tesela (WGS 84)
Cobertura: <número de escenas> escenas, <porcentaje> % con menos de 10 % de nubes
Formato de salida: XML según ISO 19115-3
Si un campo no está en estos datos, déjalo vacío y márcalo como pendiente.
No inventes licencia, contacto ni linaje.
Con esos límites en el prompt, lo que falte en tus datos queda marcado como pendiente.
Mi escudo: Las 3 preguntas de seguridad
Cada vez que uso IA en un proyecto serio, me hago estas tres preguntas. Si el resultado no las pasa, no sale a producción.
✅ 1. ¿Qué está asumiendo?
- SRID (¿EPSG:4326? ¿EPSG:9377?)
- Unidades (¿metros? ¿grados?)
- Fechas (¿UTC? ¿Local?)
✅ 2. ¿Cómo lo verifico rápido?
Un chequeo de coherencia:
# Ejemplo: verificar que el área calculada tiene sentido
# gdf: el límite continental de Colombia (sin mar), con su CRS asignado
area_colombia_km2 = gdf.to_crs('EPSG:9377').area.sum() / 1e6
print(f"Área: {area_colombia_km2:.0f} km²")
# Esperado: ~1.141.748 km² de área continental según el IGAC (2008) (si es muy diferente, algo está mal)
✅ 3. ¿Es auditable?
Si alguien me pide explicar este mapa, ¿puedo decir qué datos usé, qué transformaciones hice y qué decisiones tomé?
Hacia dónde va esto
El futuro es híbrido: el SIG pone los datos y las reglas, y el modelo traduce tu intención.
Ciclo de retroalimentación entre el SIG, los modelos y el criterio humano
Es el freno de mano del principio: el LLM acelera, y el mapa lo firmas tú.
¿Y tú?
Cuéntame: ¿en qué tarea te ahorra más fricción la IA hoy?
- 🐍 Python/GeoPandas (generación de código)
- 🗄️ SQL/PostGIS (consultas espaciales)
- 📄 Documentación (metadatos, READMEs)
- 🤖 Otro (cuéntame cuál)
Lecturas relacionadas:
