Update python-chatGPT course
Signed-off-by: Manuel Vergara <manuel@vergaracarmona.es>
This commit is contained in:
parent
ce1df90cb1
commit
91154fa094
@ -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
|
## 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
|
||||||
|
|
||||||
|
BIN
python-chatgpt/img/python-chatgpt12.png
Normal file
BIN
python-chatgpt/img/python-chatgpt12.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
100
python-chatgpt/src/08_filtrar_respuestas.py
Normal file
100
python-chatgpt/src/08_filtrar_respuestas.py
Normal file
@ -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)
|
Loading…
Reference in New Issue
Block a user