diff --git a/python-chatgpt/README.md b/python-chatgpt/README.md index 84feddf..073cd79 100644 --- a/python-chatgpt/README.md +++ b/python-chatgpt/README.md @@ -617,5 +617,56 @@ El fichero del código completo es [traducir_texto.py](src/07_traducir_texto.py) ## TEMA 5 - Otras consideraciones para la integración +### 5.1. - Filtrar respuestas – Palabras prohibidas + +Vamos a recuperar el código del chatbot que creamos y le vamos a añadir la biblioteca spacy, que nos ayudará al procesamiento del lenguaje natural. Así que importamos spacy, añadimos la variable cargando el modelo de procesamiento de lenguaje natural y otra de palabras_prohibidas: +```python +import spacy +modelo_spacy = spacy.load("es_core_news_md") +palabras_prohibidas = ["palabra1", "palabra2"] +``` + +En palabras_prohibidas hemos creado una lista ficticia pero estás palabras podrían ser palabras malsonantes, palabras de la competencia, palabras de jerga o cualquier listado que creamos que no debe salir en el output que nos devuelve chatgpt. + +Ahora vamos a crear la función para el filtrado: +```python +def filtrar_lista_negra(texto, lista_negra): + token = modelo_spacy(texto) + resultado = [] + for t in token: + # Si el token no está en la lista negra, agregarlo al resultado + if t.text not in lista_negra: + resultado.append(t.text) + else: + resultado.append("[xxxxx]") + + return " ".join(resultado) +``` + +Ahora tenemos que retocar la función preguntar_chat_gpt para que llame a la función nueva de filtrado en cada respuesta cambiando el return que teníamos: +```python +respuesta_sin_filtrar = respuesta.choices[0].text.strip() +respuesta_filtrada = filtrar_lista_negra(respuesta_sin_filtrar, palabras_prohibidas) +return respuesta_filtrada +``` + +Antes de hacer la prueba, y para que quede más despejada la ejecución del programa en la terminal, vamos a añadir una función que limpie el terminal con la biblioteca que tenemos importada os: +```python +def clearConsole(): + # Función limpiar consola + os.system('clear') +``` + +Vamos a llamarla al inicio de la dinámica del programa, antes de la bienvenida. + +Y para probarlo, vamos a añadir en las palabras_prohibidas la palabra "paella" y le vamos a preguntar por el plato típico valenciano: + +![](img/python-chatgpt12.png) + +El fichero del código completo es [filtrar_palabras.py](src/08_filtrar_respuestas.py) + +### 5.2. - Verificar respuestas – Relevancia +### 5.3. - Limitaciones y consideraciones éticas + diff --git a/python-chatgpt/img/python-chatgpt12.png b/python-chatgpt/img/python-chatgpt12.png new file mode 100644 index 0000000..6aa5b33 Binary files /dev/null and b/python-chatgpt/img/python-chatgpt12.png differ diff --git a/python-chatgpt/src/08_filtrar_respuestas.py b/python-chatgpt/src/08_filtrar_respuestas.py new file mode 100644 index 0000000..e961842 --- /dev/null +++ b/python-chatgpt/src/08_filtrar_respuestas.py @@ -0,0 +1,100 @@ +""" +Chatbot con OpenAI GPT-3 +""" + +import openai +import os +import spacy +from dotenv import load_dotenv +from colorama import init, Fore + +load_dotenv() +api_key = os.getenv("OPENAI_API_KEY") + +openai.api_key = api_key + +preguntas_anteriores = [] +respuestas_anteriores = [] +modelo_spacy = spacy.load("es_core_news_md") +palabras_prohibidas = ["palabra1", "palabra2", "paella"] + + +# Inicializar colorama +init() + + +def clearConsole(): + # Función limpiar consola + os.system('clear') + + +def filtrar_lista_negra(texto, lista_negra): + """ + Filtra palabras de una lista negra + """ + + # Separar el texto en tokens + token = modelo_spacy(texto) + # Crear una lista vacía para guardar los tokens permitidos + resultado = [] + + for t in token: + # Si el token no está en la lista negra, agregarlo al resultado + if t.text not in lista_negra: + resultado.append(t.text) + + else: + # Si el token está en la lista negra, agregarlo al resultado + resultado.append("[xxxxx]") + + return " ".join(resultado) + + +def preguntar_chat_gpt(prompt, modelo="text-davinci-002"): + """ + Pregunta a la API de OpenAI GPT-3 + """ + + respuesta = openai.Completion.create( + engine=modelo, + prompt=prompt, + n=1, + temperature=1, + max_tokens=150 + ) + + respuesta_sin_filtrar = respuesta.choices[0].text.strip() + + respuesta_filtrada = filtrar_lista_negra( + respuesta_sin_filtrar, palabras_prohibidas) + + return respuesta_filtrada + + +# 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) + +# Loop para controlar el flujo de la conversación +while True: + + conversacion_historica = "" + + ingreso_usuario = input(Fore.MAGENTA + "Tú: " + Fore.RESET) + + if ingreso_usuario == "salir": + break + + for pregunta, respuesta in zip(preguntas_anteriores, respuestas_anteriores): + conversacion_historica += f"{Fore.BLUE}Usuario pregunta: {Fore.RESET}{pregunta}" + conversacion_historica += f"{Fore.GREEN}Bot responde: {Fore.RESET}{respuesta}\n" + + prompt = f"{Fore.CYAN}Usuario pregunta: {Fore.RESET}{ingreso_usuario}" + conversacion_historica += prompt + respuesta_gpt = preguntar_chat_gpt(conversacion_historica) + + print(f"{respuesta_gpt}") + + preguntas_anteriores.append(ingreso_usuario) + respuestas_anteriores.append(respuesta_gpt)