570 - Dominando Linux con la IA y Telegram
Te muestro como puedes dominar #linux, #python, incluso el inglés utilizando la inteligencia artifical #ia con #chatgpt y un #bot de #telegram
Esto no es nada nuevo, hace unos meses leí un Tweet de Macjosan, contando que su hijo había creado un ChatGPT para que le explicara las cosas que no entiende de física, y le estaba yendo fantástico, porque mientras otros chicos iban a academia, el se lo estaba preparando de esta manera. Esto me hizo darle una vuelta adicional a algunas cosas que estaba haciendo en el grupo de Telegram de atareao con Linux. Así que hoy te voy a contar como puedes exprimir ChatGPT con Python y Telegram.
Dominando Linux con Inteligencia Artifical y Telegram
Un paseo por el pasado
Hace ya algún tiempo implementé un bot de Telegram, que cada cierto tiempo publicaba un truco de Bash. El objetivo básico de este bot, y de los últimos que estoy haciendo, es el de dinamizar el grupo, y conseguir que todos participemos un poco mas. Por ejemplo, en el caso de este bot de publicación de trucos de Bash, envía mensajes como este,
Tip: Como calcular la suma de los números impares en un archivo
Esto lo hice mediante una sencilla base de datos SQLite, donde he guardado previamente cada uno de los consejos. De forma que cada vez que publico un nuevo consejo, truco, o mensaje, lo marco en la base de datos como publicado, y luego solo tengo que seleccionar aquellos que todavía no he publicado.
Esto como te puedes imaginar, lleva un proceso costoso, porque tienes que crear por un lado la base de datos, y por otra alimentarla de todos esos trucos. Y claro, tampoco te puedes explayar, en lo que dices, o al menos sin una inversión de tiempo considerable.
Gabinete de expertos
Con las ideas de la introducción, lo que pensé es por un lado, aumentar la información que se proporciona en cada truco, y por otro lado, añadir ejemplos y mejorar la legibilidad, que fuera mas humano.
En este caso, lo que he implementado ha sido un gabinete de expertos, de forma que cada uno de ellos te va a hablar sobre un tema concreto. De esta forma, tu creas un prompt indicando como se tiene que comportar el experto, y luego le lanzas la cuestión concreta.
Así, implementé tres expertos, de los que por ahora solo he puesto uno, que está bajo estrecha vigilancia. En concreto un experto en shell. Este experto todos los días nos pone un consejo sobre un comando concreto, y nos da, una explicación del mismo, sobre que shell se aplica y algunos ejemplos prácticos.
Actualmente, los comandos, los tengo puesto a fuego en el propio código del bot, pero, evidentemente lo tengo que extraer de ahí, y a ser posible utilizar una solución similar a la anterior. Me refiero, a utilizar una base de datos, que puede ser SQLite o otra.
En principio me decanto por SQLite porque no tengo que levantar infraestructura adicional, pero como me emocione mucho, verás donde llegaremos.
Además del experto en Shell, estoy en pruebas con dos expertos mas, uno en Docker, como no podía ser de otra manera, y un segundo experto en Neovim.
Un poquito de Python
Respecto a lo que estoy utilizando para el bot, básicamente he utilizado un par de módulos, o al menos son los que llaman la atención.
fastapi
. Este módulo me permite levantar una API de forma tremendamente sencilla, y es la que va a permitirme interrelacionarme con otros contenedores. Además, y en segundas versiones, me permitirá alimentar a los expertos con mas información, por ejemplo, los comandos de Bash, o cualquier otra cuestión similar.httpx
. Este módulo es el que he utilizado en este caso para realizar las llamadas a Telegram. Se trata de un módulo similar arequests
pero que permite el uso de asincronía, que últimamente estoy utilizando hasta en la sopa.
Archivo de configuración
Para la configuración del Bot he utilizado un archivo con formato toml. Fíjate que ahora que lo ha cogido Python como formato por defecto, es la nueva manía que me ha entrado, aunque, te tengo que confesar, que desde siempre, lo que mas me ha convencido ha sido el formato json.
En ese archivo de configuración se encuentra tanto los credenciales, como otros detalles necesarios para OpenAI, así como los credenciales de Telegram, en concreto el token del Bot, así como la configuración de los distintos expertos. Para cada uno de lo expertos he definido los siguientes campos,
nombre
, simplemente el nombre del botprompt
el prompt en el que definimos el comportamiento de nuestro asistente de OpenAI.question
la pregunta que formulamos al asistente de OpenAI, con todos los detalles pertinentes, para que nos de la respuesta en la línea de lo que queremos. Por ejemplo, en el caso del experto en Bash, nos da una explicación del comando, nos indica en que shell, se puede utilizar, igualmente, nos indica algunos ejemplos, y por último hace un script con su uso.chat_id
este es el identificador del chat de Telegram en el que se va a publicar.thread_id
el hilo dentro del chat de Telegram en el que se va a publicar, lo que nos permite publicar los mensajes en distintos, hilos y tener dinamizadas varias líneas de nuestro grupo de Telegram.
Estoy dando muchas vueltas al asunto de chat_id
y thread_id
, y esto definitivamente lo voy a quitar de la configuración del experto y se lo voy a pasar directamente en la llamada. Esto me permitirá publicar en varios grupos o incluso en varios hilos. La verdad es que no tengo muy claro porque le he dado estas propiedades al experto.
cronirs
Ahora viene el asunto de como conseguir que nuestro experto publique una o varias veces al día y en momentos concretos. Para hacer esto, he utilizado una herramienta que publiqué hace algún tiempo, que no es otra cosa que un cron. La ventaja de este cron, es que nos permite meterla en un contenedor, y de esta forma no contaminar el cron de la máquina host.
Además este cron permite definir acciones en intervalos de segundos, aunque evidentemente esto no es lo que quiero utilizar, claro. Por ejemplo, el que estoy utilizando actualmente es de la siguiente forma,
0 0 17 * * *;curl http://expertos:8000/post/shell
De forma que todos los días a las 17:00 publica algo en el grupo.
docker
Por supuesto que todo esto está en contenedores Docker, me refiero tanto al bot como a cronirs
, además en un docker-compose
como el que te indico a continuación,
version: '3.7'
services:
croni_for_expertos:
image: atareao/cronirs:v0.2.1
container_name: cronirs_for_expertos
init: true
restart: unless-stopped
depends_on:
- expertos
networks:
- internal
environment:
- TZ=Europe/Madrid
- CRONTAB=/app/crontab.txt
- LOG_LEVEL=debug
volumes:
- ./crontab.txt:/app/crontab.txt
expertos:
image: atareao/expertos:v0.1.0
container_name: expertos
restart: unless-stopped
init: true
environment:
- TZ=Europe/Madrid
volumes:
- ./config.toml:/app/config.toml
networks:
- internal
networks:
internal: {}
Con lo que ponerlo a funcionar es cuestión de indicar en crontab.txt cuando quieres publicar, y de añadir los credenciales en el archivo config.toml
. Y por supuesto levantarlo con un docker compose up -d
. Con esto, ya tendrías tu propio experto
en funcionamiento
Más información,