Rompiendo el OpenAI (Python) API
Rompiendo OpenAI (Python) API
Una introducción completa y amigable para principiantes con código de ejemplo
Este es el segundo artículo de una serie sobre el uso de Modelos de Lenguaje Amplios (LLMs, por sus siglas en inglés) en la práctica. Aquí presento una introducción amigable para principiantes a la API de OpenAI. Esto te permite ir más allá de las interfaces de chat restrictivas como ChatGPT y obtener más provecho de los LLMs para tus casos de uso únicos. Se proporciona a continuación código de ejemplo en Python y en el repositorio de GitHub.
Tabla de contenidos:
- ¿Qué es una API?
- API de OpenAI (Python)
- Empezando (4 pasos)
- Código de ejemplo
En el primer artículo de esta serie, describí la Ingeniería de Prompts como la forma más accesible de usar LLMs en la práctica. La forma más fácil (y popular) de hacer esto es a través de herramientas como ChatGPT, que proporcionan una forma intuitiva, gratuita y sin código de interactuar con un LLM.
Una introducción práctica a los LLMs
3 niveles de uso de LLMs en la práctica
towardsdatascience.com
Sin embargo, esta facilidad de uso tiene un costo. Es decir, la interfaz de chat es restrictiva y no se traduce bien a muchos casos de uso prácticos, como construir tu propio bot de soporte al cliente, realizar análisis de sentimiento en tiempo real de reseñas de clientes, etc.
En estos casos, podemos llevar la Ingeniería de Prompts un paso más allá e interactuar con LLMs de forma programática. Una forma de hacer esto es a través de una API.
- Crea tu primera aplicación de Deep Learning en menos de una hora
- Transparencia de la IA y la necesidad de modelos de código abierto
- Conoce LLaMaTab Una extensión de Chrome de código abierto que ejecu...
1) ¿Qué es una API?
Una interfaz de programación de aplicaciones (API) te permite interactuar con una aplicación remota de forma programática. Si bien esto puede sonar técnico y aterrador, la idea es muy simple. Considera la siguiente analogía.
Imagina que tienes un antojo intenso de las pupusas que comiste durante ese verano en El Salvador. Desafortunadamente, estás de vuelta en casa y no sabes dónde encontrar buena comida salvadoreña. Afortunadamente para ti, sin embargo, tienes un amigo superfanático de la comida que conoce todos los restaurantes de la ciudad.
Entonces, le envías a tu amigo el mensaje de texto.
“¿Conoces buenos lugares de pupusas en la ciudad?”
Luego, un par de minutos después, recibes la respuesta.
“¡Sí! ¡Flavors of El Salvador tiene las mejores pupusas!”
Aunque esto puede parecer irrelevante para las APIs, esto es esencialmente cómo funcionan. Envías una solicitud a una aplicación remota, es decir, envías un mensaje de texto a tu amigo superfanático de la comida. Luego, la aplicación remota te envía una respuesta, es decir, el mensaje de vuelta de tu amigo.

La diferencia entre una API y la analogía anterior es que en lugar de enviar la solicitud con la aplicación de mensajes de texto de tu teléfono, utilizas tu lenguaje de programación favorito, como Python, JavaScript, Ruby, Java, etc. Esto es genial si estás desarrollando software donde se requiere alguna información externa, ya que la obtención de información se puede automatizar.
2) API de OpenAI (Python)
Podemos utilizar APIs para interactuar con Modelos de Lenguaje Amplios. Una popular es la API de OpenAI, donde en lugar de escribir preguntas en la interfaz web de ChatGPT, puedes enviarlas a OpenAI y recibir respuestas utilizando Python.

Esto brinda acceso prácticamente a cualquier persona a LLMs de última generación (y otros modelos de ML) sin tener que aprovisionar los recursos computacionales necesarios para ejecutarlos. La desventaja, por supuesto, es que OpenAI no hace esto como una caridad. Cada llamada a la API tiene un costo, pero hablaremos más de eso en un momento.
Algunas características destacadas de la API (no disponibles con ChatGPT) se enumeran a continuación.
- Mensaje del sistema personalizable (esto se establece en algo como “Soy ChatGPT, un modelo de lenguaje grande entrenado por OpenAI, basado en la arquitectura GPT-3.5. Mi conocimiento se basa en la información disponible hasta septiembre de 2021. La fecha de hoy es 13 de julio de 2023.” para ChatGPT)
- Ajuste de los parámetros de entrada como la longitud máxima de respuesta, el número de respuestas y la temperatura (es decir, la “aleatoriedad” de la respuesta).
- Incluir imágenes y otros tipos de archivos en los inicios
- Extraer incrustaciones de palabras útiles para tareas posteriores
- Entrada de audio para transcripción o traducción
- Funcionalidad de ajuste fino del modelo
La API de OpenAI tiene varios modelos entre los cuales elegir. El mejor modelo a elegir dependerá de su caso de uso particular. A continuación se muestra una lista de los modelos disponibles actualmente [1].
![Lista de modelos disponibles a través de la API de OpenAI hasta julio de 2023. Imagen del autor. [1]](https://miro.medium.com/v2/resize:fit:640/format:webp/1*DDldra_REDf4A_bBdW0McA.png)
Nota: Cada elemento mencionado anteriormente va acompañado de un conjunto de modelos que varían en tamaño y costo. Consulte la documentación para obtener la información más reciente.
Precio y Tokens
Aunque la API de OpenAI brinda a los desarrolladores un fácil acceso a modelos de ML de última generación, una desventaja evidente es que tiene un costo. El precio se calcula en función de los tokens utilizados (no, no me refiero a los tokens no fungibles o algo que se usa en los juegos arcade).
Los tokens, en el contexto de LLMs, son esencialmente un conjunto de números que representan un conjunto de palabras y caracteres. Por ejemplo, “The” podría ser un token, ” end” (con el espacio) podría ser otro, y “.” otro.
Por lo tanto, el texto “The End.” estaría compuesto por 3 tokens, digamos (73, 102, 6).

Este es un paso crítico porque los LLMs (es decir, las redes neuronales) no “entienden” el texto directamente. El texto debe convertirse en una representación numérica para que el modelo pueda realizar operaciones matemáticas en la entrada. De ahí el paso de tokenización.
El precio de una llamada a la API depende del número de tokens utilizados en el inicio y el modelo que se solicita. El precio por modelo está disponible en el sitio web de OpenAI.
3) Empezar (4 Pasos)
Ahora que tenemos una comprensión básica de la API de OpenAI, veamos cómo usarla. Antes de poder comenzar a codificar, necesitamos configurar cuatro cosas.
3.1) Crear una Cuenta (obtén un crédito de API de $5 por los primeros tres meses)
- Para crear una cuenta, ve a la página de descripción general de la API de OpenAI y haz clic en “Registrarse” en la esquina superior derecha
- Nota: Si ya has usado ChatGPT antes, es probable que ya tengas una cuenta de OpenAI. Si es así, haz clic en “Iniciar sesión”
3.2) Agregar Método de Pago
- Si tu cuenta tiene más de 3 meses de antigüedad o el crédito gratuito de $5 en la API no es suficiente para ti, necesitarás agregar un método de pago antes de hacer llamadas a la API.
- Haz clic en tu imagen de perfil y selecciona la opción de administrar cuenta.
- Luego agrega un método de pago haciendo clic en la pestaña “Facturación” y luego en “Métodos de pago”.
3.3) Establecer Límites de Uso
- A continuación, recomiendo establecer límites de uso para evitar que se te cobre más de lo presupuestado.
- Para hacer esto, ve a “Límites de uso” en la pestaña “Facturación”. Aquí puedes establecer un límite “Suave” y un límite “Duro”.
- Si alcanzas tu límite suave mensual, OpenAI te enviará una notificación por correo electrónico.
- Si alcanzas tu límite duro, se te denegarán cualquier solicitud adicional a la API (por lo tanto, no se te cobrará más que esto).
3.4) Obtener Clave Secreta de la API
- Haz clic en “Ver claves de la API”
- Si es tu primera vez, deberás crear una nueva clave secreta. Para hacer esto, haz clic en “Crear nueva clave secreta”
- A continuación, puedes darle a tu clave un nombre personalizado. Aquí usé “mi-primera-clave”.
- Luego, haz clic en “Crear clave secreta”
4) Código de Ejemplo: API de Completado de Chat
Con toda la configuración realizada, estamos (finalmente) listos para hacer nuestra primera llamada a la API. Aquí utilizaremos la biblioteca de Python de OpenAI, que facilita la integración de los modelos de OpenAI en tu código de Python. Puedes descargar el paquete a través de pip. El siguiente código de ejemplo (y código adicional) está disponible en el repositorio de GitHub de este artículo.
Una nota rápida sobre las deprecaciones de la API de Completado — OpenAI está dejando de lado el paradigma de la indicación libre y se está moviendo hacia llamadas a la API basadas en chat. Según un blog de OpenAI, el paradigma basado en chat brinda mejores respuestas, dado su interfaz de indicación estructurada, en comparación con el paradigma anterior [2].
Mientras que los modelos antiguos de OpenAI (GPT-3) aún están disponibles a través del paradigma “freeform”, los modelos más recientes (es decir, GPT-3.5-turbo y GPT-4) solo están disponibles a través de llamadas basadas en chat.
Comencemos con una llamada a la API súper simple. Aquí pasaremos dos entradas al método openai.ChatCompletions.create(), es decir, model y messages.
- model — define el nombre del modelo de lenguaje que queremos usar (podemos elegir entre los modelos mencionados anteriormente en el artículo).
- messages — establece el diálogo de chat “precedente” como una lista de diccionarios. Los diccionarios tienen dos pares clave-valor (por ejemplo, {“role”: “user”, “content”: “Escucha tu”}.) Primero, “role” define quién está hablando (por ejemplo, “role”: “user”). Esto puede ser “user”, “assistant” o “system”. Segundo, “content” define lo que el rol está diciendo (por ejemplo, “content”: “Escucha tu”). Si bien esto puede sentirse más restrictivo que una interfaz de indicación libre, podemos ser creativos con los mensajes de entrada para optimizar las respuestas para un caso de uso particular (más sobre esto más adelante).
Así es como se ve nuestra primera llamada a la API en Python.
import openaifrom sk import my_sk # importando la clave secreta desde un archivo externoimport time# clave secreta importada (o simplemente cópiala aquí)openai.api_key = my_sk # crear un completado de chatchat_completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Escucha tu"}])
La respuesta de la API se almacena en la variable chat_completion. Al imprimir chat_completion, vemos que es como un diccionario que consta de 6 pares clave-valor.
{'id': 'chatcmpl-7dk1Jkf5SDm2422nYRPL9x0QrlhI4', 'object': 'chat.completion', 'created': 1689706049, 'model': 'gpt-3.5-turbo-0613', 'choices': [<OpenAIObject at 0x7f9d1a862b80> JSON: { "index": 0, "message": { "role": "assistant", "content": "corazón." }, "finish_reason": "stop" }], 'usage': <OpenAIObject at 0x7f9d1a862c70> JSON: { "prompt_tokens": 10, "completion_tokens": 2, "total_tokens": 12 }}
El significado de cada campo se muestra a continuación.
- ‘Id’ = ID único para la respuesta de la API
- ‘Object’ = nombre del objeto de API que envió la respuesta
- ‘Created’ = marca de tiempo Unix de cuándo se procesó la solicitud de la API
- ‘Model’ = nombre del modelo utilizado
- ‘Choices’ = respuesta del modelo formateada en JSON (es decir, similar a un diccionario)
- ‘Usage’ = metadatos de recuento de tokens formateados en JSON (es decir, similar a un diccionario)
Sin embargo, lo más importante aquí es el campo ‘Choices‘ ya que aquí es donde se almacena la respuesta del modelo. En este caso, vemos que el rol de “asistente” responde con el mensaje “corazón.“
¡Yay! Hicimos nuestra primera llamada a la API. Ahora vamos a jugar con los parámetros de entrada del modelo.
max_tokens
En primer lugar, podemos establecer el número máximo de tokens permitidos en la respuesta del modelo usando el parámetro de entrada max_tokens. Esto puede ser útil por muchas razones dependiendo del caso de uso. En este caso, solo quiero una respuesta de una palabra, así que lo estableceré en 1 token.
# establecer el número máximo de tokens# crear una finalización de chatchat_completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Escucha tu"}], max_tokens = 1)# imprimir la finalización del chatprint(chat_completion.choices[0].message.content)"""Salida:>>> corazón """
n
A continuación, podemos establecer el número de respuestas que nos gustaría recibir del modelo. Nuevamente, esto puede ser útil por muchas razones dependiendo del caso de uso. Por ejemplo, si queremos generar un conjunto de respuestas de las cuales podemos seleccionar la que más nos guste.
# establecer el número de finalizaciones# crear una finalización de chatchat_completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Escucha tu"}], max_tokens = 2, n=5)# imprimir la finalización del chatfor i in range(len(chat_completion.choices)): print(chat_completion.choices[i].message.content)"""Salida:>>> corazón.>>> corazón y>>> corazón.>>>>>> corazón,>>>>>> corazón,"""
Observa que no todas las finalizaciones son idénticas. Esto puede ser algo bueno o malo dependiendo del caso de uso (por ejemplo, casos de uso creativos vs. casos de uso de automatización de procesos). Por lo tanto, puede ser ventajoso ajustar la diversidad de las finalizaciones de chat para una determinada indicación.
temperature
Resulta que podemos hacer esto ajustando el parámetro de temperatura. En pocas palabras, esto ajusta la “aleatoriedad” de las finalizaciones de chat. Los valores para este parámetro van de 0 a 2, donde 0 hace que las finalizaciones sean más predecibles y 2 las hace menos predecibles [3].
Conceptualmente, podemos pensar que temp=0 se ajustará a la palabra siguiente más probable, mientras que temp=2 permitirá finalizaciones que son relativamente improbables. Veamos cómo se ve esto.
# temperatura=0# crear una finalización de chatchat_completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Escucha tu"}], max_tokens = 2, n=5, temperatura=0)# imprimir la finalización del chatfor i in range(len(chat_completion.choices)): print(chat_completion.choices[i].message.content)"""Resultado:>>> corazón.>>> corazón.>>> corazón.>>> corazón.>>> corazón."""
Como era de esperar, cuando temp=0, todas las 5 finalizaciones son idénticas y producen algo “muy probable”. Ahora veamos qué sucede cuando aumentamos la temperatura.
# temperatura=2# crear una finalización de chatchat_completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Escucha tu"}], max_tokens = 2, n=5, temperatura=2)# imprimir la finalización del chatfor i in range(len(chat_completion.choices)): print(chat_completion.choices[i].message.content)"""Resultado:>>> juicio>>> Consejo>>> conciencia interna>>> corazón.>>>>>> ging ist"""
Nuevamente, como era de esperar, las finalizaciones de chat con temp=2 fueron mucho más diversas y “fuera de lugar”.
roles de mensajes: Asistente de Completado de Letras
Finalmente, podemos aprovechar los diferentes roles en este paradigma de solicitud basado en chat para ajustar aún más las respuestas del modelo de lenguaje.
Recuerda que podemos incluir contenido de 3 roles diferentes en nuestras solicitudes: sistema, usuario y asistente. El mensaje sistema establece el contexto (o tarea) para las finalizaciones del modelo, por ejemplo, “Eres un chatbot amigable que no quiere destruir a todos los humanos” o “Resume las solicitudes del usuario en un máximo de 10 palabras”.
Los mensajes usuario y asistente se pueden utilizar de al menos dos formas. Uno, para generar ejemplos para aprendizaje en contexto, y dos, para almacenar y actualizar el historial de conversación para un chatbot en tiempo real. Aquí utilizaremos ambas formas para crear un asistente de completado de letras.
Comenzamos haciendo el mensaje de sistema “Soy un asistente de completado de letras de Roxette. Cuando se te da una frase de una canción, te proporcionaré la siguiente frase de la canción”. Luego, proporciona dos ejemplos de mensajes de usuario y asistente. Seguido por el mismo prompt de usuario utilizado en los ejemplos anteriores, es decir, “Escucha tu”.
Esto es cómo se ve en código.
# prompt inicial con mensaje de sistema y 2 ejemplos de tareamessages_list = [{"role":"system", "content": "Soy un asistente de completado de letras de Roxette. Cuando se te da una frase de una canción, te proporcionaré la siguiente frase de la canción."}, {"role":"user", "content": "Sé que hay algo después de tu sonrisa"}, {"role":"assistant", "content": "Obtengo una noción de la mirada en tus ojos, sí"}, {"role":"user", "content": "Has construido un amor pero ese amor se desmorona"}, {"role":"assistant", "content": "Tu pequeño pedazo de cielo se vuelve demasiado oscuro"}, {"role":"user", "content": "Escucha tu"}]# generar secuencialmente 4 finalizaciones de chatfor i in range(4): # crear una finalización de chat chat_completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=messages_list, max_tokens = 15, n=1, temperatura=0) # imprimir la finalización del chat print(chat_completion.choices[0].message.content) new_message = {"role":"assistant", "content":chat_completion.choices[0].message.content} # agregar nuevo mensaje a la lista de mensajes messages_list.append(new_message) time.sleep(0.1)"""Resultado:>>> Corazón cuando él te llama>>> Escucha tu corazón, no hay nada más que puedas hacer>>> No sé a dónde vas y no sé por qué>>> Pero escucha tu corazón antes de decirle adiós"""
Al comparar la salida con la letra real de la canción de éxito de Roxette, vemos que son exactamente iguales. Esto se debe a la combinación de todas las entradas diferentes que proporcionamos al modelo.
Para ver cómo se ve esto cuando “aumentamos la temperatura”, echa un vistazo al código adicional en GitHub. (Advertencia: se vuelve extraño)
Conclusión
Aquí di una guía amigable para principiantes sobre la API de Python de OpenAI con código de ejemplo. La mayor ventaja de usar la API de OpenAI es que puedes trabajar con LLMs poderosos sin preocuparte por la provisión de recursos computacionales. Sin embargo, los inconvenientes son que las llamadas a la API cuestan dinero y la posible preocupación por la seguridad de compartir ciertos tipos de datos con un tercero (OpenAI).
Para evitar estos inconvenientes, podemos recurrir a soluciones LLM de código abierto. Eso será el enfoque del próximo artículo de esta serie, donde exploraremos la biblioteca Hugging Face Transformers.
Recursos
Conexión: Mi sitio web | Reserva una llamada | Pregúntame cualquier cosa
Redes sociales: YouTube 🎥 | LinkedIn | Twitter
Soporte: Conviértete en miembro ⭐️ | Comprarme un café ☕️
Los Emprendedores de Datos
Una comunidad para emprendedores en el espacio de datos. 👉 ¡Únete al Discord!
VoAGI.com
[1] Documentación de los modelos de OpenAI
[2] Disponibilidad de GPT-4 y la API de Completions
[3] Definición de temperatura de la referencia de la API