ChatGPT en python
Tags: python, ai, beginners, tutorial
Published: 2023-01-31 23:15:47

#### Está todo el mundo pidiéndole chistes o haciéndole confundir con acertijos. Pero en esta ocasión vamos a estar embebiendo la IA de moda a un script de python para poder hacer (finalmente) algo útil con ella y sumarla a nuestros proyectos. Pero primero...

## ¿Qué es ChatGPT?
Quién mejor que el propio bot para responder esta pregunta:

!["ChatGPT responde qué es ChatGPT"](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/njn6ajnr8lqq9nv6d4in.png)<figure>
  <figcaption>ChatGPT responde qué es ChatGPT</figcaption>
</figure>

## ¿Cómo lo agregamos a nuestro código?

Para este artículo vamos a estar utilizando la librería `pyChatGPT` que es muy sencilla de implementar y usar.

Como siempre, lo primero que se hace es instalar la nueva librería e importarla:
```py
!pip install pyChatGPT
import pyChatGPT
```

### Iniciar sesión con token 

Para poder acceder a las características de ChatGPT es necesario iniciar sesión. Hay dos formas de hacerlo, a través de las credenciales de un mail o a través de un token de sesión (que es que vamos a estar usando porque no logré hacer funcionar mi mail 😐)

Para obtener un token de sesión hay que entrar en [chat.openai.com](chat.openai.com), iniciar una conversación e inspeccionar la página. Luego tomamos el código que se indica en la captura.

!["El token de sesión es el texto que está seleccionado"](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ztc8rvh72zvzsj5w486b.png)<figure>
  <figcaption>El token de sesión es el texto que está seleccionado</figcaption>
</figure>

Y lo pegamos en el código. Que quedaría de la siguiente manera:

```py
session_token = "pegar token"

session_api = pyChatGPT.ChatGPT(session_token=session_token)
```

### Chateando con ChatGPT

Para finalmente poder interactuar con ChatGPT, solo necesitamos dos métodos: `.send_message()` y `.get()`.
```py
pregunta = session_api.send_message(input())

respuesta = "".join(pregunta.get("message"))
```
Y listo.

Pero para hacer la experiencia de usuario más amigable vamos a hacer que el script le de un poco de conversación al usuario.

También vamos a implementar la posibilidad de guardar la pregunta que hicimos junto con la respuesta que recibimos.

## ¿Cómo guardamos nuestras interacciones en un archivo local?

### Almacenando las preguntas y respuestas

Cuando pensaba en lo que quería hacer con ChatGPT lo primero que pensé es en que quería guardar cada una de las preguntas y las respuestas. Además de eso, quería tener la fecha y hora en que fue realizada la consulta y la posibilidad de agregar etiquetas para poder catalogar las respuestas más en detalle. 

Por lo que en principio tendríamos cuatro columnas: "Pregunta", "Respuesta", "Fecha y hora" y "Etiquetas".

#### Crear listas vacías

El primer paso es tan simple como crear una lista por cada columna:
```py
_preguntas = []
_respuestas = []
_fechaHora = []
_etiqueta = []
```
Donde vamos a almacenar cada uno de los datos cada vez que el chat nos responda.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0t0fvb724d17mexpyv94.png)<figure>
  <figcaption>[Link a GitHub](https://github.com/ruizleandro/chatgpt_en_python)</figcaption>
</figure>

### Armar una iteración por cada consulta
Vamos a crear un loop donde cada vez que obtenemos una respuesta, el script nos pregunta si queremos realizar una nueva pregunta.
Esto quedaría más o menos así:

```py
run = True
while run:
    # ingresar mensaje
    pregunta = input()

    # haciendo request
    respuesta = session_api.send_message(pregunta)

    # obtener respuesta
    respuesta = "".join(respuesta.get("message"))
    # imprimir respuesta
    print(respuesta)

    # preguntar si el usuario continua
    run = bool(input("¿Desea continuar? "))
    print()
# despedida
print("¡Hasta luego!")
```
El siguiente paso es que en cada iteración guarde la fecha y hora (para esto se necesita importar el módulo `time`) de la consulta y que el script pregunte si se desea añadir etiquetas a la respuesta obtenida y guardar todos estos datos en la listas que se crearon anteriormente:

```py
import time

run = True
while run:
    # ingresar mensaje
    pregunta = input()

    # haciendo request
    respuesta = session_api.send_message(pregunta)

    # obtener respuesta
    respuesta = "".join(respuesta.get("message"))
 
    # imprimir respuesta
    print()
    print(respuesta)
    # obtener fecha y hora
    ahora = time.strftime("%d/%m/%y") + " " + time.strftime("%H:%M:%S")
    
    # preguntar si el usuario quiere guardar la pregunta y respuesta
    guardarPregunta = input("¿Desea guardar esta respuesta?: ")
    if guardarPregunta.lower() == "si":
        # guardar pregunta y respuesta
        _preguntas += [pregunta]
        _respuestas += [respuesta]
        # guardar hora de ejecucion
        _fechaHora += [ahora]

        # agregar etiquetas
        agregarEtiqueta = input("¿Desea agregar alguna etiqueta? ")
        if agregarEtiqueta.lower() == "si":
            nuevaEtiqueta = input("Escriba el nombre de la etiqueta (puede agregar varias separandolas con una coma): ")
            _etiqueta += [nuevaEtiqueta]
        else:
            _etiqueta += [""]
	# para crear un pandas dataframe se necesita que cada lista tenga la misma longitud
	# por eso se crea una etiqueta vacía en caso de que no se requiera

    # preguntar si el usuario continua
    run = bool(input("¿Desea continuar? "))
    print()

print("¡Hasta luego!")
```

### Guardar las interacciones en una tabla
Una vez que se chateó con la IA es hora de exportar los datos que se decidieron guardar hacia un pandas dataframe.
Se guardan las listas dentro de un diccionario y lo convertimos a un dataframe:

```py
import pandas as pd

historial = {"Pregunta": _preguntas, 
             "Respuesta": _respuestas,
             "Fecha y hora": _fechaHora,
             "Etiquetas": _etiqueta}

# crear pandas dataframe con las listas
df_historial = pd.DataFrame(historial)

df_historial
```

### Exportar la tabla a un archivo local

Para exportar un archivo lo primero que necesitamos es la dirección en la que se va a encontrar el archivo. En mi caso lo voy a guardar en la misma carpeta que el proyecto por lo que no tengo que escribir la dirección completa:

```py
import os
from pathlib import Path

# el nombre que tiene el archivo final
nombre_archivo = "Historial chatGPT.xlsx"

# obtener carpeta donde se encuentra el proyecto
project_root = os.path.dirname(os.path.dirname(__file__))
carpeta_proyecto = os.path.join(project_root, 'Proyecto ChatGPT')
                     
direccion_archivo = Path(os.path.join(carpeta_proyecto), nombre_archivo)
```
Y en este momento se abren dos posibilidades: el archivo existe o no. Para la primera opción lo que buscamos es que actualice el archivo anexando las nuevas interacciones. Y para la segunda necesitaríamos que cree el archivo y que guarde las interacciones que obtuvimos.

> ### Probando ChatGPT para desarrollar en python
> Mientras armaba este script y llegué a esta parte comencé a googlear como verificar que un archivo existía en determinada ubicación y si la respuesta era negativa que lo creara. 
> Estuve más de media hora probando varias maneras que encontré hasta que recordé que ¡podía preguntarle a ChatGPT! 
> Por lo que le pregunté y el código que me proporcionó funcionó perfectamente y es el que vas a ver a continuación.

```py
# a partir de acá el código fue generado por chatgpt (solo traduje lo que podía al español)

try:
    # verifica si existe "HistorialChatGPT.xlsx" en la carpeta del proyecto
    if os.path.exists(direccion_archivo):
        # lee el archivo existe
        archivo_existente = pd.read_excel(direccion_archivo)
        # anexa la nueva info en el excel
        actualizar_archivo = pd.concat([archivo_existente, df_historial], ignore_index=True)
        # sobreescribe el archivo con la nueva info
        actualizar_archivo.to_excel(direccion_archivo, index=False)
        print("Se actualizó el archivo correctamente.")
    # si no existe lo crea con los datos que guardó
    else:
        df_historial.to_excel(direccion_archivo, index=False)
        print("Se creó el archivo exitosamente.")
# excepción por si el archivo existe y está abierto
except PermissionError:
    print("Por favor cierre el archivo antes de efectuar los cambios.")
```

## Conclusión

¿Se puede hacer mejor? ¡Claro que sí! Pero lo hice en tres días  y hace más de un año que no programaba en python. 😅 
Te invito a dejar en los comentarios si se te ocurre alguna forma de mejorar este mini proyecto. 
¡Muchas gracias por llegar hasta acá!