Engenharia de comandos prática para LLMs menores

Maud Nalpas
Maud Nalpas

A eficácia de um modelo de linguagem grande depende muito das instruções que fornecemos. A engenharia de comandos é o processo de elaborar perguntas para gerar a melhor saída de um LLM. Essa é uma etapa crucial na implementação de um recurso baseado em LLM.

A engenharia de comandos é um processo iterativo. Se você testou diferentes LLMs, provavelmente percebeu que precisa ajustar o comando para alcançar um resultado melhor.

Isso também se aplica a modelos de tamanhos diferentes.

As interfaces de chat com LLMs grandes, como o Gemini ou o ChatGPT, geralmente podem produzir resultados satisfatórios com o mínimo de esforço. No entanto, ao trabalhar com um LLM padrão menor que não é ajustado, é necessário adaptar a abordagem.

LLMs menores são menos potentes e têm um conjunto 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 criadores.

Neste documento, "LLMs menores" significa qualquer modelo com menos de 30 bilhões de parâmetros. Atualmente, modelos com alguns milhões ou alguns bilhões de parâmetros podem ser executados de maneira realista no navegador em dispositivos de nível do consumidor.

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 (mesmo adequada para dispositivos que usam apenas CPU) ou o DistilBert no navegador com Transformers.js. Só é possível fazer o download de um modelo e executar a inferência no dispositivo de um usuário com esses LLMs menores para manter os downloads da Web razoáveis e para se adequar às restrições de memória e GPU/CPU do dispositivo.
  • IA generativa personalizada do lado do servidor. Pequenos modelos de peso aberto, como Gemma 2B, Gemma 7B ou Gemma 27B, estão disponíveis para execução no seu próprio servidor (e, opcionalmente, ajustes).

Começar

As interfaces de chat com LLMs grandes, como o Gemini ou o ChatGPT, geralmente produzem resultados satisfatórios com o mínimo de esforço. No entanto, ao trabalhar com LLMs menores, você precisa adaptar sua abordagem. LLMs menores são menos potentes e têm um conjunto menor de informações para extrair.

Forneça contexto e instruções precisas de formato

Para alcançar os melhores resultados com pequenos LLMs, 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 (revisão) Saída (classificação)
  LLM maior (Gemini 1.5) LLM menor (Gemma 2B)
Absolutamente o ajuste! Distribui bem o peso e é surpreendentemente confortável para caminhadas o dia todo. Recomendo. 5 4 de 5 estrelas**
As alças são frágeis, e elas começaram a enfiar 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 de 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 é positiva o suficiente para indicar uma avaliação de 5 estrelas.

Para corrigir isso, precisamos usar técnicas de engenharia de comandos, comandos um, poucos e vários disparos e comandos em cadeia de pensamento. Também precisamos fornecer instruções claras de formato e insistir que o modelo use todas as 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 (revisão) Saída com um LLM menor (Gemma 2B)

Absolutamente o ajuste! Distribui bem o peso e surpreende o conforto até mesmo para caminhadas o dia todo. Recomendo.

Análise: a avaliação é muito positiva e enfatiza o ajuste e o conforto do produto, indicando uma grande satisfação com o produto. Isso justifica uma classificação alta.

Classificação (número inteiro): 5

As alças são frágeis e começaram a enfiar meus ombros sob cargas pesadas.

**Análise:** a avaliação destaca um problema significativo de conforto com as alças. Isso também sugere que o produto não é adequado para cargas pesadas ou viagens prolongadas.

**Classificação:** 1 (pior)

Nossos comandos mais elaborados, combinados com os comandos few-shot e as técnicas de comandos em cadeia de pensamento, oferecem classificações mais precisas.

Esperar análise de saída manual

Embora sempre seja necessário limpar e interpretar manualmente a saída de um LLM, isso é particularmente verdadeiro para LLMs menores, que podem produzir resultados menos refinados e podem exigir comandos de cadeia de pensamento.

No primeiro exemplo, usamos comandos em cadeia de pensamento, então a saída incluiu uma análise e uma classificação, e precisamos analisá-la manualmente. Observe também a formatação inconsistente na saída na seção anterior: o modelo às vezes gera markdown, mas não todas as vezes.

// 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);
}

Diferenças de API Mind

As APIs de nuvem de LLMs, como a API Gemini ou OpenAI, que normalmente 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 o 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 MediaPipe LLM Inference ou o Transformers.js. Embora não seja necessariamente uma limitação técnica, as APIs de IA no navegador tendem a ser mais enxutas.

Limites de token do Mind

Como seu comando para LLMs menores precisa incluir exemplos ou instruções mais detalhadas, ele provavelmente será mais longo e ocupará mais do seu limite de tokens de entrada, se houver.

Além disso, modelos menores tendem a ter um limite menor de tokens de entrada. Por exemplo, o Gemini 1.5 Pro tem um limite de token de entrada de um milhão, enquanto os modelos Gemma têm uma janela de contexto de 8K.

Use funções de contagem de tokens para evitar atingir o limite.

Adapte suas estimativas de tempo

Considere o design e os testes de comandos nas estimativas de tempo de engenharia.

Devido às diferenças na API e aos limites de tokens, você provavelmente vai precisar de mais tempo e esforço para criar seu comando para um LLM menor do que um maior. Testar e validar a saída do LLM também pode exigir mais esforço.

Engenheiro de comandos e ajustes?

Para desenvolvedores da Web, a engenharia de prompts é nossa maneira preferida de aproveitar a IA generativa em vez de treinamento personalizado e ajuste. No entanto, mesmo a engenharia de comando avançada pode não ser suficiente em alguns casos de uso, especialmente se você estiver usando um LLM menor.

Use os ajustes quando:

  • Você precisa de alto nível de precisão e desempenho para uma tarefa específica. Com o ajuste, os parâmetros internos do modelo são ajustados diretamente para alcançar os melhores resultados.
  • Você tem dados bem selecionados, relevantes para sua tarefa, já rotulados com resultados preferidos. Esses dados são necessários para fazer ajustes com eficiência.
  • Você usa o modelo repetidamente com o mesmo propósito. O ajuste fino pode ser feito uma vez e reutilizado para uma tarefa específica.