Melhore os prompts com o Vertex AI Prompt Optimizer

SET 26, 2024
Ivan Nardini DevRel Engineer Cloud AI
George Lee Product Manager Cloud AI Research

O design e a engenharia de prompts se destacam como um dos métodos mais acessíveis para gerar saídas significativas a partir de um Modelo de Linguagem Grande (LLM, na sigla em inglês). No entanto, criar prompts para modelos de linguagem grandes pode ser como navegar por um labirinto complexo.

O design de prompts é uma disciplina relativamente nova, com várias técnicas que precisam ser exploradas. Para ter uma ideia, confira o guia de engenharia de prompts. Além disso, para obter os melhores resultados de um LLM, você deve experimentar várias combinações de instruções e exemplos para obter a saída desejada. E, mesmo que você encontre o modelo de prompt ideal, não há garantia de que esse prompt continuará a realizar a tarefa em outro LLM. Como resultado, você acaba gastando mais tempo migrando ou traduzindo um modelo de prompt entre vários modelos.

Para mitigar a "fadiga de prompts" que pode ocorrer ao criar aplicativos baseados em LLM, anunciamos o Vertex AI Prompt Optimizer em pré-lançamento público. Neste blog, você verá como dar os primeiros passos com o Vertex AI Prompt Optimizer usando o SDK da Vertex AI para Python. Ao final da leitura deste artigo, você terá uma compreensão melhor do Vertex AI Prompt Optimizer e de como ele ajuda a economizar tempo e esforços na engenharia de prompts, garantindo prompts de alto desempenho prontos para aplicativos de GenAI.


Vertex AI Prompt Optimizer: da pesquisa à produção

O Vertex AI Prompt Optimizer é um serviço de otimização de prompts que ajuda os usuários a encontrar o melhor prompt (instrução e demonstrações) para qualquer modelo preferencial na Vertex AI, onde as instruções incluem a instrução do sistema, o contexto e a tarefa do modelo de prompt e as demonstrações são os exemplos few-shot que você fornece no prompt para obter um estilo ou tom específico na resposta do modelo. O Vertex AI Prompt Optimizer é baseado no artigo do Google Research sobre métodos de otimização automática de prompts (APO, na sigla em inglês), aceita pela NeurIPS de 2024.

Imagine que você queira resolver um problema de matemática como o indicado abaixo. Você precisa de instruções e exemplos claros para ajudar nisso. As instruções nos fornecem as regras para resolver os problemas (por exemplo, como lidar com números negativos). Os exemplos demonstram como aplicar as regras. Essa é a ideia por trás do Vertex AI Prompt Optimizer.

Para encontrar os melhores exemplos e instruções, o Vertex AI Prompt Optimizer emprega um algoritmo de otimização iterativo baseado em LLM, no qual o modelo otimizador e o modelo avaliador trabalham juntos para gerar e avaliar os prompts candidatos e, posteriormente, selecionam as melhores instruções e demonstrações com base nas métricas de avaliação pelas quais o usuário deseja fazer a otimização. Abaixo, você pode ver uma ilustração de como o Vertex AI Prompt Optimizer funciona.

Com apenas alguns exemplos rotulados (par de entrada e saída de verdade absoluta, ou "ground truth") e a configuração da otimização, o Vertex AI Prompt Optimizer encontra o melhor prompt (instrução e demonstrações) para o modelo de destino, economizando tempo e esforços significativos para os usuários. Em última análise, o produto simplifica o processo de design e engenharia de prompts e melhora a qualidade geral dos aplicativos baseados em LLM. Os usuários agora podem criar um novo prompt para uma tarefa específica ou traduzir um prompt de um modelo para outro na Vertex AI com facilidade.

Agora que você tem uma compreensão melhor de como funciona o Vertex AI Prompt Optimizer, vejamos como aprimorar um prompt para usá-lo com um modelo do Google na Vertex AI.


Primeiros passos com o Vertex AI Prompt Optimizer

Imagine que você tenha criado um assistente de culinária simples com a IA que fornece sugestões sobre como preparar pratos mais saudáveis. Por exemplo: você pergunta "Como criar sobremesas saudáveis que ainda sejam deliciosas, reduzindo a adição de açúcar e gorduras não saudáveis?". E o assistente de culinária de IA responde: "Aqui estão algumas dicas de como alcançar esse equilíbrio em sua receita, minimizando a adição de açúcar e gorduras não saudáveis: …". Veja abaixo um exemplo de resposta gerada.

Example of user question, context, prompt, answer

A versão inicial do assistente de culinária de IA usa um LLM com o seguinte modelo de prompt simples:

Dada uma pergunta com algum contexto, forneça a resposta correta para a pergunta. \nPergunta: {{question}}\nContexto: {{context}}\nResposta: {{target}}

Com base no conjunto de dados de avaliação de pergunta e resposta que você coletou e nas métricas de avaliação de pergunta e resposta calculadas usando a avaliação de GenAI da Vertex AI, a versão inicial do assistente de culinária de IA pode gerar respostas contextualmente relevantes e de alta qualidade. Este é um resumo do relatório de métricas de avaliação.

Graph of evaluation metrics, showing question_answering_quality/mean is 4 times as high in mean value as groundedness/mean

Nada mal. Mas ainda é possível melhorar a qualidade das respostas geradas em relação às perguntas associadas. Vamos imaginar que você queira usar o Gemini 1.5 Flash como LLMs mais eficientes para o assistente, mas não tenha experiência com a família de modelos Gemini para encontrar um modelo de prompt com desempenho melhor a fim de concluir a tarefa com o Gemini 1.5 Flash. É aqui que o Vertex AI Prompt Optimizer entra em ação.

Para usar o Vertex AI Prompt Optimizer para melhorar o modelo de prompt, siga estes passos:

  1. Prepare o modelo do prompt.
  2. Faça upload de amostras rotuladas para um bucket do Cloud Storage.
  3. Defina as configurações de otimização.
  4. Execute o job de otimização.
  5. Obtenha o prompt otimizado e avalie a otimização.


1. Prepare o modelo do prompt

Para começar, prepare o modelo do prompt que você deseja otimizar. O Vertex AI Prompt Optimizer espera um prompt com o modelo de instrução, que é uma parte fixa do modelo do prompt compartilhada entre todas as consultas para uma determinada tarefa, e o modelo de contexto e tarefa, que é a parte dinâmica do modelo do prompt, que muda com base na tarefa. Abaixo, você pode ver o modelo original preparado para uso com o Vertex AI Prompt Optimizer em uma tarefa de pergunta e resposta.

INSTRUCTION_TEMPLATE = """
Given a question with some context, provide the correct answer to the question.
"""
 
CONTEXT_TASK_TEMPLATE = """
Question: {{question}}
Answer: {{target}}
"""

2. Faça upload de amostras rotuladas para um bucket do Cloud Storage

Em seguida, o Vertex AI Prompt Optimizer requer um arquivo CSV ou JSONL contendo amostras rotuladas (pares de entrada e saída de verdade absoluta) que serão usadas durante o processo de otimização. Neste caso de uso, é recomendável rotular exemplos dos modelos de origem com os quais o modelo de destino tem dificuldades. Isso ajudaria a identificar áreas para melhoria. Veja abaixo um exemplo da amostra rotulada do qual você faz upload para o bucket do Google Cloud.

{"target":"Here\'s how to tackle those delicious red meats and pork while keeping things healthy:\\n\\n**Prioritize Low and Slow:**\\n\\n* **Braising and Stewing:** These techniques involve gently simmering meat in liquid over low heat for an extended period. This breaks down tough collagen, resulting in incredibly tender and flavorful meat. Plus, since the cooking temperature is lower, it minimizes the formation of potentially harmful compounds associated with high-heat cooking. \\n\\n* **Sous Vide:** This method involves sealing meat in a vacuum bag and immersing it in a precisely temperature-controlled water bath...","question":"What are some techniques for cooking red meat and pork that maximize flavor and tenderness while minimizing the formation of unhealthy compounds? \\n\\nnContext:\\nRed meat and pork should be cooked to an internal temperature of 145\\u00b0F (63\\u00b0C) to ensure safety. \\nMarinating meat in acidic ingredients like lemon juice or vinegar can help tenderize it by breaking down tough muscle fibers. \\nHigh-heat cooking methods like grilling and pan-searing can create delicious browning and caramelization, but it\'s important to avoid charring, which can produce harmful compounds. \\n"}

3. Defina as configurações de otimização

Para executar o job de otimização de prompts, o Vertex AI Prompt Optimizer também requer a definição das configurações de otimização. O job do Vertex AI Prompt Optimizer é executado como um job personalizado de treinamento da Vertex AI. Ele dá suporte a qualquer modelo do Google compatível com a API Vertex LLM e a uma ampla gama de métricas de avaliação baseadas em computação, baseadas em LLM ou mesmo definidas pelos usuários. Isso ocorre porque o Vertex AI Prompt Optimizer é integrado ao Vertex Rapid Evaluation Service. Para transmitir essas configurações, o Vertex AI Prompt Optimizer aceita uma lista de argumentos ou o caminho de arquivo do bucket do Google Cloud de um arquivo de configuração JSON. Veja a seguir alguns exemplos de configurações básicas no Vertex AI Prompt Optimizer.

params = {
    'num_steps': OPTIMIZATION_STEPS,
    'system_instruction': SYSTEM_INSTRUCTION,
    'prompt_template': PROMPT_TEMPLATE,
    'target_model': TARGET_MODEL,
    'eval_metrics_types': EVALUATION_METRICS,
    'optimization_mode': OPTIMIZATION_MODE,
    'num_template_eval_per_step': OPTIMIZATION_PROMPT_PER_STEPS,
    'num_demo_set_candidates': DEMO_OPTIMIZATION_STEPS,
    'demo_set_size': DEMO_OPTIMIZATION_PROMPT_PER_STEPS,
    'input_data_path': INPUT_DATA_FILE_URI,
    'output_data_path': OUTPUT_DATA_FILE_URI,
 
}

O Vertex AI Prompt Optimizer permite otimizar prompts otimizando apenas as instruções, apenas a demonstração ou ambas (optimization_mode) e, depois que você define a instrução do sistema, os modelos de prompt que serão otimizados (system_instruction, prompt_template) e o modelo para o qual você deseja otimizar (target_model), ele permite condicionar o processo de otimização definindo métricas de avaliação, o número de iterações usadas para melhorar o prompt e muito mais. Confira a documentação para saber mais sobre os parâmetros de otimização com suporte.

Com as amostras e a configuração prontas, você faz upload delas no bucket do Google Cloud, conforme mostrado abaixo.

from etils import epath
 
# upload configuration
with epath.Path(CONFIG_FILE_URI).open('w') as config_file:
      json.dump(args, config_file)
config_file.close()
 
# upload prompt opt dataset
prepared_prompt_df.to_json(INPUT_DATA_FILE_URI, orient="records", lines=True)

4. Execute o job de otimização

Neste ponto, você já tem tudo pronto para executar seu primeiro job do Vertex AI Prompt Optimizer usando o SDK da Vertex AI para Python.

WORKER_POOL_SPECS = [{
    'machine_spec': {
        'machine_type': 'n1-standard-4',
    },
    'replica_count': 1,
    'container_spec': {
        'image_uri' : APD_CONTAINER_URI,
        'args': ["--config=" + CONFIG_FILE_URI]
}}]
 
custom_job = aiplatform.CustomJob(
      display_name=PROMPT_OPTIMIZATION_JOB,
      worker_pool_specs=WORKER_POOL_SPECS,
  )
 
custom_job.run()

Observe como o Vertex AI Prompt Optimizer é executado como um job personalizado de treinamento da Vertex AI usando o contêiner do Vertex AI Prompt Optimizer. O fato de que esse serviço aproveita o treinamento e a avaliação de GenAI da Vertex AI é uma prova de como a Vertex AI fornece uma plataforma para a execução da GenAI, mesmo quando ela vem diretamente de pesquisas, como neste caso.

Depois de enviar o job do Vertex AI Prompt Optimizer, você pode monitorá-lo na visualização de jobs personalizados de treinamento da Vertex AI, conforme mostrado aqui.

Training custom jobs view in Vertex AI

5. Obtenha o prompt otimizado e avalie a otimização

Após a execução bem-sucedida do job de otimização, você pode encontrar instruções ou demonstrações otimizadas, ou ambas, como arquivos json no bucket de saída do Cloud Storage. Graças a algumas funções auxiliares, você pode obter a seguinte saída indicando a etapa de otimização quando obtiver a melhor instrução, de acordo com as métricas definidas.

Optimized instruction report in Vertex AI

Você obtém o mesmo resultado para as demonstrações otimizadas.

Por fim, você pode gerar as novas respostas com a saída otimizada. Veja abaixo um exemplo de resposta gerada usando o modelo otimizado de instruções do sistema.

Gemini_answer_with_apd example

E, se você usar isso para executar uma nova rodada de avaliação com a avaliação de GenAI da Vertex AI, poderá obter uma saída como esta mostrada abaixo, na qual o prompt otimizado supera o modelo anterior com o modelo de prompt anterior respectivo às métricas de avaliação selecionadas.

Graph showing increased question_answering_quality/mean

Conclusão

A engenharia de prompts é uma das etapas mais importantes, e desafiadoras, do processo de operacionalização de aplicativos baseados em LLM. Para ajudar a elaborar um modelo de prompt, o Vertex AI Prompt Optimizer encontra o melhor prompt (instrução e demonstrações) para qualquer modelo preferencial na Vertex AI.

Este artigo mostrou um exemplo de uso do Vertex AI Prompt Optimizer para melhorar um modelo de prompt para um modelo Gemini usando o SDK da Vertex AI para Python. Você também pode usar o Vertex AI Prompt Optimizer por meio do notebook de IU, aqui.

Resumindo: o Vertex AI Prompt Optimizer pode economizar tempo e esforços na engenharia de prompts, garantindo que você tenha prompts de alto desempenho para aplicativos de GenAI.

Agradecemos a leitura!


O que vem por aí

Quer saber mais sobre o Vertex AI Prompt Optimizer e como usá-lo? Confira estes recursos:

Documentação

Exemplos do Github

Blog do Google Cloud