From 1b5a79be68db2edf457729f1b7b36abf33b7cf7d Mon Sep 17 00:00:00 2001 From: Manuel Vergara Date: Sat, 10 Jun 2023 22:49:39 +0200 Subject: [PATCH] Update python-chatGPT course Signed-off-by: Manuel Vergara --- python-chatgpt/README.md | 62 +++++++++++++++++++- python-chatgpt/img/python-chatgpt13.png | Bin 0 -> 38782 bytes python-chatgpt/img/python-chatgpt14.png | Bin 0 -> 27457 bytes python-chatgpt/src/08_filtrar_respuestas.py | 51 ++++++++++++++-- 4 files changed, 104 insertions(+), 9 deletions(-) create mode 100644 python-chatgpt/img/python-chatgpt13.png create mode 100644 python-chatgpt/img/python-chatgpt14.png diff --git a/python-chatgpt/README.md b/python-chatgpt/README.md index 073cd79..ec10039 100644 --- a/python-chatgpt/README.md +++ b/python-chatgpt/README.md @@ -663,10 +663,66 @@ Y para probarlo, vamos a añadir en las palabras_prohibidas la palabra "paella" ![](img/python-chatgpt12.png) -El fichero del código completo es [filtrar_palabras.py](src/08_filtrar_respuestas.py) - ### 5.2. - Verificar respuestas – Relevancia +Vamos a realizar tres pasos: +- Calcular similitudes +- Vectorizar los valores +- Interceptar la respuesta -### 5.3. - Limitaciones y consideraciones éticas +#### 5.2.1. - Calcular similitudes +Vamos a seguir con el chatbot para añadirle esta funcionalidad. Lo primero es instalar numpy que lo necesitaremos para realizar ciertos calculos. Importamos la biblioteca y le damos un alias: +```python +import numpy as np +``` + +Y vamos a crear una función con algunos principios matemáticos para aplicar a nuestro texto. Vamos a hacer que calcule lo que se llama la similitud coseno de dos vectores. +```python +def similitud_coseno(vec1, vec2): + superposicion = np.dot(vec1, vec2) + magnitud1 = np.linalg.norm(vec1) # Longitud del vector + magnitud2 = np.linalg.norm(vec2) # Longitud del vector + sim_cos = superposicion / (magnitud1 * magnitud2) + return sim_cos +``` + +El resultado de esta operación va a ser un valor entre -1 y uno. Este valor va a indicar la similitud, o sea, entre los dos vectores. + +Si se obtiene un valor uno indica que los vectores son idénticos, que tienen el mismo ángulo si hablamos de números. Mientras que un valor de -1 indicaría que son completamente opuestos, que su ángulo es de 180 grados. +En el caso de los análisis de texto, que es lo que nos interesa a nosotros, los vectores se generan a partir de los textos utilizando un modelo de lenguaje como spacy que tiene la capacidad de convertir cada texto en un vector numérico que representa su contenido semántico, así como lo escuchas 🤯 + +Con lo cuál, la función similitud_coseno puede utilizarse para comparar estos vectores que son textos que han sido convertidos a valores numéricos según su valor semántico y así determinar cómo de similares son, en términos de contenido semántico. + +#### 5.2.2. - Vectorizar los valores + +Ahora, vamos a crear otra función que recogerá la respuesta y la entrada para calcular la similitud_coseno: +def es_relevante(respuesta, entrada, umbral=0.5): +```python +entrada_vectorizada = modelo_spacy(entrada).vector +respuesta_vectorizada = modelo_spacy(respuesta).vector +similitud = similitud_coseno(entrada_vectorizada, respuesta_vectorizada) +return similitud >= umbral +``` + +#### 5.2.3. - Interceptar la respuesta +Ahora ya volvemos al loop que da la dinámica y lógica al chatbot, justo antes de imprimir la respuesta debemos añadir en una variable la llamada a la función anterior y el print y la recogida de respuestas meterlas en un condicional si la respuesta el relevante, según nuestra función. Si es false +```python +relevante = es_relevante(respuesta_gpt, ingreso_usuario) + +if relevante: + print(f"{respuesta_gpt}") + + preguntas_anteriores.append(ingreso_usuario) + respuestas_anteriores.append(respuesta_gpt) +else: + print(Fore.RED + "La respuesta no es relevante ¿podrías reformularla?" + Fore.RESET) +``` + +Le he dado colorcito rojo a la respuesta errónea. Vamos a probarlo. Le pido un poema y le pregunto sobre mi opinión: + +![](img/python-chatgpt13.png) + +Y hasta aquí el curso. ¡Sigue cortando leña! 🪓 + +![](img/python-chatgpt14.png) diff --git a/python-chatgpt/img/python-chatgpt13.png b/python-chatgpt/img/python-chatgpt13.png new file mode 100644 index 0000000000000000000000000000000000000000..d2c9fe365f0029da84ffbbe91f7fe42042a7e296 GIT binary patch literal 38782 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 d*ZsGecozHruHY`xoBu+P<`Gx`rnw8ZQTF> literal 0 HcmV?d00001 diff --git a/python-chatgpt/img/python-chatgpt14.png b/python-chatgpt/img/python-chatgpt14.png new file mode 100644 index 0000000000000000000000000000000000000000..a3467f7eb01b3a1e170e101b2c2eddfb47d159c5 GIT binary patch literal 27457 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 DuW#gy literal 0 HcmV?d00001 diff --git a/python-chatgpt/src/08_filtrar_respuestas.py b/python-chatgpt/src/08_filtrar_respuestas.py index e961842..d21d697 100644 --- a/python-chatgpt/src/08_filtrar_respuestas.py +++ b/python-chatgpt/src/08_filtrar_respuestas.py @@ -5,6 +5,7 @@ Chatbot con OpenAI GPT-3 import openai import os import spacy +import numpy as np from dotenv import load_dotenv from colorama import init, Fore @@ -24,10 +25,43 @@ init() def clearConsole(): - # Función limpiar consola + """ + Limpia la consola + """ + os.system('clear') +def similitud_coseno(vec1, vec2): + """ + Calcula la similitud coseno entre dos vectores + """ + + superposicion = np.dot(vec1, vec2) + magnitud1 = np.linalg.norm(vec1) # Longitud del vector + magnitud2 = np.linalg.norm(vec2) # Longitud del vector + + sim_cos = superposicion / (magnitud1 * magnitud2) + + return sim_cos + + +def es_relevante(respuesta, entrada, umbral=0.2): + """ + Determina si una respuesta es relevante para una entrada + """ + + entrada_vectorizada = modelo_spacy(entrada).vector + respuesta_vectorizada = modelo_spacy(respuesta).vector + + # Ahora que tenemos las anteriores variables transformadas en vectores, + # podemos calcular la similitud coseno + similitud = similitud_coseno(entrada_vectorizada, respuesta_vectorizada) + + # Si la similitud es mayor o igual al umbral, la respuesta es relevante + return similitud >= umbral + + def filtrar_lista_negra(texto, lista_negra): """ Filtra palabras de una lista negra @@ -73,8 +107,8 @@ def preguntar_chat_gpt(prompt, modelo="text-davinci-002"): # Bienvenida clearConsole() -print(Fore.RED + "Bienvenido al chatbot de OpenAI GPT-3." + Fore.RESET) -print(Fore.RED + "Escribe \"salir\" cuando quieras terminar la conversación." + Fore.RESET) +print(Fore.BLUE + "Bienvenido al chatbot de OpenAI GPT-3." + Fore.RESET) +print(Fore.BLUE + "Escribe \"salir\" cuando quieras terminar la conversación." + Fore.RESET) # Loop para controlar el flujo de la conversación while True: @@ -94,7 +128,12 @@ while True: conversacion_historica += prompt respuesta_gpt = preguntar_chat_gpt(conversacion_historica) - print(f"{respuesta_gpt}") + relevante = es_relevante(respuesta_gpt, ingreso_usuario) - preguntas_anteriores.append(ingreso_usuario) - respuestas_anteriores.append(respuesta_gpt) + if relevante: + print(f"{respuesta_gpt}") + + preguntas_anteriores.append(ingreso_usuario) + respuestas_anteriores.append(respuesta_gpt) + else: + print(Fore.RED + "La respuesta no es relevante ¿podrías reformularla?" + Fore.RESET)