GPT-3. Bot de Telegram

GPT-3. Bot de Telegram

La semana pasada vi una publicación sobre una plataforma o mas bien un pseudo contacto de whatsapp llamada God in a Box, básicamente te crea un chat personal con un bot de chat GPT-3.

God in a Box se ve interesante, el problema es la limitación de solo poder enviar 10 mensajes de manera gratuita o pagar 10 dolares al mes, muy caro a mi gusto pero es una buena opción.

El bot es muy sencillo de usar simplemente le envías texto y la AI de Chat GPT-3 hace el resto, por otro lado hacer un bot para Telegram es mas sencillo aun, para hacer uno hay que usar otro bot y listo.

Crear un bot de Telegram

Crear un bot para Telegram es sencillo, solo hay que hacer uso de BotFather (un bot para crear bots) @BotFather, no voy a entrar en detalles pero solo hay que seguir los pasos, elegir un nombre, una descripción y tal vez una foto de perfil y eso es todo.

Lo que no es sencillo es darle funcionalidad para ello hay que hacer uso de las apis de Telegram y también desarrollar un servicio rest para recibir los mensajes del bot, así como fotos archivos y todo lo que puede enviar y recibir un chat de Telegram, aquí pueden revisar la documentación de las apis.

Una vez creado el bot con BotFather, lo que recibes es una key para acceder al bot y darle funcionalidad, hay dos maneras una mediante muchas llamadas a la api de Telegram (documentación aquí), lo que es muy ineficiente y la otra decirle a Telegram que te envié los mensajes a tu propio servicio (documentación aquí).

Para este caso use la segunda opción.

Chat GPT

Chat GPT se ha vuelvo muy relevante en las ultimas semanas por todas las funcionalidades y usos que se le puede dar, uno de estos usos es el chat donde puedes preguntarle a la IA casi cualquier cosa con resultados bastantes sorprendentes.

Puedes usar el chat en esta dirección aun que con ciertas limitaciones debido a la alta demanda del mismo.

La otra opción es pagando por el acceso a sus apis lo cual no es nada barato si se usa de manera intensiva, no es este el objetivo del bot, ademas si te registras por primera vez te regalan 18 dolares. Los precios se pueden consultar aquí.

Como ven en la captura, los precios varían en función del modelo y se cobra por cada 1000 tokens, siendo Davinci el mas caro y el mas capaz, aproximadamente 750 palabras equivalen a 1000 tokens de uso por lo que dependiendo de lo que le preguntes y lo que te responda se harán uso de mas o menos tokens.

Apis de OpenAI GPT-3

Las apis de OpenAI GPT-3 tienen soporte para Python, NodeJS y llamadas directas por http rest, pero indagando vi que al final las librerías solo son un wrapper para esto ultimo.

Yo use las de NodeJS, pero es probable que use directamente las llamadas Rest ya que detecte ciertos errores que no eran controlados por mi código y prefiero controlarlos, de todos modos estas librerías usan Axios por detrás al igual que el código para comunicarme con las apis de Telegram.

Chat GPT-3, ejemplo codigo nodejs

La captura de arriba es una porción del código de ejemplo, pueden ver la documentación aquí.

Las partes mas importantes son:

  • model: el modelo de IA que quieras utilizar.
  • prompt: texto que se le envia a la IA ya sea una pregunta o cualquier cosa que se te ocurra.
  • temperature: básicamente es la manera en que la IA te dará respuestas, un valor 0 significa que obtendrás respuestas mas concisas y menos creativas y según la documentación 0.9 serán respuestas algo mas creativas.
  • max_token: esta es la mas importante por que limitara el uso excesivo de tokens lo que conlleva un riesgo menor de pagar demasiado dinero, pero también puede ser que obtendrás respuestas cortadas literalmente.

Hay otras propiedades que yo use, como stop o user, este ultimo sirve para que los servicios de OpenAI puedan identificar abusos y quien esta enviando los mensajes.

La api que se usa es la de “completion“, no es la misma que usa la plataforma de chat, es mas bien una api para generar texto o dar sugerencias, pero el bot y “chat” no recuerda nada ni tiene contexto de conversaciones como la plataforma de OpenAI.

Código Fuente

Este proyecto no tiene mas pretensiones que diversión, por lo que si bien es funcional no esperen funcionalidades extras ni nada, simplemente le envías un texto al bot y este texto se envía a Chat GPT-3 y te da una respuesta.

Pueden clonar el código fuente aquí.

No esta desarrollado bajo ningún framework tipo Express, esta en vanillaJS usando directamente las apis de NodeJS, un ejemplo aquí.

Instalar dependencias.

$ npm install

Para levantar el servicio hay que ejecutar el archivo index.js, el cual se ejecuta en el puerto 3000

$ node index.js

Variables de entorno

El código tiene unas variables de entorno para poder cambiar ciertas configuraciones sin tener que desplegar o reescribir nuevamente.

  • ALLOWED_USERS: string separado por comas donde están los id de usuario permitidos en el bot.
  • OPENAI_MODEL: nombre del modelo GPT-3 a usar, por defecto davinci.
  • OPENAI_API_KEY: api key para poder acceder a los servicios de openAI.
  • OPENAI_MAX_TOKENS: numero máximo permitido de tokens al momento de usar las apis, por defecto 60 tokens.
  • OPENAI_FREQUENCY_PENALTY: por defecto 0.
  • OPENAI_PRESENCE_PENALTY: por defecto 0.
  • TELEGRAM_BOT_TOKEN: el api del bot de Telegram para el acceso a los servicios de Telegram.

Las variables se pueden configurar como desees simplemente siguiendo los lineamientos de Telegram y Chat GPT-3.

Request Methods

El servicio solo consta de un método funcional que es el método post en la ruta /update.

curl --location --request POST 'http://localhost:3000/update' \
--header 'Content-Type: application/json' \

El path update retorna un json con tres propiedades:

"telegramIn": {} //objeto de entrada, es el objeto que envia telegram,
"telegramOut": {} //objeto que retorna las apis de telegram,
"openAI": {} //objeto que retorna las apis de openai,
"errors": [] //array de mensajes de errores

El método GET solo funciona en el index y es para obtener “algo” lo único que retorna es Not Found 404.

Quien aplica esta lógica es un switch dentro del index que se encarga de revisar que verbo http es el que llega en el request.

Lógica

index.js

Archivo que tiene el objeto que crea el servicio http, solo tiene un switch para determinar el verbo http y la lógica a ejecutar.

update.js

  • telegramUpdate: método expuesto que se usa en el archivo index.js y solo recibe el objeto body que envía Telegram, la estructura se encuentra aquí.
  • openaiComplete: método donde se envía los datos hacia OpenAI, basicamente el texto que interpretara la AI.
  • telegramSendMsg: lógica donde se envía la respuesta de GPT-3 hacia el usuario que uso el bot en Telegram, puede enviar cualquier texto hacia cualquier usuario de Telegram usando su ID de usuario.

constants.js

Este es un archivo muy simple que tiene un objeto con propiedades donde se guardaran las variables de entorno, que luego puedan ser usados en cualquier parte del código.

updatePayload.json

Contiene ejemplos de entradas y salidas para los test unitarios. También se pueden copiar estas propiedades json para probar mediante alguna app como Postman el servicio.

Comandos

Iniciar servicio.

$ npm run start

Ejecutar test unitarios.

$ npm run tests

Ejecutar fix prettier

$ npm run prettier.w

Hoja de ruta

El código como mencione antes no tiene mas pretensiones que diversión y tener mi propio asistente en Telegram, pero tengo algunas ideas para ampliar las funcionalidades.

Actualmente el servicio lo tengo montado en la nube de Azure mediante el servicio de Web Apps, en la capa gratuita que da 60 minutos de uso de cpu al día, lo cual es mas que suficiente para un uso personal y normal del bot.

  • Integrar Mongodb para guardar la salida del path update, esto a modo de registro de logs.
  • Faltan test unitarios para algunos bloques de código, como el de los errores.
  • Cuando las apis de Chat GPT sean publicas tal vez las implemente aquí. (recuerden que el bot implementa completion, no es el mismo del chat).