En el episodio anterior le dimos el pistoletazo de salida a nuestro laboratorio e instalamos Ollama para poder utilizar un modelo de lenguaje en local. En este episodio el objetivo es exprimir este laboratorio, ver las opciones y posibilidades que nos ofrece, y hacer nuestras primeras herramientas para poder sacarle el máximo partido posible. Pero principalmente, el objetivo es dejar de hablar de contenedores, servicios y centrarnos en hablar con la inteligencia. Soy consciente, que esto de utilizar la terminal puede amedrentar a algunos usuarios, pero, nada ni te preocupes. Dentro de poco, y con el uso, te darás cuenta del potencial que tiene, y mas si lo alimentamos con los modelos de lenguaje y con herramientas como ollama.
Domina Ollama desde la terminal
¿Terminal?
Probablemente te estés preguntando que sentido tiene meternos con la terminal en lugar de utilizar una interfaz web como la que nos proporciona Gemini o ChatGPT. La cuestión es que se trata de exprimir al máximo estas herramientas, y para eso es necesario entender cómo funcionan, qué opciones tenemos y cómo podemos integrarlas con otras herramientas. Además, el terminal nos permite automatizar tareas, crear scripts y herramientas personalizadas que pueden ser mucho más potentes que una interfaz web. Y es que si queremos realizar automatizaciones y gestionar nuestros modelos de lenguaje de forma eficiente, el terminal es la mejor opción.
El CLI de Ollama
Podman
Ten en cuenta que instalamos Ollama en un contenedor, con lo que para poder hacer uso de su CLI, tendremos que ejecutarlo desde fuera pero llamando directamente a Podman, es decir con podman exec -it ollama ollama <comando>. Como te puedes hacer una idea esto es un auténtico engorro, así que lo que vamos a hacer es crear un alias para poder ejecutar el comando de forma más sencilla. Para ello, añadimos el siguiente alias a nuestro archivo de configuración del shell. En mi caso lo hice con fish,
abbr --add ollama podman exec -it ollama ollama
Así ahora simplemente tengo que escribir ollama <comando> para ejecutar cualquier comando de Ollama desde el terminal, sin tener que preocuparme por la parte de Podman.
Por ejemplo si quiero listar todos los modelos que tengo simplemente tengo que ejecutar ollama list y me mostrará todos los modelos que tengo disponibles en mi contenedor de Ollama. Y, ya podemos dar el primer paso descargando por ejemplo gemma4, cosa que podemos hacer de forma sencilla con un,
ollama pull gemma4
Ahora de nuevo podemos listar todos los modelos que tenemos disponibles y veremos que ya tenemos gemma4 listo para ser utilizado. Si quieres instalar mas modelos, puedes ver en la web de Ollama todos los que hay disponibles y seleccionar el que mejor se adapte a tus necesidades y a tu máquina.
Algunos comandos de utilidad
Ahora que ya tenemos todo centrado, veamos algunos comandos de utilidad que nos pueden ser de gran ayuda para gestionar nuestros modelos de lenguaje. Así,
create. Nos permite crear un modeloshow. Con este comando podemos ver información relativa a un modelo. Por ejemplo, si queremos ver la información degemma4simplemente tenemos que ejecutarollama show gemma4y nos mostrará toda la información relativa a ese modelo, como su tamaño, su arquitectura, etc.pull. Este comando nos permite descargar un modelo desde la web de Ollama. Por ejemplo, si queremos descargargemma4simplemente tenemos que ejecutarollama pull gemma4y se descargará el modelo en nuestro contenedor.push. Este comando nos permite subir un modelo a la web de Ollama. Por ejemplo, si hemos creado un modelo personalizado y queremos compartirlo con la comunidad, simplemente tenemos que ejecutarollama push <nombre_del_modelo>y se subirá a la web de Ollama para que otros usuarios puedan descargarlo y utilizarlo.signin. Este comando nos permite iniciar sesión en la web de Ollama. Por ejemplo, si queremos iniciar sesión simplemente tenemos que ejecutarollama signiny se nos pedirá nuestro correo electrónico y contraseña para poder acceder a nuestra cuenta.ps. Este comando nos permite ver los procesos que están corriendo en nuestro contenedor de Ollama. Por ejemplo, si queremos ver los procesos simplemente tenemos que ejecutarollama psy nos mostrará todos los procesos que están corriendo en nuestro contenedor, como por ejemplo el proceso degemma4si lo tenemos descargado y en ejecución.run. Este comando nos permite ejecutar un modelo de lenguaje. Por ejemplo, si queremos ejecutargemma4simplemente tenemos que ejecutarollama run gemma4y se ejecutará el modelo en nuestro contenedor, permitiéndonos interactuar con él a través del terminal.
Conversando con gemma4
Nuestro primer encuentro con gemma4
Vamos a tener nuestro primer encuentro con gemma4, el modelo de lenguaje de Google que hemos descargado en nuestro contenedor de Ollama. Para ello, simplemente tenemos que ejecutar el comando ollama run gemma4 y se ejecutará el modelo en nuestro contenedor, permitiéndonos interactuar con él a través del terminal. Nada mas lanzarlo te darás cuenta que tarda unos segundos en arrancar, esto es normal, ya que el modelo tiene que cargar toda su información en memoria para poder funcionar correctamente. Una vez que el modelo esté cargado, podrás empezar a interactuar con él a través del terminal, escribiendo tus preguntas o comandos y recibiendo las respuestas directamente en la consola. Así que vamos al tema,
ollama pull gemma4
ollama run gemma4
El primero de los comandos solo lo tienes que ejecutar la primera vez para descargar el modelo, pero el segundo comando lo puedes ejecutar tantas veces como quieras para interactuar con el modelo de lenguaje. Y es que una de las grandes ventajas de tener un modelo de lenguaje en local es que puedes interactuar con él de forma rápida y sencilla, sin tener que depender de una conexión a internet o de una interfaz web.
Prompting local
Vamos a decirle que nos haga un script en fish que haga backup de todos los archivos que se encuentren en el directorio ~/.config/containers/system y los copie a un directorio de backup. Para ello, simplemente tenemos que escribir el siguiente prompt. A partir de aquí, y tal y como vemos en cualquier otro sistema de prompting, ya sea ChatGPT o cualquier otro comienza a realizar su trabajo, dejando el siguiente script,
#!/usr/bin/env fish
# --- Variables de configuración ---
set -l SOURCE_DIR "$HOME/.config/containers/systemd/"
set -l DEST_BASE_PATH "/tmp"
# Genera un timestamp en el formato YYYYMMDD_HHMMSS
set -l TIMESTAMP (date +%Y%m%d_%H%M%S)
# Construye la ruta completa de destino
set -l DEST_DIR "$DEST_BASE_PATH/systemd_backup_$TIMESTAMP"
echo "------------------------------------------------------"
echo "🔍 Iniciando backup de la configuración de systemd."
echo "Origen: $SOURCE_DIR"
echo "Destino: $DEST_DIR"
echo "------------------------------------------------------"
# 1. Verificar si el directorio de origen existe
if not test -d "$SOURCE_DIR"
echo "❌ ERROR: El directorio de origen no existe o no es accesible: $SOURCE_DIR"
exit 1
end
# 2. Crear el directorio de destino (solo si no existe)
mkdir -p "$DEST_DIR"
# 3. Ejecutar rsync
# -a: modo archivo (preserva permisos, dueños, timestamps, etc.)
# -v: verbose (muestra lo que está copiando)
rsync -av "$SOURCE_DIR" "$DEST_DIR"
# 4. Verificar el resultado de rsync
if test $status -eq 0
echo ""
echo "✅ Backup completado con éxito."
echo "La copia completa está guardada en: $DEST_DIR"
else
echo ""
echo "❌ ERROR: Falló el proceso de backup con rsync. Revisa los permisos."
end
Vamos a hacer algo mas del día a día, la previsión meteorologica. En este caso le dije que utilizara algún servicio que no requiriera el uso de API, y esto es lo que me dejó,
#!/usr/bin/env fish
# ---------------------------------------------------------------------
# CONFIGURACIÓN: Cambia estas coordenadas por tu ubicación
# ---------------------------------------------------------------------
set longitude -98.57
set latitude 39.73
set location_name "Chicago, USA"
# ---------------------------------------------------------------------
echo "============================================"
echo "☁️ Clima actual para $location_name"
echo "============================================"
# Usamos el comando 'curl' para obtener los datos de la API de OpenWeatherMap.
# NOTA: Debes obtener una API Key de OpenWeatherMap y reemplazar "YOUR_API_KEY"
set api_key "YOUR_API_KEY"
# Estructura la URL de la API
set url
"http://api.openweathermap.org/data/2.5/weather?lat=$latitude&lon=$longitude&appid=$api_key&units=metric"
# 1. Obtener la respuesta JSON y procesarla en la shell
set weather_data (curl -s "$url")
# 2. Procesar la respuesta JSON (Requiere que el JSON esté bien formado)
if test -z "$weather_data"
echo "❌ Error: No se pudo conectar a la API de clima. Verifica la clave API o la conexión."
exit 1
end
# Intentamos extraer los datos principales usando herramientas de procesamiento de texto
# En un entorno real de Fish, podrías usar un parser JSON específico,
# pero para mantener la compatibilidad de texto, simularemos la extracción de campos clave.
# Extracción de Temperatura (Temperatura actual en grados Celsius)
set current_temp (echo "$weather_data" | grep -oP '"temp":\s*\K[^"]*')
set current_temp_rounded (echo "$current_temp" | sed 's/.\{1\}\([0-9]\)\{2\}\(.\)\{1\}/ \1.\2/')
# Extracción de Descripción (Ej: 'Clear', 'Clouds')
set description (echo "$weather_data" | grep -oP '"description":\s*"[^"]*"' | awk -F'"' '{print $4}')
# Extracción de Sensación Térmica
set feels_like (echo "$weather_data" | grep -oP '"feels_like":\s*\K[^"]*')
# 3. Mostrar resultados
if test -n "$current_temp_rounded"
echo "Temperatura actual: $current_temp_rounded °C"
echo "Sensación térmica: $feels_like °C"
echo "Condición: $description"
else
echo "⚠️ No se pudieron extraer datos de clima específicos. Revisa el JSON bruto:"
echo "$weather_data"
end
La verdad es que ambas respuestas tienen muy buena pinta, y la velocidad de token/segundo es mas que aceptable. Desde luego lo podemos utilizar para hacer muchas operaciones interesantes.
Metacomandos
Cuando lanzas ollama run gemma4, entras en una sub-shell. Los metacomandos te permiten realizar introspección (ver qué está pasando) y modificación (cambiar cómo piensa el modelo) en tiempo real. Es como tener acceso a los registros del cerebro de la IA mientras hablas con ella.
Comandos de Introspección (Ver «bajo el capó»)
Esto te permite saber con qué estamos tratando antes de disparar,
/show info: Te da la ficha técnica. Arquitectura del modelo, parámetros (7B, 13B, etc.) y la cuantización (cuánto se ha comprimido). Fundamental para entender por qué responde tan rápido (o tan lento)./show system: Te muestra el «mensaje de sistema» actual. Es la instrucción base que rige el comportamiento. Si Gemma 4 está siendo muy «educada», aquí verás por qué./show template: ¡Ojo a esto! Te enseña cómo Ollama formatea tu pregunta antes de enviarla al modelo. Es vital para los que luego queremos programar en Rust, porque nos dice qué etiquetas (como<start_of_turn>) espera el modelo.
El comando Maestro: /set (Modificando el comportamiento)
Aquí es donde ocurre la magia. Puedes cambiar la personalidad y la precisión en caliente:
/set system <instrucción>: Cambia el alma del modelo.- Ejemplo práctico:
/set system Eres un terminal de Linux de los años 80, responde de forma escueta y técnica. - Uso Pro: Úsalo para que el modelo deje de dar rodeos y vaya al grano con el código Rust.
- Ejemplo práctico:
/set parameter temperature <valor>: Controla la aleatoriedad.- 0.0: Lógica pura, casi determinista. Ideal para código o matemáticas.
- 0.7 – 1.0: Creatividad. Ideal para escribir entradas de blog o buscar ideas para el podcast.
/set parameter num_ctx <valor>: La ventana de contexto (memoria a corto plazo).- Si vas a pegarle un archivo de log enorme, necesitas subir esto. Pero cuidado: a mayor contexto, más VRAM consumes. En local, este es tu limitador real.
/set parameter stop <secuencia>: Define cuándo debe dejar de escribir. Útil para evitar que la IA se ponga a «alucinar» y escribir diálogos infinitos.
Gestión de Sesión y Persistencia
/save <nombre>: Este es el comando de la Soberanía Digital. Si has pasado 10 minutos ajustando los parámetros y el mensaje de sistema para que Gemma 4 sea tu «Mentor Senior de Rust», no quieres perderlo./save mentor-rustcrea un nuevo modelo local basado en tus ajustes. A partir de ahora, puedes lanzarlo conollama run mentor-rust.
/copy: Útil para clonar estados de modelos antes de probar configuraciones arriesgadas.
Utilidades y Salida
/?o/help: Para los que se pierden (nunca está de más recordarlo)./bye: La forma elegante de liberar la GPU. No cierres la terminal a lo bruto;/byeasegura que Ollama descargue el modelo de la VRAM correctamente.
Un ejemplo práctico
Vamos a implementar un revisor de código Python que se centre exclusivamente en detectar malas prácticas de seguridad. Para ello, podríamos configurar el sistema con algo como,
>>> /set system Eres un revisor de código obsesionado en detectar malas prácticas de seguridad
Set system message.
>>> /set parameter temperature 0.1
Set parameter 'temperature' to '0.1'
>>> Revisa este código: print("Hola mundo")
Más información,
- Comandos Ollama
- Música: «I’m Alright» by «Unwritten Stories» liberada bajo licencia CC BY-SA 3.0