A eficácia de um modelo de linguagem grande depende muito das instruções que damos a ele. A engenharia de comandos é o processo de criar perguntas de uma forma que gere a melhor saída de um LLM. É uma etapa crucial na implementação de um recurso baseado em LLM.
A engenharia de comandos é um processo iterativo. Se você já fez experimentos com diferentes LLMs, provavelmente notou que precisou ajustar o comando para alcançar um resultado melhor.
Isso também é verdade para modelos de tamanhos diferentes.
As interfaces de chat com tecnologia de LLMs grandes, como o Gemini ou o ChatGPT, geralmente podem produzir resultados satisfatórios com o mínimo de esforço de comando. No entanto, ao trabalhar com um LLM padrão e menor que não esteja ajustado, é necessário adaptar sua abordagem.
Os LLMs menores são menos poderosos e têm um pool menor de informações para extrair.
O que queremos dizer com "LLMs menores"?
Definir tamanhos de LLM é complicado, e eles nem sempre são divulgados pelos fabricantes.
Neste documento, "LLMs menores" significa qualquer modelo com menos de 30 bilhões de parâmetros. Atualmente, modelos com alguns milhões a alguns bilhões de parâmetros podem ser executados de forma realista no navegador, em dispositivos de consumo.
Onde os LLMs menores são usados?
- IA generativa no dispositivo/no navegador, por exemplo, se você estiver usando o Gemma 2B com a API LLM Inference do MediaPipe (até mesmo adequada para dispositivos somente com CPU) ou o DistilBert no navegador com Transformers.js. O download de um modelo e a execução da inferência no dispositivo de um usuário só é possível com esses LLMs menores, para manter os downloads da Web razoáveis e adequados às restrições de memória e GPU/CPU de um dispositivo.
- IA generativa personalizada do lado do servidor. Modelos pequenos de peso aberto, como Gemma 2B, Gemma 7B ou Gemma 27B, estão disponíveis para você executar no seu próprio servidor (e, opcionalmente, ajustar).
Primeiros passos
As interfaces de chat com tecnologia de LLMs grandes, como o Gemini ou o ChatGPT, geralmente podem produzir resultados satisfatórios com o mínimo de esforço de comando. No entanto, ao trabalhar com LLMs menores, é necessário adaptar sua abordagem. Os LLMs menores são menos poderosos e têm um pool menor de informações para extrair.
Fornecer contexto e instruções de formato precisas
Para alcançar resultados ideais com LLMs pequenos, crie comandos mais detalhados e específicos.
Exemplo:
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 (avaliação) | Saída (classificação) | |
|---|---|---|
| LLM maior (Gemini 1.5) | LLM menor (Gemma 2B) | |
| Adorei o ajuste! Distribui bem o peso e é surpreendentemente confortável, mesmo em caminhadas de um dia inteiro. Recomendaria. | 5 | 4 de 5 estrelas** |
| As alças são frágeis e começaram a cavar nos meus ombros sob cargas pesadas. | 1 | 2/5 |
Embora o Gemini 1.5 forneça a saída desejada com esse comando simples, a saída do Gemma não é satisfatória:
- O formato está incorreto. Solicitamos um número inteiro para a classificação.
- A classificação não parece muito precisa. A primeira avaliação é entusiasmada o suficiente para indicar uma avaliação de 5 estrelas.
Para corrigir isso, precisamos usar técnicas de engenharia de comando, comandos de um, poucos e vários exemplos e comandos com linha de raciocínio. Também precisamos fornecer instruções de formato claras e insistir que o modelo use toda a variedade de classificações.
Exemplo:
`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 (avaliação) | Saída com um LLM menor (Gemma 2B) |
|---|---|
Adorei o ajuste! Distribui bem o peso e é surpreendentemente confortável, mesmo em caminhadas de um dia inteiro. Recomendaria. |
Análise: essa avaliação é muito positiva e enfatiza o ajuste e o conforto do produto, indicando grande satisfação com ele. Isso justifica uma classificação alta. Classificação (número inteiro): 5 |
As alças são frágeis e começaram a cavar nos meus ombros sob cargas pesadas. |
**Análise** : a avaliação destaca um problema de conforto significativo com as alças. Ela também sugere que o produto pode não ser adequado para cargas pesadas ou passeios prolongados. **Classificação** : 1 (pior) |
Nosso comando mais elaborado, combinado com técnicas de comando de poucos disparos e de comandos com linha de raciocínio, oferece classificações mais precisas.
Esperar a análise manual da saída
Embora você sempre precise limpar e interpretar manualmente a saída de um LLM, isso é particularmente verdadeiro para LLMs menores, que podem produzir resultados menos refinados e exigir comandos com linha de raciocínio.
No primeiro exemplo, usamos comandos com linha de raciocínio, então a saída incluiu uma análise e uma classificação, e precisamos analisar manualmente a classificação. Observe também a formatação inconsistente na saída da seção anterior: o modelo às vezes gera markdown, mas nem sempre.
// 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);
}
Considerar as diferenças de API
As APIs de nuvem de LLM, como a API Gemini ou a OpenAI, que geralmente são o ponto de entrada para LLMs maiores, oferecem recursos de comando úteis. Por exemplo, o Gemini 1.5 Pro oferece instruções do sistema e modo JSON.
No momento, esses recursos nem sempre estão disponíveis para uso de modelos personalizados ou para LLMs menores acessados usando APIs de IA no navegador, como a API LLM Inference do MediaPipe ou Transformers.js. Embora isso não seja necessariamente uma limitação técnica, as APIs de IA no navegador tendem a ser mais enxutas.
Considerar os limites de token
Como o comando para LLMs menores precisa incluir exemplos ou instruções mais detalhadas, ele provavelmente será mais longo e ocupará mais do limite de tokens de entrada, se houver.
Além disso, modelos menores tendem a ter um limite de tokens de entrada menor. Por exemplo, o Gemini 1.5 Pro tem um limite de 1 milhão de tokens de entrada enquanto os modelos Gemma têm uma janela de contexto de 8 mil.
Use funções de contagem de tokens para evitar atingir o limite.
Adaptar suas estimativas de tempo
Considere o design e o teste de comandos nas suas estimativas de tempo de engenharia.
Devido às diferenças de API e aos limites de token, é provável que você precise de mais tempo e esforço para criar um comando para um LLM menor do que para um maior. Testar e validar a saída do LLM também pode exigir mais esforço.
Engenharia de comandos ou ajuste fino?
Para desenvolvedores da Web, a engenharia de comandos é nossa maneira preferida de aproveitar a IA generativa em vez de treinamento personalizado e ajuste fino. No entanto, mesmo a engenharia de comandos avançada pode não ser suficiente em alguns casos de uso, especialmente se você estiver usando um LLM menor.
Use o ajuste fino quando:
- Você precisa de precisão e performance de alta qualidade para uma tarefa específica. O ajuste fino ajusta diretamente os parâmetros internos do modelo para resultados ideais.
- Você tem dados bem selecionados, relevantes para sua tarefa, já rotulados com as saídas preferidas. Você precisa desses dados para um ajuste fino eficaz.
- Você usa o modelo para a mesma finalidade repetidamente. O ajuste fino pode ser feito uma vez e reutilizado para uma tarefa específica.