La eficacia de un modelo de lenguaje extenso depende en gran medida de las instrucciones que le damos. La ingeniería de instrucciones es el proceso de elaborar 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 instrucciones es un proceso iterativo. Si experimentaste con diferentes LLM, es probable que hayas notado que debes modificar la instrucción para obtener un mejor resultado.
Esto también es cierto para los modelos de diferentes tamaños.
Las interfaces de chat potenciadas por LLM grandes, como Gemini o ChatGPT, a menudo pueden producir resultados satisfactorios con un esfuerzo mínimo de instrucción. Sin embargo, cuando trabajas con un LLM predeterminado y más pequeño que no está bien ajustado, debes adaptar tu enfoque.
Los LLM más pequeños son menos potentes y tienen un conjunto de información más pequeño para extraer.
¿Qué significa “LLM más pequeños”?
Definir los tamaños de LLM es complicado y sus creadores no siempre lo divulgan.
En este documento, "LLM más pequeños" se refiere a cualquier modelo con menos de 30,000 millones de parámetros. A partir de hoy, los modelos con entre unos pocos millones y unos pocos miles de millones de parámetros se pueden ejecutar en el navegador, en dispositivos para consumidores.
¿Dónde se usan LLM más pequeños?
- IA generativa integrada 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 con CPU solamente) o DistilBert en el navegador con Transformers.js Solo se puede descargar un modelo y ejecutar inferencias en el dispositivo de un usuario con estos LLM más pequeños, para que las descargas web sean razonables y se adapten a las restricciones de memoria y GPU/CPU del dispositivo.
- IA generativa personalizada del servidor Los modelos pequeños de peso abierto como Gemma 2B, Gemma 7B o Gemma 27B están disponibles para que los ejecutes en tu propio servidor (y, de manera opcional, los ajustes).
Comenzar
Las interfaces de chat potenciadas por LLM grandes, como Gemini o ChatGPT, suelen producir resultados satisfactorios con un esfuerzo mínimo de instrucción. 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 más pequeño de información del que extraer.
Proporciona contexto y instrucciones de formato precisas
Para obtener 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 (revisión) | Salida (clasificación) | |
---|---|---|
LLM más grande (Gemini 1.5) | LLM más pequeño (Gemma 2B) | |
Me encanta el ajuste. Distribuye el peso de forma adecuada y es sorprendentemente cómodo, incluso en caminatas de todo el día. Lo recomendaría. | 5 | 4 de 5 estrellas** |
Las correas son endebles y comenzaron a clavarse en mis hombros con cargas pesadas. | 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 ser del todo 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, instrucciones con un solo ejemplo, con varios ejemplos y con muchas imágenes, y instrucciones de cadena de pensamientos. También debemos proporcionar instrucciones claras de formato y, además, 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 (revisión) | Salida con un LLM más pequeño (Gemma 2B) |
---|---|
Me encanta el ajuste. Distribuye el peso de forma adecuada y es sorprendentemente cómodo, 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 son endebles y comenzaron a clavarse en mis hombros con cargas pesadas. |
**Análisis:** En la opinión, se destaca un problema importante de comodidad con las correas. También sugiere que el producto podría no ser 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, otorga calificaciones más precisas.
Se espera el análisis de resultados manual
Si bien siempre debes limpiar y también interpretar de forma manual la salida de un LLM, esto es particularmente cierto para los LLM más pequeños que podrían producir resultados menos pulidos y requerir instrucciones en cadena de pensamiento.
En el primer ejemplo, usamos instrucciones de encadenamiento de pensamientos, por lo que el resultado incluyó un análisis y una calificación, y debemos analizar la calificación de forma manual. También ten en cuenta el formato incoherente en el resultado de la sección anterior: el modelo a veces genera Markdown, pero no siempre.
// 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 entre las APIs de Mind
Las APIs de LLM en la nube, como la API de Gemini o OpenAI, que suelen ser el punto de entrada a LLM más grandes, ofrecen funciones de instrucciones prácticas. Por ejemplo, Gemini 1.5 Pro ofrece instrucciones del sistema y modo JSON.
Por el momento, estas funciones no siempre están disponibles para el uso de modelos personalizados ni para LLM más pequeños a los que se accede con APIs de IA en el navegador, como la API de inferencia de LLM de MediaPipe o Transformers.js. Si bien esto no es necesariamente una limitación técnica, las APIs de IA integradas en el navegador suelen ser más livianas.
Ten en cuenta los límites de tokens
Debido a que tu instrucción para LLM más pequeños debe incluir ejemplos o instrucciones más detalladas, es probable que sea más larga y ocupe más del límite de tokens de entrada, si hay uno.
Además, los modelos más pequeños tienden a tener un límite de token de entrada más pequeño. 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 8,000.
Usa 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 la propuesta en tus estimaciones de tiempo de ingeniería.
Debido a las diferencias en las APIs y los límites de tokens, es probable que necesites más tiempo y esfuerzo para elaborar tu instrucción para un LLM más pequeño que uno más grande. Probar y validar el resultado del LLM también puede requerir un mayor esfuerzo.
Diferencias 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 personalizado y el ajuste fino. Sin embargo, incluso la ingeniería de instrucciones avanzada puede no ser suficiente en algunos casos de uso, sobre todo si usas un LLM más pequeño.
Usa los ajustes en los siguientes casos:
- Necesitas precisión y rendimiento de primer nivel para una tarea específica. El ajuste fino ajusta directamente los parámetros internos del modelo para obtener resultados óptimos.
- Tienes datos bien seleccionados, relevantes para tu tarea, que ya están etiquetados con los resultados preferidos. Necesitas estos datos para realizar un ajuste fino eficaz.
- Usas el modelo varias veces para el mismo propósito. El ajuste fino se puede realizar una vez y reutilizarse para una tarea específica.