Se puede reescribir la función check_answer para que sea más legible.
def check_answer(user_input, answer):
return user_input == answer
OpenAI API
¿Cómo usar la API de OpenAI en tu producto?
Conociendo la documentación de la API de OpenAI
Chat Completions: modelos de Chat de OpenAI
Parámetros de Chat Completions: temperature, top_p y n
Aplicación de ejemplo utilizando modelos de OpenAI
Buenas prácticas al usar modelos de OpenAI
Modelos de texto disponibles de OpenAI
Quiz: OpenAI API
Fine-tuning de modelos de OpenAI
¿Por qué hacer fine-tuning a modelos de OpenAI?
Modelos disponibles para fine-tuning en OpenAI
Costos de uso de OpenAI: tokenización de texto
Configuración de entorno local de OpenAI con Anaconda
Formato de datos para fine-tuning
Preparar datos para fine-tuning
Fine-tuning de modelo de OpenAI
¿Cómo usar el Playground de OpenAI para probar modelos?
Pruebas al modelo con fine-tuning
Optimizar el modelo: ajuste de parámetros en Playground
Quiz: Fine-tuning de modelos de OpenAI
Integración de modelo a aplicación de chat
¿Cómo crear un chatbot con Telegram?
Procesando la entrada del usuario para el chatbot
Prueba de envío de mensajes del chatbot
Función main() del chatbot
Integración del modelo de OpenAI a Telegram
Manejo de errores y excepciones de la API de OpenAI
Quiz: Integración de modelo a aplicación de chat
Conclusión
Recomendaciones finales y proyectos alternativos con la API de OpenAI
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
En el mundo de la programación y la inteligencia artificial, uno de los ejercicios más estimulantes e interactivos es la creación de pequeños juegos que ponen a prueba nuestras habilidades lógicas y de codificación. Más aún si involucran tecnologías avanzadas como el uso de APIs para integrar sistemas autónomos de decisión. En este caso, exploraremos cómo crear un juego en Python que emplea la API de OpenAI. Sumérgete en esta actividad práctica donde desarrollaremos un juego de adivinanzas para identificar animales de la selva. Prepárate para combinar tus habilidades de codificación con un poco de intuición natural sobre el mundo animal. ¡Vamos a comenzar!
Antes de sumergirnos en el código, es crucial tener todo listo en nuestro entorno de programación. Google Colaboratory es una excelente opción para desarrollar y probar rápidamente nuestros scripts gracias a su entorno basado en la nube. Debes asegurarte de tener la librería de OpenAI ya instalada e importada, así como tu API key configurada previamente. Esta preparación garantizará un flujo de trabajo sin interrupciones a medida que avanzamos en la creación del juego.
La API de OpenAI será nuestro centro de inteligencia artificial. Para interactuar con ella, es necesario configurarla y autenticarla usando tu clave API. Una vez hecho esto, incluiremos la librería random
para añadir un factor sorpresa al juego: la selección aleatoria del animal sobre el que el jugador tendrá que adivinar. La selección aleatoria es un pilar de la interactividad en muchos juegos y añade un componente único a cada sesión de juego.
Con todo en su lugar, el primer paso es crear la función getClue
, que no recibirá parámetros pero trabajará con una lista predefinida de animales. Tal lista podría incluir un elefante, león, jirafa, hipopótamo y mono. La función seleccionará uno de estos animales de forma aleatoria y proporcionará al usuario una pista inicial: "Este animal vive en la selva". Con ello, el usuario obtiene una dirección en la que iniciar su adivinanza.
Después de generar la pista, es crucial poder verificar si las suposiciones del usuario son correctas. Implementamos la función checkAnswer
para comparar la entrada del usuario con la respuesta real. Un simple True
o False
simplificará el proceso de determinar si el juego continúa o termina con un acierto.
Aquí es donde la API de OpenAI entra en juego a pleno rendimiento. Creamos una función giveProperties
que solicitará al modelo de OpenAI, en este caso "Davinci", que nos de características adicionales del animal sin revelar su nombre. Es importante ser específico en las solicitudes al modelo para obtener pistas útiles y mantener la naturaleza desafiante del juego.
Finalmente, desarrollamos la función playGame
que une todas las piezas. Esta función orquesta el flujo del juego desde la presentación de la pista inicial hasta la verificación de las respuestas y la solicitud de pistas adicionales. Es el corazón del juego, y su implementación adecuada es clave para una experiencia de usuario agradable y funcional.
Un aspecto interesante del juego es la necesidad de una respuesta precisa. Errores comunes como omitir acentos pueden llevar a una respuesta incorrecta, por lo que la atención al detalle es importante. Este enfoque en la precisión ofrece una doble lección: por un lado, la importancia de la cuidadosa entrada de datos y, por otro, una oportunidad para enseñar acerca de la relevancia de la ortografía en la programación.
El juego que hemos descrito proporciona una base sobre la cual podemos construir y mejorar. Puedes ejecutar el código para identificar problemas y depurarlos. Una recomendación es enfocarte en mejorar el PROMPT
para obtener un mejor rendimiento del modelo de OpenAI, lo que podría implicar aprender más sobre Prompt Engineering.
Cada reto en programación es una invitación a aprender y a pulir habilidades. No te detengas aquí. Hay muchos caminos abiertos a explorar, como refinar el juego que acabamos de crear o adentrarte en otros aspectos de la programación e inteligencia artificial. La constancia y la curiosidad serán tus mejores aliados en este apasionante viaje de aprendizaje continuo. ¡Adelante y mucha suerte!
Aportes 19
Preguntas 2
Se puede reescribir la función check_answer para que sea más legible.
def check_answer(user_input, answer):
return user_input == answer
Se puede ser un poco mas flexible dandole roles a modelos como gpt-3.5-turbo
donde las respuestas pueden ir variando de acuerdo a un rango deterministico como es la temperatura:
def give_property(animal):
messages = [
{"role": "system", "content": "Eres un juego que suele deciir propiedades de un animal en forma de pistas, pero no debes decir nunca el nombre del animal"},
{"role": "user", "content": "Dame un caracteristica del animal"},
{"role": "assistant", "content": f"El animal que debes dar pistas es {animal}"},
{"role": "user", "content": "En que animal estoy pensando?"},
]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages,
temperature=1,
)
return response.choices[0].message["content"]
Yo empece a jugar con los parametros frequency_penalty y presence_penalty. Me di cuenta que si el valor es muy alto la pista es muy facil y si es muy bajo usa terminos mas especificos a caracteristicas del animal. Incluso habian casos con valores altos que en la misma caracteristica del animal daba la respuesta.
Esto se debe a la definicion de uso de ambas variables pero sigue siendo algo interesante.
Como aporte, curiosidad o forma alternativa de responder el código.
Desde python 3.8 en adeltante se implemento el operador walrus
en español morza
.
:=
El cuál tiene como función justamente poder asignar Y preguntar algo en una sola expresión.
Normalmente hacemos algo parecido a esto:
edad = 18
if edad >= 18:
....
Creamos una variable, le asignamos un valor y preguntamos algo.
Con walrus
podriamos hacer:
if (edad := 18) >= 18:
Y justamente en este código del juego, queda muy bien el operador walrus
Podemos cambiar:
def play_game():
prompt, answer = get_clue()
print(prompt)
while True:
user_input = input('Ingresa tu respuesta:')
if check_answer(user_input,answer):
print('Correcto! La respuesta era:', answer)
break
else:
print('Respuesta incorrecta. Intentalo de nuevo')
print(give_property(answer))
Por:
def play_game():
# Empezamos con nuestro animal aleatorio y primer pista genérica
first_clue, real_animal = get_base_clue()
print(first_clue)
# Mientras la respuesta del usuario sea diferente al verdadero animal
while (user_input := input("Ingresa tu respuesta: ")) != real_animal:
# Le decimos que se equivocó
print('Respuesta incorrecta. Intentalo de nuevo')
# Y le damos una nueva pista
new_clue = get_new_clue(real_animal)
print(new_clue)
# Si salimos del ciclo while es porque el usuario ha acertado
print('Correcto! La respuesta era:', real_animal)
Nota: he modificado el nombre de las variables para aumentar la legibilidad del código.
Ahora cuentan con una herramienta más de Python 😃
Te gustó?
No olvides visitar mis notas personales de esta clase:
Saludos, Gabriel Ichcanziho.
Revisando en la documentacion, Completion ya aparece como un metodo legacy, y ChatCompletion es el metodo con el que ellos buscan reemplazarlo, ChatCompletion fomenta la conversacion por turnos y la especificacion de roles, les dejo un ejemplo (lo tomo de la documentaicon):
import openai
openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
les dejo el link de la documentacion
Comparto mis cambios del código. Hice otro objeto de Completion para que me diera los 5 animales de forma aleatoria, luego los paso a un list y limpio los strings.
También le doy como primera pista la cantidad de letras del animal y comparo la respuesta poniendo todo en minúscula
def get_clue(): # Elige un animal al azar y comienza con un propmt inicial del juego
animals = openai.Completion.create(
engine = 'text-davinci-003',
prompt = "Dame una lista de 5 animales diferentes separados por espacios no comas",
max_tokens = 60
)
words = list(animals.choices[0].text.split(" "))
words[0] = words[0].replace('\n\n', '')
random_word = random.choice(words)
prompt = 'Adivina la palabra que estoy pensando. Es un animal de {} letras.'.format(len(random_word))
return prompt, random_word
def check_answer(user_input, answer):
return user_input.lower() == answer.lower()
def give_propetry(animal):
response = openai.Completion.create(
engine = 'text-davinci-003',
prompt = 'Dame una característica del animal {}, pero jamás digas el nombre del animal. Un ejemplo incorrecto sería: El león tiene melena'.format(animal),
max_tokens = 100
)
return response.choices[0].text
def play_game():
prompt, answer = get_clue()
print(prompt)
while True:
user_input = input('Ingresa tu respuesta: ')
if check_answer(user_input, answer):
print("Correcto!. Adivinaste, la respuesta era {}".format(answer))
break
else:
print("Respuesta incorrecta. No es la solución inténtalo denuevo. Te daré otra pista: ")
print(give_propetry(answer))
play_game()
En mi caso decidí cambiar el juego para adivinar Pokémons en vez de animales, para ello cambié primero la función get_clue para obtener una lista de los Pokémon de la primera generación:
def get_clue():
url = "https://pokeapi.co/api/v2/pokemon/?limit=151" # Limit set to 151 for Generation I Pokémon
response = requests.get(url)
if response.status_code == 200:
pokemons = response.json()["results"]
else:
print("Failed to fetch Pokémon data. Status code:", response.status_code)
random_pokemon = random.choice(pokemons)
prompt = "It is a first generation Pokémon"
return prompt, random_pokemon["name"]
Adicionalmente, cambié el prompt de la función get_answer de la siguiente forma:
def give_hint(pokemon):
response = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a game that gives the user hints about a pokemon it is trying to guess but you never give the name of the pokemon, also you try to give different hints every time, the pokemon the user is trying to guess is: " + pokemon},
{"role": "user", "content" : "Give me a feature of the pokemon"},
],
max_tokens=50,
temperature=0.9,
)
return response.choices[0].message.content
Y finalmente, cambie la función play para poner un límite de intentos y evitar un uso desmedido de la API:
def play():
prompt, pokemon = get_clue()
print(prompt)
tries = 0
while tries < 7:
tries += 1
answer = input("Answer: ")
if check_answer(answer, pokemon):
print("Correct!")
break
else:
print("Incorrect!")
print(give_hint(pokemon))
Desde el principio dice que es mono 😕
w8, si es la libreria random la que esta eligiendo la palabra con
random_word = random.choice(words)
entonces OpenAI no está eligiendo nada. Me parece importante aclarar esa parte por si hay alguien que desconozca sobre el lenguaje.
Creo que estaria chevere si corrigen el contenido de esta clase, que realmente siento que está bastante enredada en su explicación.
Creo que se puede mejorar la función get_clue() porque tiene 2 responsabilidades: elegir un animal y escribir un primer prompt.
Únicamente para fines de aprendizaje modifiqué la función check_answer para que funcionara con la API de OpenAI y compara sin tener en cuenta acentos o mayúsculas. Comprendo que probablemente no sea lo más optimo, pero lo hice para experimentar con la API
def check_answer(user_input, answer):
response = openai.Completion.create(
engine = 'text-davinci-003',
prompt = f'''
Compara 2 palabras y si son iguales responde solo con un "True" en caso contrario responde solo con "False".
Ejemplo:
Q: palabras a comparar: agua, coca
A: False
Q: palabras a comparar {user_input}: , {answer}
A:
''',
max_tokens = 100
)
if response.choices[0].text == "True":
return True
return False
Tambien se modificó el prompt de la función give_property ya que en ocasiones mencionaba al animal
def give_property(animal):
response = openai.Completion.create(
engine = 'text-davinci-003',
prompt = 'Estás jugando a adivinar animales, debes dar una característica del animal, pero sin mencionar nunca que animal es\n'
+'\nReglas: jamás decir el nombre del animal, decir características del animal\n'
+ 'Dame una característica de: '+ animal,
max_tokens = 100
)
return response.choices[0].text
Resultados:
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?