Ingeniería práctica de instrucciones para LLM más pequeños

Maud Nalpas
Maud Nalpas

La eficacia de un modelo grande de lenguaje depende en gran medida de las instrucciones que le damos. La ingeniería de instrucciones es el proceso de formular preguntas para obtener el mejor resultado de un LLM. Es un paso fundamental para implementar una función basada en LLM.

La ingeniería de indicaciones es un proceso iterativo. Si experimentaste con diferentes LLM, es probable que hayas notado que necesitabas modificar las instrucciones para obtener un mejor resultado.

Esto también se aplica a modelos de diferentes tamaños.

Las interfaces de chat con la tecnología de los LLM grandes, como Gemini o ChatGPT, suelen producir resultados satisfactorios con un esfuerzo mínimo de generación de instrucciones. Sin embargo, cuando trabajas con un LLM predeterminado más pequeño que no está ajustado, debes adaptar tu enfoque.

Los LLM más pequeños son menos potentes y tienen un grupo de información más pequeño del cual extraer.

¿Qué queremos decir con “LLM más pequeños”?

Definir los tamaños de LLM es complicado y sus creadores no siempre los divulgan.

En este documento, “LLM más pequeños” se refiere a cualquier modelo que no supere los 30,000 millones de parámetros. Actualmente, los modelos con unos pocos millones o unos cuantos miles de millones de parámetros se pueden ejecutar de manera realista en el navegador y en dispositivos para consumidores.

¿Dónde se usan los LLM más pequeños?

  • IA generativa en el dispositivo o en el navegador, por ejemplo, si usas Gemma 2B con la API de inferencia de LLM de MediaPipe (incluso adecuada para dispositivos solo de CPU) o DistilBert en el navegador con Transformers.js. La descarga de un modelo y la ejecución de inferencias en el dispositivo de un usuario solo es posible con estos LLM más pequeños, para que las descargas web sean razonables y adaptarse a las restricciones de memoria y GPU/CPU de un dispositivo.
  • IA generativa personalizada del servidor. Hay modelos pequeños de peso abierto, como Gemma 2B, Gemma 7B o Gemma 27B, disponibles para que los ejecutes en tu propio servidor (y, de manera opcional, los ajustes).

Comenzar

Las interfaces de chat con la tecnología de los LLM grandes, como Gemini o ChatGPT, suelen producir resultados satisfactorios con un mínimo esfuerzo de creación de instrucciones. Sin embargo, cuando trabajas con LLM más pequeños, debes adaptar tu enfoque. Los LLM más pequeños son menos potentes y tienen un grupo de información más pequeño del cual extraer.

Proporciona instrucciones precisas y contextuales sobre el formato

Para lograr resultados óptimos con LLM pequeños, crea instrucciones más detalladas y específicas.

Por ejemplo:

Based on a user review, provide a product rating as an integer between 1 and 5. \n
Only output the integer.

Review: "${review}"
Rating:
Entrada (opinión) Resultado (calificación)
  LLM más grande (Gemini 1.5) LLM más pequeño (Gemma 2B)
Me encanta el ajuste. Distribuye el peso correctamente y es sorprendentemente cómodo, incluso en caminatas de todo el día. Lo recomendaría. 5 4 de 5 estrellas**
Las correas eran finas y comenzaron a meterme en los hombros con mucho peso. 1 5/2

Si bien Gemini 1.5 proporciona el resultado deseado con esta simple instrucción, el resultado de Gemma no es satisfactorio:

  • El formato es incorrecto. Solicitamos un número entero para la calificación.
  • La calificación no parece muy precisa. La primera opinión es lo suficientemente entusiasta como para indicar una opinión de 5 estrellas.

Para solucionar este problema, debemos usar técnicas de ingeniería de instrucciones, las instrucciones con un solo ejemplo o con varios ejemplos, y las instrucciones de cadena de pensamientos. También debemos proporcionar instrucciones de formato claras y también insistir en que el modelo debe usar el rango completo de calificaciones.

Por ejemplo:

`Analyze a product review, and then based on your analysis give me the
corresponding rating (integer). The rating should be an integer between 1 and
5. 1 is the worst rating, and 5 is the best rating. A strongly dissatisfied
review that only mentions issues should have a rating of 1 (worst). A strongly
satisfied review that only mentions positives and upsides should have a rating
of 5 (best). Be opinionated. Use the full range of possible ratings (1 to
5). \n\n
    \n\n
    Here are some examples of reviews and their corresponding analyses and
    ratings:
    \n\n
    Review: 'Stylish and functional. Not sure how it'll handle rugged outdoor
    use, but it's perfect for urban exploring.'
    Analysis: The reviewer appreciates the product's style and basic
    functionality. They express some uncertainty about its ruggedness but
    overall find it suitable for their intended use, resulting in a positive,
    but not top-tier rating.
    Rating (integer): 4
    \n\n
    Review: 'It's a solid backpack at a decent price. Does the job, but nothing
    particularly amazing about it.'
    Analysis: This reflects an average opinion. The backpack is functional and
    fulfills its essential purpose. However, the reviewer finds it unremarkable
    and lacking any standout features deserving of higher praise.
    Rating (integer): 3
    \n\n
    Review: 'The waist belt broke on my first trip! Customer service was unresponsive too. Would not recommend.'
    Analysis: A serious product defect and poor customer service experience naturally warrants the lowest possible rating. The reviewer is extremely unsatisfied with both the product and the company.
    Rating (integer): 1
    \n\n
    Review: 'Love how many pockets and compartments it has. Keeps everything organized on long trips. Durable too!'
    Analysis: The enthusiastic review highlights specific features the user loves (organization and durability), indicating great satisfaction with the product. This justifies the highest rating.
    Rating (integer): 5
    \n\n
    Review: 'The straps are a bit flimsy, and they started digging into my shoulders under heavy loads.'
    Analysis: While not a totally negative review, a significant comfort issue leads the reviewer to rate the product poorly. The straps are a key component of a backpack, and their failure to perform well under load is a major flaw.
    Rating (integer): 1
    \n\n
    Now, here is the review you need to assess:
    \n
    Review: "${review}" \n`;
Entrada (opinión) Resultado con un LLM más pequeño (Gemma 2B)

Me encanta el ajuste. Distribuye el peso correctamente y es muy cómoda, incluso en caminatas de todo el día. Lo recomendaría.

Análisis: Esta opinión es muy positiva y enfatiza el ajuste y la comodidad del producto, lo que indica una gran satisfacción con el producto. Esto justifica una calificación alta.

Calificación (número entero): 5

Las correas eran finas y comenzaron a meterme en los hombros con mucho peso.

**Análisis:** La opinión destaca un problema de comodidad significativo con las correas. También se sugiere que el producto no es adecuado para cargas pesadas o salidas prolongadas.

**Calificación:** 1 (peor)

Nuestra instrucción más elaborada, combinada con instrucciones con ejemplos limitados y técnicas de instrucción de cadena de pensamiento, ofrece calificaciones más precisas.

Espera un análisis manual de los resultados.

Si bien siempre debes limpiar e interpretar de forma manual la salida de un LLM, esto es particularmente cierto para los LLM más pequeños que pueden producir resultados menos pulidos y pueden requerir instrucciones de cadena de pensamiento.

En el primer ejemplo, usamos instrucciones de cadena de pensamientos, por lo que el resultado incluía un análisis y una calificación, y debemos analizarlos manualmente para determinar la calificación. Además, observa el formato incoherente en el resultado de la sección anterior: el modelo a veces genera Markdown, pero no cada vez.

// Use try/catch to catch (parsing) errors
try {
  // Parse the output for a rating
  const int = /[1-5]/;
  const ratingAsString = llmOutput.match(int)[0];
  // Parse as int
  const ratingAsInt = parseInt(ratingAsString);
  // `checkRating` checks the rating is a number between 1 and 5, since the
  // regEx may catch a number like "100"
  const finalRating = checkRating(ratingAsInt);
} catch (e) {
  console.error('Error', e);
}

Diferencias de API de Mind

Las APIs de Cloud de LLM, como OpenAI o la API de Gemini, que suelen ser el punto de entrada a LLM más grandes, ofrecen funciones útiles de instrucciones. Por ejemplo, Gemini 1.5 Pro ofrece instrucciones del sistema y el modo JSON.

Por el momento, estas funciones no siempre están disponibles para el uso de modelos personalizados o para LLM más pequeños a los que se accede mediante las APIs de IA en el navegador, como la API de inferencia de LLM de MediaPipe o Transformers.js. Si bien esta no es necesariamente una limitación técnica, las APIs de IA en el navegador suelen ser más eficientes.

Límites de tokens mentales

Debido a que tu solicitud para LLM más pequeños debe incluir ejemplos o instrucciones más detalladas, es probable que sea más largo y ocupe más del límite de tokens de entrada, si es que hay uno.

Además, los modelos más pequeños suelen tener un límite de tokens de entrada menor. Por ejemplo, Gemini 1.5 Pro tiene un límite de tokens de entrada de 1 millón, mientras que los modelos de Gemma tienen una ventana de contexto de 8K.

Usa las funciones de recuento de tokens para evitar alcanzar el límite.

Adapta tus estimaciones de tiempo

Ten en cuenta el diseño y las pruebas de instrucciones en tus estimaciones de tiempo de ingeniería.

Debido a las diferencias de las APIs y los límites de tokens, es probable que necesites más tiempo y esfuerzo para crear tu instrucción para un LLM más pequeño que uno más grande. Probar y validar los resultados del LLM también puede implicar un esfuerzo mayor.

¿Cuál es la diferencia entre la ingeniería de instrucciones y el ajuste?

Para los desarrolladores web, la ingeniería de instrucciones es nuestra forma preferida de aprovechar la IA generativa en lugar del entrenamiento y los ajustes personalizados. Sin embargo, incluso la ingeniería de instrucciones avanzada puede no ser suficiente en algunos casos de uso, en especial si usas un LLM más pequeño.

Usa el ajuste en los siguientes casos:

  • Necesitas una precisión y un rendimiento de primer nivel para una tarea específica. Con el ajuste, se ajustan directamente los parámetros internos del modelo para obtener resultados óptimos.
  • Tienes datos bien seleccionados, relevantes para tu tarea, ya etiquetados con resultados preferidos. Necesitas estos datos para un ajuste efectivo.
  • Usas el modelo para el mismo propósito varias veces. El ajuste se puede hacer una vez y volver a utilizarse para una tarea específica.