EventoObtenha 50% de desconto no seu ingresso para MongoDB.local Londres em outubro 2. Use o código WEB50Saiba mais >>
Desenvolvedor MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

Como otimizar aplicativos LLM com compactação de prompts usando LLMLingua e LangChain

Richmond Alake13 min read • Published Jun 18, 2024 • Updated Jun 18, 2024
IAAtlasPython
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Imagine este cenário: você está aproveitando a glória do reconhecimento de toda a empresa por desenvolver um aplicativo GenAI inovador quando, de repente, aparece uma temida notificação do seu gerente: os custos operacionais estão disparando. Após uma rápida investigação, você descobre o culpado: os custos de inferência do LLM estão aumentando devido ao alto uso de tokens de entrada causado pelo número crescente de usuários que utilizam seu aplicativo.
Você pode evitar essa situação de pesadelo de custos operacionais disparados com a abordagem certa. Como engenheiros e profissionais da AI Stack, podemos apreciar a expansão consistente da janela de contexto dos LLMs e dos modelos básicos fornecidos por empresas como OpenAI, Anthropic, Cohere e Google.
Estou certo de que há um futuro em que você poderá colocar uma biblioteca inteira em um único prompt do modelo GPT da OpenAI. No entanto, a eficiência operacional e o custo ainda são as principais considerações para os aplicativos de software. Ao implementar técnicas de compressão rápida, você pode reduzir significativamente a contagem de tokens das entradas do seu aplicativo LLM, levando a uma economia substancial de custos sem comprometer a qualidade da resposta.
Este tutorial explora técnicas para otimizar o uso de token em aplicativos LLM, especificamente para reduzir o espaço ocupado por tokens de entradas ou prompts para LLMs sem comprometer a qualidade da resposta. 
Aqui está o que abordaremos:
  • Definição e visão geral da compactação de prompt
  • Implementação de compressão rápida em aplicativos LLM com LangChain e LLMLingua
  • Aplicar compressão de prompt em pipelines RAG
  • Utilizando compressão de prompt em agentes de AI
Todo o código apresentado neste tutorial é encontrado no repositório.

O que é a compactação de prompt?

A compactação de prompt é o processo de reduzir sistematicamente o número de tokens alimentadas em um modelo de idioma grande para manter ou corresponder de perto a qualidade de saída comparável à do prompt original não compactado.
A premissa geral do desenvolvimento de aplicativos LLM é fornecer instruções abrangentes elaboradas e projetadas para condicionar o LLM a fornecer resultados que sigam uma especificação de estrutura, processo de raciocínio, inclusão, exclusão de informações etc. Os resultados positivos de fornecer aos LLMs prompts abrangentes levaram ao design de estruturas sistematizadas de prompts, como cadeia de ideias, aprendizado em contexto e solicitação do ReAct.
Embora a solicitação extensiva forneça resultados LLM desejáveis, há uma compensação entre os LLMs produzidos por meio de solicitação extensiva e fatores como aumento do número de tokens, sobrecarga computacional e latência de resposta.
Para limitar as compensações que desenvolvedores e engenheiros precisam fazer ao criar aplicativos LLM, começaram a surgir técnicas para reduzir a contagem de tokens de prompts de entrada. O foco foi colocado em técnicas para determinar quais aspectos de um prompt extensivo são importantes o suficiente para serem retidos em uma versão de prompt compactado.
O princípio orientador que cerca a maioria dos esforços de compactação de prompts está centrado na noção de que, embora prompts extensos forneçam resultados desejáveis dos LLMs, o comprimento de um prompt ou quão descritivo é o conteúdo do prompt não é o único contribuinte para a resposta desejável dos LLMs. Em vez disso, incluir informações-chave e contexto leva os LLMs a um espaço de resposta desejável. Embora para os humanos ter uma explicação extensiva de uma ideia, conceito ou problema possa ser útil para a compreensão e a compreensão, os LLMs exigem apenas uma pequena quantidade de informações para obter a compreensão.
A vantagem prática de empregar técnicas de compressão rápida é a capacidade de manter as informações gerais em um prompt não compactado e, ao mesmo tempo, reduzir significativamente o número de tokens. No entanto, é importante observar que as técnicas de compressão imediata podem resultar na perda de informações, principalmente informações mencionadas uma vez ou raramente no prompt descompactado. Apesar disso, os benefícios gerais da compactação imediata, como a otimização aprimorada de tokens e a redução da sobrecarga computacional, fazem dela uma estratégia valiosa para aplicativos LLM.
O artigo "Prompt Compression and Contrastive Conditioning for Controllability and Toxicity Reduction in Language Models, ", publicado em 6 de outubro de 2022, introduziu a compressão rápida como termo e técnica oficiais.
Avançando apenas alguns anos, várias técnicas de compactação rápida emergiram. Essas técnicas abordam coletivamente o desafio da otimização de token dentro de aplicativos LLM, mantendo a controlabilidade do LLM e a qualidade de saída.A bibliotecaLLMLinguaPython da Microsoft apresenta um método que ganha força significativa.

Implementação de compactação rápida em aplicativos LLM com LLMLingua

O artigo "LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models" de Huiqiang Jiang, Qianhui Wu, Chin-Yew Lin, Yuqing Yang e Lili Qiu da Microsoft Corporation apresenta uma estrutura, LLMLingua, para compactar prompts alimentados em grandes modelos de linguagem (LLMs). Ele aborda os desafios do aumento da latência de inferência de custos computacionais a partir de técnicas de engenharia de prompt que melhoram a qualidade de saída do LLM por meio de prompts extensos e descritivos.
Os resultados apresentados no documento mostram que o LLMLingua comprime os prompts por um fator significativo e ainda mantém a qualidade de saída semelhante à do prompt não compactado.
Visão geral do LLMLingua-2 do artigo LLMLingua 2 : https://arxiv.org/pdf/2403.12968
Dois documentos subsequentes foram escritos pela equipe de pesquisa da Microsoft que melhoraram os recursos de compressão de prompt do LLMLingua. "LongLLMLingua: Accelerating and Enhancing LLMs in Long Context Scenarios via Prompt Compression" introduziu um método de determinação de informações importantes em prompts não compactados que levaram a uma compactação de melhor qualidade. "LLMLingua-2: Data Distillation for Efficient and Faithful Task-agnostic Prompt Compression" introduziu técnicas para tornar a compactação imediata generalizável e independente de tarefas.

Como implementar a compactação rápida em pipelines RAG

A implementação de técnicas de compressão rápida usando o LLMLingua em pipelines de geração aumentada por recuperação (RAG) pode ser relativamente simples. O pacote LLMLingua Python fornece métodos intuitivos e construtores de classe, permitindo o acesso contínuo a técnicas e modelos de compressão projetados para compressão rápida eficiente.
Uma vantagem significativa de usar o LLMLingua é sua integração com estruturas de abstração LLM amplamente adotadas, como LangChain e LlamaIndex. Nesta seção de tutorial, você observará a implementação de técnicas de compressão em um pipeline RAG simples e uma implementação de pipeline RAG com LangChain que aproveita o LLMLingua para compressão rápida.
Algo a observar é que os trechos de código nesta seção fazem parte de uma bloco denotas. Os trechos de código abaixo destacam a principal implementação do LLMLingua usando apenas o pacote Python e aproveitam a integração com o LangChain.
Abaixo está um trecho de código que ilustra a inicialização de um objeto de compressor de prompt da biblioteca LLMLingua. Primeiro, importamos a classe necessária e inicializamos uma instância do PromptCompressor com uma configuração de modelo específica.
As etapas no trecho de código acima são as seguintes:
  • Importando PromptCompressor: A classe PromptCompressor é importada do módulollmlingua . Esta classe comprime os prompts usando um modelo especificado, a configuração que o acompanha e outros detalhes específicos do compressor.
  • Criando uma instância do PromptCompressor: Uma instância do PromptCompressor é criada e atribuída à variável llm_lingua. Os parâmetros fornecidos durante a inicialização são:
  1. model_name: Especifica o modelo a ser utilizado para a tarefa de compactação, neste caso, "microsoft/llmlingua-2-bert-base-multilingual-cased-meetingbank"
  2. model_config: Definições de configuração do modelo, especificando aqui orevision a ser usado como "main"
  3. use_llmlingua2: Um sinalizador booleano indicando se o LLMLingua2 deve ser usado, que aproveita uma abordagem independente de tarefas para solicitar a compactação
  4. device_map: especifica o dispositivo no qual carregar o modelo do compressor, neste caso, " cpu "; se estiver utilizando aceleradores de hardware, como GPU, “cuda” deve ser especificado como ovalor desse argumento
A próxima etapa é definir uma função que usa uma string simples contendo o prompt descompactado para ser inserido no LLM e a passa como entrada para a instância do compressor de prompt criado no código anterior. A função também especificará os parâmetros de configuração que orientam o algoritmo de compressão.
  • Definição de função: Uma função chamada compress_query_prompt é definida e recebe um único parâmetro context.
  • Compactando o prompt: Dentro da função, o método compress_promptda { PromptCompressor , llm_lingua, é chamado com os seguintes argumentos: 1.context: Converte a entrada context em um formato de string
  1. rate: Especifica a taxa de compressão; aqui, 0.33 indica que o compressor tentará comprimir o prompt para 33% de seu tamanho original não compactado
  2. force_tokens: uma lista de tokens (["!", ".", "?", "\n"]) que devem estar presentes no prompt compactado e não removidos durante a compactação
  3. drop_consecutive: um sinalizador booleano indicando se os tokens consecutivos especificados na lista force_tokendevem ser descartados, mas aparecem consecutivamente um após o outro no prompt compactado
A classe PromptCompressorda biblioteca LLMLingua fornece um métodocompress_prompteficiente que retorna um dicionário abrangente contendo informações cruciais sobre o processo de compactação do prompt. Abaixo está uma captura de tela do exemplo do resultado da operação.
Saída do processo de compressão Este dicionário encapsula os seguintes elementos-chave:
  • compressed_prompt: a versão reduzida e otimizada do prompt original, obtida por meio das técnicas avançadas de compactação do LLMLingua
  • origin_tokens: A contagem inicial de tokens calculada a partir do prompt original não compactado, servindo como uma linha de base para avaliar a eficácia da compactação
  • compressed_tokens: A contagem de tokens do prompt compactado, fornecendo uma medida quantitativa da redução obtida
  • ratio: uma métrica que representa a proporção entre a contagem de tokens compactados e a contagem de tokens original, oferecendo uma comparação do nível de compactação
  • rate: A taxa na qual a compressão foi obtida, expressa como uma taxa
  • saving: Um valor monetário que indica a economia de custos projetada resultante do uso reduzido do token, calculado com base no modelo de preços atual do GPT-4
Incorporar a funçãocompress_query_promptdo LLMLingua em um pipeline RAG existente é um processo simples que pode aumentar significativamente a eficiência e a relação custo-benefício de seus aplicativos LLM. Ao inserir a operação de compactação de prompt logo antes de a entrada ser enviada ao LLM para gerar uma resposta, você pode aproveitar as técnicas avançadas de compactação do LLMLingua para otimizar o uso de tokens e reduzir a sobrecarga computacional.
Aqui está um trecho de código ilustrando a integração da função compress_query_prompt dentro de um pipeline RAG. O código completo está disponível em bloco denotas.
Para um engenheiro de pilha de AI, aproveitar estruturas de abstração como o LangChain é uma prática comum para simplificar o desenvolvimento e a implantação de aplicativos LLM. Nesse contexto, incorporar a compressão de prompt ao seu pipeline RAG existente é um processo simplificado pela integração do LangChain e LLMLingua.
Em especial, as melhorias introduzidas pelo LLMLingua se estendem além do aprimoramento da eficiência do prompt; também permite a compactação de documentos dentro de sistemas de recuperação. Ao aproveitar as técnicas avançadas de compressão do LLMLingua, você pode otimizar o armazenamento e a recuperação de informações contextuais, levando a operações mais eficientes e econômicas.
Veja como você pode aproveitar o LLMLingua dentro de um pipeline de recuperação do LangChain:
Observe que o trecho de código abaixo faz parte de uma ampla implementação no notebook.
As etapas no trecho de código acima são as seguintes:
  • Importando módulos necessários: o código importa ContextualCompressionRetriever de langchain.retrievers e LLMLinguaCompressor de langchain_community.document_compressors.
  • Inicializando o compressor: Uma instância do LLMLinguaCompressor é criada com o modelo "openai-community/gpt2" e configurada para carregar o modelo na CPU.
  • Criando o recuperador de compressão: O ContextualCompressionRetriever é inicializado com o LLMLinguaCompressor e um recuperador de base.
  • Invocando o recuperador: O compression_retriever invoca uma query, "quem é o CEO?", Que recupera e compacta documentos relevantes.
  • Saída: os documentos compactados são impressos, mostrando as informações relevantes em um formato compactado.
Para melhorar ainda mais os recursos de recuperação e query, você pode integrar a configuração de compressão de prompt com RetrievalQA do LangChain. No exemplo abaixo, RetrievalQA cria uma cadeia de resposta a perguntas que aproveita o compressão_retriever. 

Como implementar a compressão de prompt em agentes de AI

Vamos levar as coisas um passo adiante.
Os sistemas de agentes estão no horizonte, ou talvez você já tenha algumas demos sobre agentes de AI. Caso contrário, confira o repositório de blocos de anotações em agentes com vários modelos e estruturas usando o MongoDB como o provedor de memória do agente.
Um agente de AI é uma entidade computacional artificial que percebe seu ambiente por meio de entradas, age usando ferramentas e processa informações com modelos básicos suportados por memória de longo e curto prazo. Esses agentes são desenvolvidos para realizar tarefas ou objetivos especificados, aproveitando os recursos disponíveis.
A operação de um agente de AI é caracteriza por uma natureza recursiva ou cíclica, frequentemente envolvendo um ou mais sistemas interconectados. Cada etapa desse processo iterativo requer entradas para um LLM, que funciona como o núcleo Cognoscitivo ou o Céreito do agente. É fácil ver como a entrada alimentada em um LLM pode crescer a cada ciclo ou iteração da operação de um agente, especialmente se a memória de conversação estiver integrada aos recursos do agente e precisar ser usada como entrada no LLM. Um sistema como esse pode aumentar o custo operacional e os tempos de resposta de um sistema agente.
Agora você entende que as técnicas de compressão rápida reduzem a utilização de tokens de entradas em aplicativos LLM, como aplicativos RAG. No entanto, as vantagens da compactação imediata vão além desses aplicativos, provando ser benéficas também para agentes de AI. A principal conclusão é que os agentes de AI que executam em amplas Windows operacionais e que provavelmente utilizarão toda a extensão da Windows de contexto de um LLM podem se beneficiar significativamente da compactação imediata.
Os agentes de AI exigem vários componentes de entrada, incluindo extensos históricos de conversas, dados operacionais, definições do sistema e prompts. A compressão rápida permite que os agentes de AI gerenciem e organizem compactamente o contexto fornecido como entrada, habilitando operações eficientes e escaláveis. Ao implementar técnicas de compactação imediata, os agentes de AI podem compactar e otimizar de forma inteligente a contagem de tokens de seus componentes de entrada, como históricos de conversação e dados operacionais. 
Além disso, a compactação de prompts permite que os agentes de AI gerenciem a contagem total de tokens de suas entradas, garantindo que o contexto combinado permaneça dentro dos limites especificados do LLM subjacente. Isso é particularmente crucial para agentes que operam em ambientes complexos ou lidam com extensos históricos de conversação, onde a contagem cumulativa de tokens pode aumentar rapidamente, levando a um aumento da sobrecarga computacional e a possíveis gargalos de desempenho.
Há duas maneiras de fornecer aos agentes a capacidade de comprimir prompts usando o LangChain:
  1. Compactação de prompt como ferramenta: defina a operação de compactação de prompt como uma ferramenta que o agente pode usar durante sua operação.
  2. Retriever com compactação: crie um objeto de ferramenta de recuperação LangChain com uma lógica de compactação definida.
O trecho de código abaixo demonstra a implementação da lógica de compactação de prompt como uma definição de ferramenta para um agente construído usando LangChain. O código abaixo é apenas um esboço; obtenha o código completo.
O código acima cria uma ferramenta de compressão de prompt e fornece a ferramenta ao agente. Agora, o agente está ciente da ferramenta e pode determinar quando utilizá-la durante sua operação. A desvantagem é que a compressão de prompts ou entradas no LLM é deixada a critério do agente. Isso significa que o agente deve avaliar efetivamente a necessidade de compressão, o que pode introduzir variabilidade no desempenho se o processo de tomada de decisão do agente não for o ideal. Além disso, pode haver cenários em que o agente usa em excesso ou subutiliza a ferramenta de compressão, potencialmente levando a ineficiências ou perda de informações contextuais importantes. 
A criação do recuperador com recursos de compactação básicos pode melhorar significativamente a consistência e a eficácia, reduzindo a variabilidade no uso da lógica de compactação pelo agente de AI . Ao incorporar o mecanismo de compressão diretamente no recuperador, o agente pode aplicar compressão uniforme a todos os dados relevantes, garantindo que os prompts e entradas sejam consistentemente otimizados para processamento eficiente. O trecho de código abaixo demonstra como essa lógica pode ser implementada. Visualizar toda a implementação.
Essa abordagem minimiza a necessidade de o agente avaliar e decidir independentemente quando aplicar a compactação, reduzindo assim o potencial de desempenho inconsistente e aumentando a confiabilidade geral.
Mais uma vez, o agente é responsável por utilizar a ferramenta retriever.

Conclusão

Este tutorial apresenta, de uma perspectiva técnica e explicativa, que a compressão imediata é crucial para otimizar aplicativos LLM, como aplicativos RAG e agentes de IA. Alguns dos benefícios da compactação imediata explorados neste tutorial são sua capacidade de otimizar o uso de tokens, reduzir a sobrecarga computacional e minimizar os custos operacionais.
Por meio de demonstração técnica, você explorou a biblioteca LLMLingua, criada pela Microsoft Research. Essa biblioteca oferece uma estrutura robusta para compactar prompts e, ao mesmo tempo, preservar a qualidade da resposta. Ao integrar o LLMLingua com frameworks de abstração populares como o LangChain, os engenheiros de AI podem incorporar sem esforço a compressão de prompt em seus pipelines RAG existentes e sistemas de agentes de AI.
À medida que os projetos de IA generativa passam do protótipo para a produção, a demanda por soluções eficientes e econômicas só aumentará. Aproveitar a compressão rápida e técnicas similares nos estágios de prototipagem permite que desenvolvedores e engenheiros entendam as áreas de otimização dos aplicativos LLM, as ferramentas mais adequadas para otimizar essas áreas e algumas métricas avaliativas para medir o desempenho geral. 
Para sua próxima viagem, você pode explorar uma das seguintes opções abaixo:
Feliz Hacking!

Perguntas frequentes

1. O que é compressão de prompts? A compactação de prompts é o processo de reduzir sistematicamente o número de tokens alimentados em um modelo de linguagem grande para manter ou se aproximar da qualidade de saída comparável à do prompt original não compactado. Isso ajuda a otimizar os custos operacionais e a eficiência.
2. Por que a compactação imediata é importante para os aplicativos LLM?  À medida que o uso de LLMs cresce, a contagem de tokens de entradas pode aumentar rapidamente, levando a um aumento dos custos operacionais e da latência. A compactação de prompts permite que os desenvolvedores otimizem o uso de tokens, reduzindo a sobrecarga computacional, a latência de resposta e as despesas associadas.
3. Como o LLMLingua facilita a compactação de prompts? LLMLingua é uma biblioteca Python introduzida pela Microsoft que fornece uma estrutura para compactar prompts alimentados em LLMs. Ela usa técnicas avançadas de compactação para reduzir significativamente a contagem de tokens e, ao mesmo tempo, preservar informações essenciais e a qualidade da resposta. Ela se integra perfeitamente a estruturas como LangChain e LlamaIndex, facilitando a implementação em vários aplicativos.
4. Como a compressão de prompts pode beneficiar os agentes de AI? Os agentes de AI geralmente exigem vários componentes de entrada, incluindo históricos de conversas, dados operacionais e prompts. A compactação de prompts permite que os agentes gerenciem e compactem esse contexto, possibilitando operações eficientes e dimensionáveis e, ao mesmo tempo, minimizando a sobrecarga computacional e os possíveis gargalos de desempenho.
Referências

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Integre os registros do Atlas Application Services no Datadog na AWS


Sep 09, 2024 | 2 min read
Tutorial

Explorando recursos de pesquisa com o Atlas Search


Aug 20, 2024 | 9 min read
Início rápido

Guia de início rápido para aplicativos RAG usando LangChain e LlamaIndex


Sep 18, 2024 | 10 min read
Tutorial

RAG interativo com MongoDB Atlas + API de chamada de função


Sep 18, 2024 | 16 min read
Sumário