curso
Compactação de prompts: Um guia com exemplos em Python
No cenário em rápida evolução da inteligência artificial, a otimização de grandes modelos de linguagem (LLMs) não se trata apenas de ultrapassar os limites do que é possível, mas também de garantir a eficiência e a relação custo-benefício.
A compactação de prompts surgiu como uma técnica vital para aprimorar o desempenho desses modelos e, ao mesmo tempo, minimizar as despesas computacionais. Com o surgimento de novas pesquisas quase que semanalmente, manter-se atualizado é um desafio, mas é essencial entender os fundamentos.
Este artigo aborda os conceitos básicos da compactação de prompts, discute quando ela deve ser usada, sua importância na redução de custos em pipelines RAG e fornece exemplos usando o modelo gpt-3.5-turbo-0125 por meio da API da OpenAI.
Se você quiser saber mais, confira este curso sobre engenharia de prompt.
O que é a compactação de prompts?
A compressão de prompts é uma técnica usada no processamento de linguagem natural (PLN) para otimizar as entradas fornecidas aos LLMs, reduzindo seu comprimento sem alterar significativamente a qualidade e a relevância do resultado. Essa otimização é fundamental devido ao impacto que o número de tokens nas consultas tem sobre o desempenho do LLM.
Os tokens são as unidades básicas de texto que os LLMs usam, representando palavras ou subpalavras, dependendo do tokenizador do modelo de linguagem. A redução do número de tokens em um prompt é benéfica e, às vezes, necessária por vários motivos:
- Restrições de limite de token: Os LLMs têm um limite máximo de tokens para entradas. Exceder esse limite pode truncar informações importantes, reduzindo a clareza do resultado e a eficácia do modelo.
- Eficiência de processamento e redução de custos: Menos tokens significam tempos de processamento mais rápidos e custos mais baixos.
- Melhoria da relevância da resposta: Um prompt legível por humanos nem sempre significa um bom prompt. Às vezes, os prompts que consideramos bons e informativos contêm informações sem importância para os LLMs, como palavras vazias ("a", "o", "é" etc.).
A compactação de prompts reduz o número de tokens empregando estratégias como remoção de informações redundantes, resumo de pontos-chave ou utilização de algoritmos especializados para destilar a essência de um prompt e, ao mesmo tempo, minimizar sua contagem de tokens.
Quando devemos usar a compactação de prompts?
Vamos explorar os cenários em que podemos usar a compactação de prompts.
Técnicas avançadas de engenharia de prompt
Técnicas como criação de prompts com cadeia de pensamento, embora altamente eficazes, geralmente resultam em prompts longos que podem chegar a milhares de tokens. Isso aumenta o tempo e os custos de processamento e pode exceder os limites de tokens de determinados modelos.
A compactação de prompts atenua esses problemas reduzindo a contagem de tokens e preservando a eficácia do prompt.
Pipelines de geração aumentada por recuperação (RAG)
Os pipelines de RAG combinam a recuperação de informações com a geração de texto e são frequentemente usados em chatbots especializados e outros aplicativos em que a compreensão contextual é fundamental. Esses pipelines frequentemente precisam de extensos históricos de conversas ou de documentos recuperados como prompts, o que leva a altas contagens de tokens e a maiores despesas.
A compactação do prompts é fundamental nesses casos para manter o contexto essencial e minimizar os custos.
Aplicabilidade e limitações da compactação do prompts
É importante observar que a compactação do prompts não é uma solução universal e deve ser usada criteriosamente. Por exemplo, modelos de assistentes como o ChatGPT, projetados para contextos de conversação, podem não se beneficiar da compactação agressiva de prompts.
Esses modelos geralmente não cobram por token e têm recursos integrados de resumo de bate-papo e memória para gerenciar o histórico de conversas de forma eficaz, tornando a compactação redundante.
Também é importante observar que, mesmo ao trabalhar com modelos que cobram por token, a compactação excessiva pode levar à perda de distinções ou detalhes importantes. É essencial encontrar o equilíbrio certo entre reduzir o tamanho e manter a integridade do significado do prompt.
Como funciona a compactação de prompts?
As técnicas de compactação de prompts podem ser categorizadas em três métodos principais: destilação de conhecimento, codificação e filtragem. Cada técnica aproveita diferentes pontos fortes para otimizar o tamanho e a eficiência dos prompts para LLMs.
Vamos falar sobre cada uma dessas técnicas, mas você pode encontrar uma abordagem mais abrangente neste artigo: Métodos eficientes de prompt para modelos de idiomas grandes: Uma pesquisa. Ao longo deste artigo, vou me referir a esse documento como o "artigo da pesquisa".
Destilação de conhecimento
A destilação de conhecimento é uma técnica no campo do aprendizado de máquina, introduzida pela primeira vez por Hinton et al. (2015), em que um modelo menor e mais simples (o aluno) é treinado para replicar o comportamento de um modelo maior e mais complexo (o professor).
Essa técnica foi desenvolvida inicialmente para lidar com os desafios computacionais de treinar um conjunto de modelos. No contexto da engenharia de prompts, a destilação de conhecimento pode ser usada para compactar o prompt em vez do modelo.
Para isso, você precisa aprender a compactar os prompts rígidos nos LLMs por meio do ajuste de prompts flexíveis (soft prompt tuning). Para obter insights detalhados, consulte as seções 3.1 e o apêndice A.1.1 do artigo da pesquisa.
Codificação
Os métodos de codificação transformam os textos de entrada em vetores, reduzindo o tamanho do prompt sem perder informações críticas. Esses vetores capturam o significado essencial dos prompts, permitindo que os LLMs processem entradas mais curtas com eficiência.
É interessante notar que os LLMs são proficientes em outras linguagens, como a Base64, que pode ser utilizada na codificação para reduzir o tamanho do token do prompt. Por exemplo, o prompt "Traduza o texto a seguir para o francês: Hello, how are you?" codificado em Base64 é "VHJhbnNsYXRlIHRoZSBmb2xsb3dpbmcgdGV4dCB0byBGcmVuY2g6ICdIZWxsbywgaG93IGFyZSB5b3UnPw==". Você pode tentar pedir ao seu LLM favorito para testá-lo!
Surpreendentemente, algumas técnicas de codificação também são usadas para desbloquear modelos (jailbreak), o que envolve a manipulação do LLM para contornar seus mecanismos de segurança. Para obter mais detalhes sobre os métodos de codificação, consulte as seções 3.2 e o apêndice A.1.2 do artigo da pesquisa.
Filtragem
Enquanto os dois métodos anteriores tentam compactar todo o prompt, as técnicas de filtragem se concentram na eliminação de partes desnecessárias para aumentar a eficiência dos LLMs.
As técnicas de filtragem avaliam o conteúdo das informações de diferentes partes de um prompt e removem informações redundantes, pois nem todas as informações do prompt são benéficas para os LLMs. Isso pode ser feito em vários níveis, como sentenças, frases ou tokens.
O objetivo é manter apenas as partes mais relevantes do prompt. No artigo Selective Context, de Li et al. (2023), os pesquisadores usam métricas de autoinformação para filtrar informações redundantes. No artigo LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models, pesquisadores da Microsoft refinam os prompts em componentes-chave e ajustam dinamicamente as taxas de compactação de cada parte. Para ler mais, consulte as seções 3.3 e o apêndice A.1.3 do artigo da pesquisa.
Como implementar a compactação de prompts em Python
Nesta seção, implementarei e testarei o algoritmo Selective Context, que é popular e considerado o mais avançado. Se você quiser apenas testar o algoritmo, não precisa instalar nada, ele já está hospedado na plataforma HuggingFace.
Há também outras técnicas de compactação convencionais, como Keep It Simple (KIS), SCLR e os algoritmos da família LLMLingua, mas não será possível abordá-las neste breve artigo.
No aplicativo Selective Context, você pode escolher o idioma do prompt que deseja compactar (inglês ou chinês simplificado). Você também pode definir a taxa de compactação e selecionar se deseja filtrar sentenças, frases ou tokens.
Implementando e testando o Selective Content com a API da OpenAI
Agora vamos trabalhar na implementação do Python. Também testaremos alguns prompts compactados com o modelo gpt-3.5-turbo-0125.
Primeiro, precisamos instalar todos os módulos necessários. Precisamos instalar a biblioteca selective-context
usando pip
:
pip install selective-context
Também precisamos fazer o download do modelo en_core_web_sm
da spacy
, o que pode ser feito com o seguinte comando:
python -m spacy download en_core_web_sm
Agora, precisamos inicializar o objeto SelectiveContext
. Você pode escolher curie
ou gpt-2
para o modelo e en
ou zh
para o idioma. Para este exemplo, usarei o gpt-2
.
sc = SelectiveContext(model_type = ‘gpt-2’, lang = ‘en’)
Em seguida, podemos chamar nosso objeto SelectiveContext
na string de texto que queremos compactar. Podemos definir os parâmetros reduce_ratio
e reduce_level
. reduce_level
precisa ser um dos seguintes: ‘sent’,
‘phrase’
, ou ‘token’
. A chamada de objeto retorna uma tupla (context, reduced_content)
, em que context
é o prompt compactado e reduced_content
é uma lista de frases, sentenças ou tokens removidos.
context, reduced_content = sc(text, reduce_ratio = 0.5, reduce_level = ‘sent’)
Agora vamos fazer alguns exemplos. Pedirei ao modelo gpt-3.5-turbo-0125
para resumir a seção "Quando devemos usar a compactação de prompt" deste artigo. Em seguida, compactaremos a seção com uma taxa de compactação de 0,5 usando os três níveis de redução: sentença, frase e token. Pediremos ao modelo que resuma as versões compactadas novamente e compararemos a contagem de tokens de cada prompt e a saída do modelo.
Parágrafo original e resumo
Abaixo, você pode ver a chamada de API que vou usar. Basta alterar a variável text
na string de formato. Primeiro, pedimos ao modelo que resuma o parágrafo original, não compactado:
from openai import OpenAI
client = OpenAI(api_key = key)
completion = client.chat.completions.create(
model = “gpt-3.5-turbo-0125”,
messages = [
{“role”: “user”, “content”: f”Summarize the following paragraph:\n {text}”}
]
)
Ao verificar a completion.usage
, podemos ver que o prompt original tem 304 tokens, e aqui está o resultado:
[Prompt compression is useful in scenarios such as advanced prompt engineering techniques and retrieval-augmented generation pipelines to reduce token counts and costs while preserving effectiveness and context. However, it is not a universal solution and should be used judiciously, as excessive compression can lead to a loss of important details. It is important to strike a balance between reducing size and maintaining the prompt's meaning.]
Como você pode ver, o modelo resumiu muito bem o parágrafo não compactado.
Redução no nível de token
Agora vamos tentar a versão com redução de token. O parágrafo compactado ficou assim:
[When Should Prompt CompProm compression particularly following Advanced prompt engineering Techniques like chainofthought prompting while highly lengthy prompts reach thousands tokensThis increases processing costs and may exceed token limits of certain modelsProm compression mit these token count while prompt effectivenessRetri-au generationRAG pipelines R combine information retrieval text specialized chat contextual understandingThese pipelines frequently involve providing extensive conversation histories retrieved as prompts leading high token counts increased expensesProm compression essential such essential context while costsApplic prompt compression It prompt universal judFor instance assistant models like ChatGPT designed convers contexts benefit aggressive prompt compressionThese models often do charge per token integrated chat summar memory features conversation history effectively compression redundantIt even working models charge per token excessive compression could nuance importantSt reducing size maintaining prompt’s meaning is]
O prompt tem 162 tokens, e aqui está o resumo do modelo:
[Prompt compression is recommended following advanced prompt engineering techniques like chain of thought prompting, especially when dealing with lengthy prompts that reach thousands of tokens. This helps reduce processing costs and ensure that the prompt remains effective for models like RAG pipelines, which involve extensive conversation histories. Prompt compression is essential for maintaining context while keeping costs low, particularly for models like ChatGPT that charge per token and benefit from aggressive compression. However, excessive compression could lead to loss of important nuances, so it is important to strike a balance between reducing size and maintaining the prompt's meaning.]
O parágrafo não está resumido corretamente. A distinção sobre o fato de o ChatGPT não se beneficiar da compressão agressiva foi perdida.
Redução no nível da sentença
Em seguida, vamos tentar a redução do nível da sentença. O prompt reduzido tem 129 tokens:
[When Should We Use Prompt Compression? This increases processing times and costs and may exceed token limits of certain models. These pipelines frequently involve providing extensive conversation histories or retrieved documents as prompts, leading to high token counts and increased expenses. Prompt compression is essential in such cases to maintain essential context while minimizing costs. For instance, assistant models like ChatGPT, designed for conversational contexts, may not benefit from aggressive prompt compression. These models often do not charge per token and have integrated chat summarization and memory features to manage conversation history effectively, making compression redundant. ]
Este é o resumo do modelo:
[Prompt compression is necessary when processing times, costs, and token limits may be exceeded in pipelines involving extensive conversation histories or retrieved documents as prompts. However, for certain models like ChatGPT, designed for conversational contexts, aggressive prompt compression may not be beneficial as they already have features to manage conversation history effectively without the need for compression.]
Esse resumo não contém erros, mas está faltando a discussão do RAG.
Redução no nível da frase
Por fim, vamos testar a redução no nível da frase. O prompt tem 183 tokens:
[When Should Prompt Compression Prompt compression particularly beneficial Advanced prompt engineering techniques Techniques like chainofthought prompting while highly lengthy prompts reach thousands tokens This increases processing costs and may exceed token limits of certain models Prompt compression these issues token count while the prompt's effectiveness Retrieval-augmented generation (RAG) pipelines RAG pipelines combine information retrieval text generation specialized chatbots contextual understanding These pipelines frequently involve providing extensive conversation histories or retrieved as prompts leading high token counts increased expenses Prompt compression essential such cases to maintain essential context while costs Applicability prompt compression It's For instance assistant models like ChatGPT designed conversational contexts may benefit aggressive prompt compression These models often do charge per token have integrated chat summarization memory features manage conversation history effectively making compression redundant It even working models charge per token excessive compression could nuance important details reducing size maintaining the prompt’s meaning is
]
Este é o resumo do modelo:
[Prompt compression is beneficial in advanced prompt engineering techniques, such as chainofthought prompting, which can involve lengthy prompts reaching thousands of tokens. Retrieval-augmented generation (RAG) pipelines combine information retrieval and text generation in specialized chatbots, requiring extensive conversation histories or retrieved prompts leading to high token counts and increased expenses. Prompt compression is essential in maintaining context while managing costs in such cases. For instance, assistant models like ChatGPT, which are designed for conversational contexts, may benefit from aggressive prompt compression to effectively manage conversation history and reduce costs. However, excessive compression could compromise important details, so maintaining the prompt's meaning is crucial.]
O resumo está, em sua maior parte, correto e coerente. No entanto, ele entende erroneamente a parte sobre o ChatGPT se beneficiar da compactação agressiva de prompts.
Avaliação da compactação de prompts
Ao comparar as contagens de tokens e o conteúdo dos resumos do modelo em diferentes níveis de compactação, podemos ver o impacto da compactação de prompts na saída do modelo:
Nível de compressão |
Contagem de tokens (o original tem 304) |
Precisão |
Nível de token |
162 |
Perdeu distinções importantes sobre o fato de o ChatGPT não se beneficiar da compressão agressiva e cometeu erros. |
Nível da sentença |
129 |
Não cometeu nenhum erro, mas perdeu parte do contexto sobre os pipelines de RAG. |
Nível da frase |
183 |
Da mesma forma que no nível de token, afirmou incorretamente que o ChatGPT se beneficia da compactação agressiva. |
De modo geral, a compactação de prompts pode reduzir significativamente a contagem de tokens e, ao mesmo tempo, preservar as ideias principais. No entanto, é essencial encontrar um equilíbrio para evitar que você perca distinções e contextos importantes.
Esse exercício destaca a necessidade de escolher cuidadosamente o nível de compactação com base no aplicativo específico e na importância de manter determinados detalhes no prompt.
Vale a pena observar que realizamos todos os experimentos com uma taxa de compressão de 0,5, que é relativamente alta. Talvez você queira experimentar várias taxas de compactação para diferentes casos de uso a fim de encontrar o equilíbrio ideal entre a redução do tamanho do prompt e a manutenção de sua integridade.
Conclusão
A compactação de prompts é uma técnica poderosa para otimizar a eficiência e a relação custo-benefício dos LLMs. Exploramos seus fundamentos, discutindo sua importância, várias técnicas e detalhes de implementação.
Como o campo da IA generativa continua a evoluir, é fundamental que você fique a par dos últimos desenvolvimentos. Para aprimorar ainda mais suas habilidades e sua compreensão da compactação de prompts e das técnicas relacionadas, recomendo que você explore os documentos mencionados neste artigo, bem como as seguintes publicações abrangentes no blog e os cursos do DataCamp:
Perguntas frequentes sobre a compactação de prompts
O que é compactação de prompts e por que ela é importante?
A compactação de prompts é uma técnica usada para otimizar as entradas fornecidas a grandes modelos de linguagem (LLMs), reduzindo seu comprimento e mantendo a qualidade e a relevância da saída. Isso é importante porque ajuda a se manter dentro dos limites de tokens e reduz o tempo e os custos de processamento.
Quais são alguns dos desafios comuns na implementação da compactação de prompts?
Os desafios mais comuns incluem manter o equilíbrio entre a compactação e a preservação de informações essenciais, lidar com diversos tipos de dados de entrada e garantir que o prompt compactado ainda produza resultados de alta qualidade. Além disso, a implementação de abordagens híbridas e baseadas em aprendizado de máquina pode ser complexa e exigir muitos recursos.
Como você lida com a compactação de prompts para conversas com chatbots em vários turnos?
Para conversas em vários turnos, a compactação do prompt deve garantir que o contexto das interações anteriores seja preservado. Técnicas como a filtragem seletiva de contexto podem ajudar você a reter partes essenciais da conversa e, ao mesmo tempo, compactar informações menos importantes. Essa abordagem ajuda a manter a continuidade e a relevância das respostas do chatbot.
Que recursos posso usar para aprimorar minhas habilidades de compactação de prompts?
Para aprimorar ainda mais suas habilidades, explore os artigos de pesquisa, do blog e os cursos do DataCamp mencionados no artigo. Os tópicos incluem a compreensão da engenharia de prompt, o ajuste de prompts e a geração aumentada por recuperação (RAG), todos essenciais para você dominar a compactação de prompts. Além disso, certifique-se de praticar as técnicas que você aprendeu.
Existe alguma consideração ética ao usar a compactação de prompts?
Sim, as considerações éticas incluem garantir que a compactação não introduza vieses inadvertidamente ou omita informações críticas que possam levar a resultados enganosos ou prejudiciais. Além disso, as técnicas de compactação de prompts também podem desbloquear (jailbreak) inadvertidamente o modelo, fazendo com que ele se comporte de forma imprevisível ou gere conteúdo inadequado. É importante monitorar os efeitos da compactação de prompts sobre o desempenho e os resultados do modelo, especialmente em aplicativos sensíveis, como saúde, finanças ou consultoria jurídica.
Saiba mais sobre a engenharia de prompt!
curso
ChatGPT Prompt Engineering for Developers
curso
Developing LLM Applications with LangChain
blog
O que é a Prompt Engineering? Um guia detalhado para 2024
tutorial
Um guia para iniciantes na engenharia de prompts do ChatGPT
tutorial
Entendendo a classificação de textos em Python
tutorial
Stemming e lematização em Python
tutorial
Guia de torchchat do PyTorch: Configuração local com Python
François Aubry
tutorial