Table of Contents
Cómo solucionar los errores de límite de velocidad y tiempo de espera de OpenAI.
Los LLM están empezando a utilizarse en una gran variedad de casos de uso. Entre ellos se incluyen la traducción, el análisis de sentimientos, la generación de código, blogs, correos electrónicos, etc. Sin embargo, la integración directa de la API de OpenAI en su producción presenta algunos problemas, ya que es relativamente nueva. Sus API no ofrecen acuerdos de nivel de servicio ni garantías de tiempo de actividad, ni siquiera de rendimiento del servicio. Todavía hay límites de velocidad en tokens por segundo y solicitudes por segundo.
Las LLM están empezando a utilizarse en una gran variedad de casos de uso. Entre ellos se incluyen la traducción, el análisis de sentimientos, la generación de código, blogs, correos electrónicos, etc. Sin embargo, la integración directa de la API de OpenAI en su producción presenta algunos problemas, ya que es relativamente nueva. Sus API no ofrecen acuerdos de nivel de servicio ni garantías de tiempo de actividad, ni siquiera de rendimiento del servicio. Todavía hay límites de velocidad en tokens por segundo y solicitudes por segundo.
OpenAI recomienda utilizar varias técnicas para mitigar este problema. Veamos brevemente algunas de ellas.
Reducción exponencial
El backoff exponencial es una estrategia que se utiliza para gestionar los límites de velocidad aumentando gradualmente el tiempo entre los reintentos posteriores en caso de que se produzca un error que limite la velocidad. A continuación se muestra un ejemplo en Node.Js:
const axios = require('axios'); // Asegúrate de instalar axios con npm o yarn. const BASE_URL = 'https://api.openai.com/v1/chat/completions'; async function makeRequestWithBackoff(endpoint, params, retries = 3, backoffDelay = 500) { try { const response = await axios.post(endpoint, params, { headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer YOUR_OPENAI_API_KEY`, }, }); return response.data; } catch (error) { if (error.response && error.response.status === 429 && retries > 0) { // 429 es el código de estado HTTP para Demasiadas Peticiones // Espera un retardo aleatorio que aumenta exponencialmente con cada reintento const delay = Math.random() * backoffDelay; console.log(`Rate limit hit, retrying in ${delay}ms`); await new Promise((resolve) => setTimeout(resolve, delay)); return makeRequestWithBackoff(endpoint, params, retries - 1, backoffDelay * 2); } else { // Si no es un error de límite de tasa o nos hemos quedado sin reintentos, lanza el error throw error; } } } params = { messages: [ {role : "user", content: "Hola, ¿Quién eres?" } ] max_tokens: 50, model: "gpt-3.5-turbo" }; makeRequestWithBackoff(BASE_URL, params) .then(data => console.log(data)) .catch(error => console.error(error));
Incluso puedes modificar la lógica para cambiar el backoff exponencial por uno lineal o aleatorio.
Peticiones por lotes
OpenAI también permite peticiones por lotes en el endpoint /completions. Esto puede funcionar si usted está golpeando solicitudes por segundo, pero son buenos en tokens por segundo. Pero recuerda que esta API está siendo depreciada. Usando el mismo ejemplo anterior:
const BASE_URL = "https://api.openai.com/v1/completions"; const params = { model: "curie", prompts: [ "Érase una vez un perro", "Érase una vez un gato", "Érase una vez un humano" ] }; makeRequestWithBackoff(BASE_URL, params) .then(data => console.log(data)) .catch(error => console.error(error));
Hay otras técnicas que puedes utilizar además de éstas.
Almacenamiento en caché
Muchas veces tus usuarios están consultando lo mismo, algún tipo de capa de caché simple
o semántica
por encima de tu solicitud puede ayudarte a ahorrar costes y tiempo de solicitud. Pero en este contexto, reducirá las llamadas realizadas a OpenAI.
Cambio entre OpenAI y Azure.
Puedes solicitar el servicio OpenAI de Azure y establecer un equilibrio de carga entre ambos proveedores. De esta manera, incluso si uno de ellos está caído o lento, puedes cambiar al otro proveedor.
Respuestas siempre en streaming
La API de OpenAI proporciona una función de streaming que nos permite recibir respuestas parciales del modelo en tiempo real, a medida que se generan. Este enfoque ofrece una ventaja significativa con respecto a las llamadas tradicionales sin streaming, en las que podrías permanecer ajeno a cualquier posible tiempo de espera hasta que transcurra toda la duración de la respuesta, que puede variar en función de tus parámetros iniciales, como la complejidad de la solicitud y el número de max_tokens especificados.
El streaming asegura que, independientemente del tamaño de la petición o del max_tokens establecido, el modelo comience a entregar tokens normalmente en los primeros 5-6 segundos. Si se produce un retraso más allá de este breve intervalo, es un indicador precoz de que la solicitud puede haber expirado o no haberse procesado como se esperaba. Podemos terminar estas peticiones y reintentarlas de nuevo.
Configuración de Fallbacks
Para casos de uso específicos en los que está bien obtener respuestas de otros modelos, puede configurar fallbacks a otros modelos. Las mejores alternativas podrían ser Llama-70b, Gemini, u otros modelos más pequeños como MIXTRAL 8X7B, Claude Instant, etc. por nombrar algunos. Estas son algunas técnicas comunes que se pueden utilizar para mitigar errores en aplicaciones de grado de producción.
Eso sería todo, gracias por leer, y síguenos en Merlin @ Twitter Nosotros en Merlin API proporcionar todas estas características y mucho más con 20+ modelos para elegir. Nos centramos en la fiabilidad de la API y hacemos toda la conmutación, fallbacks, almacenamiento en caché y gestión de límite de velocidad. Proporcionamos una API unificada y utilizamos un formato de respuesta para todos los modelos.
Un pequeño ejemplo de cómo utilizar la API de Merlin con Node.js:
import { Merlin } from "merlin-node"; // npm install merlin-node // ADVERTENCIA: clave api de prueba. // Sustitúyela por tu clave API del Dashboard de Merlin // https://api.getmerlin.in const apiKey = "merlin-test-3b7d-4bad-9bdd-2b0d7b3dcb6d"; const Merlin = new Merlin({ merlinConfig: { apiKey } }); const initChat = { role: "system", content: "Eres un asistente útil".
} async function createCompletion() { try { const completion = await Merlin.chat.completions.create({ messages: [initChat], modelo: "gpt-3.5-turbo", // 20+ modelos según sea necesario }); } catch (error) { console.error("Error creating completion:", error); } } createCompletion();
Experience the full potential of ChatGPT with Merlin
Kalpna Thakur
Nuestro centro neurálgico de marketing elabora soluciones innovadoras para cada reto de crecimiento, ¡manteniendo la diversión en nuestro equipo!