Docker propone virtualización de software mediante contenedores: empaquetan
código, librerías y dependencias, garantizando que el software funcione idénticamente en
cualquier entorno. A diferencia de máquinas virtuales que replican un sistema operativo
completo, los contenedores son ligeros y portables.
Instalación
Se instala Docker Desktop y opcionalmente se integra con WSL
(wsl --install). Verificación: docker --version.
Imágenes y Contenedores
Una imagen es una plantilla (como un ISO), el contenedor es
la instancia en ejecución:
docker pull hello-world
docker run hello-world
docker images
docker ps -a
Despliegue de Apps Geoespaciales
Mapeo de puertos con -p y modo segundo plano con -d:
docker run -d -p 8080:80 ingjuanmasuarez/app-geoturismo:v1
PostGIS + pgAdmin con Red Docker
Se crea una red virtual para comunicación entre contenedores:
docker network create geo-net
docker run --name postgis --network geo-net \
-e POSTGRES_USER=juanma \
-e POSTGRES_PASSWORD=geocositas \
-e POSTGRES_DB=gisdb \
-p 5432:5432 -d postgis/postgis:latest
docker run --name pgadmin --network geo-net \
-e PGADMIN_DEFAULT_EMAIL=admin@geocositas.com \
-e PGADMIN_DEFAULT_PASSWORD=geocositas \
-p 5050:80 -d dpage/pgadmin4
En pgAdmin, el Host name es el nombre del contenedor (postgis), no
localhost. GeoServer se despliega en otro puerto:
docker run -d -p 8081:8080 docker.osgeo.org/geoserver:2.23.0.
Los LLM (Large Language Models) procesan texto mediante
tokenización (descomposición en unidades) y embeddings
(vectores numéricos en espacio n-dimensional donde palabras similares se agrupan
geométricamente). La arquitectura Transformers usa redes neuronales con
mecanismos de autoatención (self-attention).
Ollama: LLM Locales
Ejecutar modelos localmente garantiza privacidad. La cuantización reduce
precisión decimal para menor consumo de RAM:
ollama run codellama
ollama list
Prompt Engineering para SIG
Cadena de Pensamiento + Roles:
Actúa como desarrollador senior en Python y PostGIS.
Explica paso a paso cómo calcular NDVI.
Usa solo Psycopg2 y Geopandas. Máximo 40 líneas.
Árbol de Pensamiento:
Desarrolla 3 flujos para detectar cambios de cobertura.
Selecciona el mejor y preséntalo en JSON con campos:
Etapa, Herramientas, Descripción, Script Python.
Rol Inverso:
Actúa como estudiante curioso, yo soy el experto.
Hazme 3 preguntas antes de generar código para
calcular buffers y exportar a GeoPackage.
Metalenguaje SIG:
Mini lenguaje: LOAD=leer, CLIP=recorte, CALC=área, SAVE=exportar.
Interpreta: "LOAD -> CLIP -> CALC -> SAVE"
Devuelve script Python completo.
RAG (Retrieval Augmented Generation) combina un LLM con una base de
conocimientos externa. El flujo: los documentos se fragmentan en chunks, se
transforman en embeddings (vectores n-dimensionales) y se almacenan en una
base de datos vectorial. Ante una consulta, el sistema recupera semánticamente la
información más relevante.
Despliegue de n8n con Docker
n8n orquesta el flujo de trabajo. Se integra en la misma red que PostgreSQL y Ollama:
docker run -d --name n8n --network gisnet \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
n8nio/n8n
Para conectar con Ollama: http://host.docker.internal:11434
PostgreSQL con Extensión Vector
Habilitamos la capacidad de almacenar vectores:
CREATE DATABASE geologo;
\c geologo
CREATE EXTENSION IF NOT EXISTS vector;
Flujo n8n: Ingesta y Recuperación
Ingesta: Cargar PDFs → Text Splitter (chunks) → Embeddings
(nomic-embed-text) → Insertar en tabla vectores_geologia.
Recuperación: Chat de Ollama (llama3/qwen) → Vector Store Tool conectado a
PostgreSQL → Búsqueda semántica → Respuesta contextualizada.
System Prompt
Eres un asistente experto en geología.
Utiliza la herramienta de recuperación para responder
basándote exclusivamente en el contexto recuperado.
Implementación de RAG sobre PostgreSQL con extensiones
PostGIS y pgvector. Transformamos registros espaciales en
embeddings para consultas en lenguaje natural, permitiendo que un LLM "converse" con datos
geográficos propios.
API de Ollama
Ollama expone endpoints REST. Para generar texto: /api/generate. Para
embeddings: /api/embeddings (verificar dimensionalidad, ej: 768).
Tabla de Conocimiento Vectorial
Creamos una tabla kb_items con columna de tipo vector:
CREATE TABLE kb_items (
id SERIAL PRIMARY KEY,
contenido TEXT,
metadata JSONB,
geom GEOMETRY,
embedding VECTOR(768)
);
Indexación con Python
Iteramos tablas (colegios, equipamientos), concatenamos atributos en texto descriptivo,
obtenemos embedding via API y lo insertamos con psycopg:
texto = f"El colegio {nombre} tiene {cupos} cupos"
embedding = obtener_embedding(texto)
cursor.execute("INSERT INTO kb_items ...", [texto, embedding])
Chat Geoespacial
La pregunta del usuario se convierte en embedding y se buscan registros similares con
operadores de pgvector. El contexto recuperado se incluye en el prompt:
Eres un asistente experto en SIG.
Contexto: {registros_recuperados}
Responde basándote únicamente en el contexto.
Pregunta: {pregunta_usuario}
Esto garantiza privacidad y reduce alucinaciones del modelo.