Integración y Uso de OpenAI API en Proyectos Reales

Clase 23 de 24Curso de OpenAI API

¡Hola! Esta es la lectura final del Curso de Integración con OpenAI API. Si ya te sientes preparado/a puedes pasar directamente al examen, pero si quieres estar seguro/a de que todo está en orden en cuanto a los conceptos y métodos aprendidos, pues he preparado esta lectura para que repasemos el curso. ✨


Administración de proyectos OpenAI

En esta clase, aprendiste el procedimiento para registrarte en OpenAI y obtener una clave API. También discutimos las buenas prácticas para el manejo seguro de claves y credenciales.

Recuerda que tenemos dos formas de obtener una clave API:

  1. Creando una API Key por proyecto asociada a nuestra cuenta
  2. Generando un Service Account y asociándolo a un proyecto

¿Cómo conectarnos a la API de OpenAI?

Necesitamos una clave API la cual podemos obtener desde el dashboard de OpenAI, en la página de Ajustes y en la sección de API Keys. Una vez que la tengamos, podemos inicializar el cliente de OpenAI de la siguiente manera:

from openai import OpenAI client = OpenAI(api_key="sk-...")

Modelos de Lenguaje en OpenAI

Analizamos los modelos GPT-3.5, GPT-4o, o1-mini y o1-preview (ahora o1-pro). Fue importante comprender las capacidades, limitaciones y costos asociados al uso de cada modelo para elegir el más adecuado para tus necesidades:

ModeloDescripción
GPT-3.5-turboVersión mejorada de GPT-3.5, ofrece respuestas más rápidas y precisas. Ideal para tareas generales, pero se recomienda GPT-4 para tareas complejas.
GPT-4oModelo multimodal que procesa texto, imágenes y audio. Más rápido y económico que sus predecesores, con avances en reconocimiento de voz y traducción.
GPT-4o miniVersión más económica y pequeña de GPT-4o. Supera a GPT-3.5-turbo en inteligencia textual y razonamiento multimodal.
o1Modelo diseñado para problemas complejos que requieren razonamiento profundo, destacando en programación competitiva, matemáticas y razonamiento científico.
o1-miniVersión más rápida y económica de o1, especializada en tareas avanzadas de programación y STEM, con menor costo computacional.

Chat Completion API

Detallamos los parámetros disponibles en las solicitudes de chat completions, permitiéndote personalizar las interacciones con los modelos de lenguaje.

La forma más sencilla de generar texto usando GPT-4o es proporcionando un arreglo de mensajes y el modelo que queremos usar.

from openai import OpenAI # Inicializamos el cliente de OpenAI client = OpenAI(api_key="sk-...") # Generamos la respuesta response = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": "¿Cuál es la capital de Argentina?"}] ) print(response.choices[0].message.content) # "La capital de Argentina es la ciudad de Buenos Aires."

Recuerda que contamos con una estructura definida para seguir la conversación basada en tres roles principalmente: system, user y assistant.

messages = [ {"role": "system", "content": "Eres un asistente de IA que responde preguntas."}, {"role": "user", "content": "¿Cuál es la capital de Argentina?"}, {"role": "assistant", "content": "La capital de Argentina es la ciudad de Buenos Aires."}, {"role": "user", "content": "¿Cuál es la capital de Brasil?"}, {"role": "assistant", "content": "La capital de Brasil es la ciudad de Brasilia."}, ]

Pero no son los únicos roles que podemos usar como veremos en la siguiente clase.

Herramientas

Si necesitamos que nuestro modelo tenga acceso a herramientas externas como funciones, necesitamos proveer un arreglo de herramientas.

Estas herramientas (tools) nos servirán para que el modelo pueda interactuar con el mundo externo. Nosotros como desarrolladores debemos definir cómo y cuándo usar estas herramientas, así como otros detalles como parámetros requeridos, qué información nos puede devolver, etc.

Declarando una función para OpenAI

El arreglo de herramientas se declara en el parámetro tools de la función chat.completions.create. Estas herramientas contienen el tipo de herramienta, el nombre de la función, la descripción de la función, los parámetros requeridos y el tipo de salida que esperamos.

Por ejemplo, si queremos que nuestro modelo pueda obtener información sobre el clima de una ubicación basada en latitud y longitud, podemos declarar la siguiente herramienta:

tools = [ { "type": "function", "function": { "name": "get_weather", "description": "Usa esta funcion para obtener información sobre el clima", "parameters": { "type": "object", "properties": { "latitude": { "type": "number", "description": "Latitud de la ubicación" }, "longitude": { "type": "number", "description": "Longitud de la ubicación" } }, "required": ["latitude", "longitude"] }, "output": { "type": "string", "description": "Clima de la ubicación pedida por el usuario" } } } ]

E inmediatamente después de declarar la herramienta, podemos usarla dentro del parámetro tools de la función chat.completions.create.

response = client.chat.completions.create( model="gpt-4o", messages=messages, tools=tools ) assistant_message = response.choices[0].message if assistant_message.tool_calls: function_name = tool_call.function.name function_args = json.loads(tool_call.function.arguments) if function_name == "get_weather": print(f"El asistente está llamando a la función get_weather") weather_info = get_weather( latitude=function_args.get("latitude"), longitude=function_args.get("longitude") )

Manejo de Imágenes en GPT-4o

Además de la API de Chat Completion, algunos modelos de OpenAI nos permiten procesar imágenes en la conversación. Podemos insertar imágenes en formato URL o en formato base64 conviertiéndo el contenido de string a arreglo.

En este ejemplo, podemos insertar más de una imagen así como un texto que puede detallar la imagen, preguntar sobre ella, etc.

messages = [ { "role": "system", "content": "Eres un asistente que analiza las imagenes a gran detalle." }, { "role": "user", "content": [ { "type": "text", "text": "Hola, ¿puedes analizar esta imagen?", }, { "type": "image_url", "image_url": { "url": f"data:image/png;base64,{encode_image_to_base64('./image.png')}" } } ] } ]

Generación de imágenes con DALL E 3

DALL E 3 es un modelo de generación de imágenes de OpenAI. Usarlo es muy sencillo, solo necesitamos proporcionar un prompt y el modelo que queremos usar.

prompt = "Un atardecer en la ciudad" quality = "standard" response = client.images.generate( model="dall-e-3", prompt=prompt, quality=quality, n=1 )

Introducción a Fine-Tuning

El Fine-Tuning es una técnica que nos permite entrenar un modelo de lenguaje para que sea más específico para un conjunto de datos.

Nos permite:

  • Mayor control: Podemos controlar el modelo para que genere respuestas más específicas y personalizadas.
  • Menor coste: Podemos reducir los costos de uso de la API al entrenar un modelo más específico.

Preparación de Datos para Fine-Tuning

Para ello, necesitamos un conjunto de datos que contenga ejemplos de conversaciones, preguntas y respuestas. Este conjunto de datos se debe guardar en un archivo .jsonl que contenga un arreglo de objetos con el siguiente formato:

{ "messages": [ { "role": "system", "content": "Eres un asistente de atención a clientes y estudiantes de la plataforma de educación online en tecnología, inglés y liderazgo llamada Platzi" }, { "role": "user", "content": "¿Cuáles son los pasos esenciales para comenzar un negocio?" }, { "role": "assistant", "content": "Si quieres aprender los pasos esenciales para comenzar un negocio, te recomendamos el Curso para Comenzar tu Camino Emprendedor en https://platzi.com/cursos/camino-emprendedor/. Además de esto, también puedes consultar nuestro catálogo de cursos relacionados con Emprendimiento, Marketing y Desarrollo de Negocios." } ] }

El formato incluye una lista de messages que contiene el sistema, el usuario y el asistente.

Una vez hemos entrenado nuestro modelo, podemos usarlo para generar respuestas más específicas y personalizadas y probarlo usando OpenAI Playground.

OpenAI Batch

OpenAI Batch es una técnica que nos permite ejecutar múltiples solicitudes de manera eficiente, lo que nos permite ahorrar en costos y tiempos de respuesta. Para ello, necesitamos crear un archivo .jsonl que contenga un arreglo de objetos como el siguiente:

{ "custom_id": "002", "method": "POST", "url": "/v1/chat/completions", "body": { "model": "gpt-4o-mini", "messages": [ { "role": "system", "content": "Eres un asistente que resume artículos de Wikipedia" }, { "role": "user", "content": "Analiza el siguiente texto y entrega una idea principal de entre una y dos oraciones: La historia de la ciencia documenta el desarrollo histórico de la ciencia, la técnica y la tecnología, así como la interrelación que han tenido las tres entre sí y con el resto de los aspectos de la cultura a nivel mundial, como son la economía, la sociedad, la política, la religión, la ideología, etc. En un sentido amplio, la historia de la ciencia existía en muchas civilizaciones desde antes de la Edad Moderna.[1]​ La ciencia moderna es distinta en su enfoque a la ciencia antigua y es la que define ahora lo que se entiende como ciencia en el sentido más estricto del término.[2]​[3]​ La palabra ciencia se usaba para categorizar un tipo de conocimiento específico, más que para referirse a la búsqueda de dicho conocimiento. En particular, la ciencia era el tipo de conocimiento que las personas pueden comunicarse entre sí y compartir. El conocimiento sobre el funcionamiento de las cosas naturales se acumuló mucho antes de que se registrara su historia y condujo al desarrollo de un pensamiento abstracto complejo. Lo demuestra la construcción de complejos calendarios, el uso de técnicas para hacer comestibles las plantas venenosas, la construcción de obras públicas a escala nacional —como las que aprovecharon el terreno inundable del Yangtsé con embalses,[4]​ presas y diques— y de edificios como las pirámides. Sin embargo, no se hizo una distinción consciente y consistente entre el conocimiento de tales cosas y otros tipos de conocimiento comunitario, como las mitologías y los sistemas legales. " } ] } }

Cada línea-objeto debe contener:

  • custom_id: Identificador para luego correlacionar la petición que enviamos\
  • method: El método HTTP que queremos usar (siempre es POST para las peticiones de OpenAI)
  • url: La URL a la que queremos hacer la petición (siempre es /v1/chat/completions)
  • body: El cuerpo de la petición que contiene el modelo (model como gpt-4o-mini) y la lista de mensajes (messages).

Este archivo se debe subir hacia la sección de batch de OpenAI: OpenAI Batch.

¿Por qué usar OpenAI Batch?

OpenAI Batch nos da un 50% de descuento en el costo de las peticiones a cambio que se completen en un plazo dentro de 24 horas. Es decir, puede demorar 10 minutos, 1 hora, 2 horas, hasta el plazo máximo de 24 horas. Es una excelente manera de ahorrar en costos si el tiempo no es una restricción.

¿Cómo funciona OpenAI Assistants?

OpenAI Assistants es una herramienta que nos permite crear asistentes virtuales que pueden interactuar con los modelos de lenguaje de OpenAI de forma distinta a la API de Chat Completion.

Está aún en Beta, aún no recomendado para producción, pero ofrece otras ventajas interesantes, como:

  • Crear hilos de conversación: Donde a diferencia de la API de Chat Completion, debemos almacenar la conversación en un arreglo de mensajes, en OpenAI Assistants podemos crear hilos de conversación y almacenarlos en una base de datos.

  • Usar herramientas externas: Más allá de funciones, también tienes acceso a un Code Interpreter, que nos permite ejecutar código Python y devolver el resultado. Y File Search, que nos permite alimentar el asistente con archivos de texto para que pueda usarlos como contexto.

Puedes crear un asistente desde OpenAI Playground Assistants y darle click en Create assistant. Cuando creamos un asistente podemos escribir su nombre, la instrucción del sistema, el modelo que queremos usar, y las herramientas que queremos que tenga.

Una vez obtengamos nuestro asistente, obtendremos un ID como asst_2iElhX51oXTLOkn06aBqxKE9. Este ID nos servirá para interactuar con nuestro asistente.

Luego podemos usar el ID para interactuar con nuestro asistente usando la API de Assistants, como agregarle un mensaje:

message = client.beta.threads.messages.create( thread_id=thread.id, role="user", content="¿Cuánto es 16284+991893-771939*12456? Puedes ejecutar código Python para esto" )

Luego para ejecutar la conversación y obtener la respuesta utilizamos un run:

run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant_id )

Y cuando el estado del run sea completed, podemos obtener la respuesta del asistente revisando los mensajes del hilo de conversación:

run_steps = client.beta.threads.runs.steps.list( thread_id=thread.id, run_id=run.id ) messages = client.beta.threads.messages.list( thread_id=thread.id, order="desc", limit=1 )

OpenAI TTS

OpenAI nos ofrece un modelo de TTS (Text to Speech) que nos permite convertir texto a voz.

Para usarlo, necesitamos proporcionar un texto y utilizar la función audio.speech.create con el modelo tts-1. Tenemos una variedad de voces disponibles, como alloy, echo, fable, onyx, shimmer y nova.

Por ejemplo, si queremos convertir el texto "Me despierto, y hay nuevos avances en tecnología" a voz con la voz alloy, podemos hacerlo de la siguiente manera:

with client.audio.speech.with_streaming_response.create( model="tts-1", voice="alloy", input="Me despierto, y hay nuevos avances en tecnología" ) as response: response.stream_to_file("speech.mp3")

OpenAI Whisper

OpenAI nos ofrece un modelo de transcripción de voz a texto que nos permite transcribir archivos de audio a texto.

Para usarlo, necesitamos proporcionar un archivo de audio y utilizar la función audio.transcriptions.create con el modelo whisper-1.

Por ejemplo, si queremos transcribir el archivo de audio speech.mp3, podemos hacerlo de la siguiente manera:

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) audio_file = open("speech.mp3", "rb") transcript = client.audio.transcriptions.create( model="whisper-1", file=audio_file ) print(transcript.text)

Proyectos en Producción

Finalmente, aquí tienes un conjunto de consejos clave para preparar software que interactúe con OpenAI antes de pasar a producción:

Manejo de la API Key

  • Protección: Asegúrate de que tu clave API esté bien protegida. Nunca incluyas claves API en tu código fuente en texto plano. Usa variables de entorno o un servicio de gestión de secretos.
  • Rotación: Configura un plan para rotar las claves API regularmente para mayor seguridad.

Uso de Límites de Tasa

  • Pruebas con tráfico realista: Simula el uso esperado en producción para asegurar que no excederás los límites de tasa de OpenAI.
  • Backoff Exponencial: Implementa un sistema de reintentos con backoff exponencial para manejar errores como RateLimitError.

Optimización de Costos

  • Pruebas de costos: Calcula el costo estimado del uso de la API en escenarios de alto tráfico y evalúa si tu modelo de negocio puede soportarlo.
  • Uso eficiente: Aprovecha los tokens al máximo optimizando las instrucciones y datos enviados. Considera usar modelos más económicos si son suficientes para ciertas funcionalidades.

Con estas medidas, estarás mejor preparado/a para garantizar la seguridad, eficiencia y confiabilidad del software que uses con OpenAI en producción.