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 dar. A engenharia de comando é a de elaboração de perguntas para conseguir o melhor resultado de um LLM. Ele é uma etapa crucial na implementação de um recurso baseado em LLMs.

A engenharia de comandos é um processo iterativo. Se você testou LLMs diferentes, você provavelmente notou que precisava ajustar seu comando para a alcançar um resultado melhor.

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

Interfaces de chat com LLMs grandes, como o Gemini ou ChatGPT, muitas vezes pode produzir resultados satisfatórios com esforço mínimo de comandos. No entanto, ao trabalhar com um LLM padrão menor que não é ajustado, para adaptar sua 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 os tamanhos do LLM é complicado e nem sempre é divulgados pelos criadores.

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

Onde LLMs menores são usados?

  • IA generativa no dispositivo/navegador, por exemplo, se você estiver usando o Gemma 2B. com a API LLM Inference do MediaPipe (mesmo adequado para dispositivos apenas com CPU) ou DistilBert no navegador com Transformers.js. Só é possível fazer o download de um modelo e executar inferência no dispositivo de um usuário com esses LLMs menores, para manter os downloads da Web razoáveis e adequados as restrições de memória e GPU/CPU de um dispositivo.
  • IA generativa personalizada do lado do servidor. Pequenos modelos de peso aberto, como Gemma 2B, O Gemma 7B ou o Gemma 27B estão disponíveis para você executar no seu próprio servidor (e opcionalmente ajustar).

Primeiros passos

As interfaces de chat com LLMs grandes, como Gemini ou ChatGPT, geralmente produzem resultados satisfatórios com pouco esforço de comando. 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 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 (revisã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 o dia todo. Eu recomendaria. 5 4 de 5 estrelas**
As alças estão frágeis, e eles começaram a cavar meus ombros sob cargas pesadas. 1 2/5

O Gemini 1.5 gera o resultado desejado com esse comando simples, mas o 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 one-shot, few-shot e multi-shot e comandos da cadeia de pensamento. Também devemos fornecer instruções de formato claras e insistir que o modelo deve usar toda a faixa 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 (revisão) Gerar saída com um LLM menor (Gemma 2B)

Adorei o ajuste! Distribui bem o peso e de maneira surpreendente confortáveis até mesmo em caminhadas o dia todo. Eu recomendaria.

Análise: essa avaliação é altamente positiva e enfatiza a importância ajuste e conforto, indicando grande satisfação com o produto. Isso justifica uma classificação alta.

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

As alças estão frágeis, e eles começaram a mexer nos meus ombros sob cargas pesadas.

**Análise:** a revisão destaca um problema significativo de conforto com as alças. Também sugere que o produto pode não ser adequado para cargas cargas de trabalho intensas ou passeios prolongados.

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

Nosso comando mais elaborado, combinado com os comandos few-shot e as técnicas de comandos da cadeia de pensamento, gera classificações mais precisas.

Espere análise de saída manual

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

No primeiro exemplo, usamos comandos de cadeia de pensamento, então a saída incluiu uma análise e uma classificação, e precisamos fazer a análise manualmente para a classificação. Além disso, Observe a formatação inconsistente na saída da 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 da API Mind

APIs LLM na nuvem, como a API Gemini ou OpenAI, que normalmente são a entrada para LLMs maiores, oferecem recursos de comando úteis. Por exemplo, 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. para LLMs menores acessados usando APIs de IA no navegador, como as API MediaPipe LLM Inference ou Transformers.js. Embora isso não seja necessariamente uma limitação técnica, as APIs de IA no navegador tendem a mais enxuto.

Lembre-se dos limites de tokens

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

Além disso, modelos menores tendem a ter um limite de tokens de entrada menor. Para 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 8K.

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

Adapte as estimativas de tempo

Considerar o design e o teste de comandos nas estimativas de tempo de engenharia.

Devido às diferenças de API e aos limites de tokens, é provável que você precise de mais tempo e esforço para criar o comando para um LLM menor do que para um maior. Teste e validação a saída do LLM também exige mais esforço.

Engenheiro de comandos ou ajustes?

Para desenvolvedores Web, a engenharia de comando é nossa forma preferida de aproveitar IA generativa em relação ao treinamento personalizado e ajustes. Mas até 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 o ajuste quando:

  • Você precisa de acurácia e desempenho de alto nível para uma tarefa específica. Fino o ajuste ajusta diretamente os parâmetros internos do modelo para conseguir resultados ideais.
  • Você tem dados bem selecionados, relevantes para sua tarefa, já rotulados com e suas saídas preferenciais. Esses dados são necessários para fazer ajustes com eficiência.
  • Você usa o modelo repetidamente com a mesma finalidade. É possível fazer ajustes uma vez e reutilizado para uma tarefa específica.