Principais conceitos e considerações para a criação de soluções de IA geradoras
Os LLMs (modelos de linguagem grande) são incríveis, mas têm limitações. Como desenvolvedor, você precisa entender essas limitações, quais LLMs são capazes de "prontas para uso" e como modificá-las para obter os melhores resultados para as soluções de IA gerativas que você cria. Este artigo identifica vários desafios e fatores limitantes de LLMs. Ele explica maneiras comuns de superar os desafios e assumir o controle do processo de geração de conteúdo, independentemente do tipo de recursos de IA generativos que você cria em seu aplicativo.
Desafios de engenharia ao trabalhar com LLMs
A lista a seguir resume os desafios ou limitações mais significativos a serem cientes quando você trabalha com LLMs:
Limitação do conhecimento: Devido ao alto custo de treinamento de uma LLM, o conjunto de conhecimentos de uma LLM é limitado ao que foi treinado em um determinado momento. Sem plug-ins ou outras acomodações, uma LLM não tem acesso a informações em tempo real e não pode acessar dados privados.
Alucinação: Uma LLM usa probabilidades estatísticas e um pouco de aleatoriedade para gerar informações. Mecanismos estão em vigor para manter as respostas geradas alinhadas à intenção humana nas perguntas que são feitas e nas informações nas quais uma LLM foi treinada, mas é possível que uma LLM crie respostas que não sejam precisas.
Transparência: também devido à maneira como um LLM é treinado, ele já não tem acesso ao conhecimento fundamental sobre o qual foi treinado. Mesmo que isso tenha ocorrido, não há garantia de que a informação fosse verdadeira e fundamentada desde o início. Além disso, não há nenhuma etapa de verificação para garantir que a resposta gerada seja precisa.
Nenhum conhecimento específico do domínio: semelhante ao corte de conhecimento, se você tiver informações privadas, como documentos internos da empresa, o LLM não foi treinado sobre essas informações. Ele não tem conhecimento de dados específicos do domínio.
O que você pode fazer para atenuar os possíveis desafios ou problemas com LLMs e obter os melhores resultados possíveis para ajudar seus usuários e sua organização? Comece entendendo as maneiras pelas quais você pode complementar onde uma LLM obtém seus dados.
Onde os LLMs obtêm informações
Um bom ponto de partida para obter os melhores resultados de uma LLM é entender onde ou como as LLMs obtêm suas informações. As categorias a seguir representam diferentes abordagens de como as LLMs interagem com várias fontes de informações para gerar respostas.
Geração sem recuperação (ROG): LLMs tradicionais usam esse modelo. O modelo gera respostas baseadas apenas no conhecimento em que foi treinado, sem acessar ou recuperar informações externas durante o processo de geração. O conhecimento do modelo é estático e limitado ao que foi incluído nos dados de treinamento até a data de corte. Além da escrita criativa, ele pode responder perguntas sobre informações prontamente disponíveis na Internet.
Geração aumentada por recuperação (RAG): combina os recursos generativos de LLMs com a habilidade de recuperar informações de bancos de dados ou documentos externos em tempo real. O modelo consulta uma fonte externa para localizar informações relevantes. Em seguida, ele usa as informações para formar sua resposta. Essa abordagem permite que o modelo forneça informações mais precisas e atualizadas do que fornece usando apenas o conhecimento pré-treinado. Os casos de uso incluem verificação de fatos, resposta a perguntas baseadas em dados em tempo real ou resposta a perguntas com base em dados privados e específicos do domínio.
Geração Centrada em Recuperação (RCG): dá ainda mais ênfase no conteúdo obtido externamente, muitas vezes estruturando respostas com base nas informações obtidas de fontes externas. O modelo pode incorporar diretamente grandes segmentos de texto recuperado em suas saídas, editando ou anotando-os para ajustar a consulta do usuário. Essa abordagem pode ser vista como um híbrido entre métodos baseados em recuperação e de geração, em que o equilíbrio pode favorecer fortemente as informações recuperadas em relação às capacidades geradoras do próprio modelo. Os casos de uso incluem resumo de um documento mais longo, assistência de pesquisa para fornecer comparações e explorações temáticas em vários documentos semelhantes e compilação ou ordenação de diferentes fontes de material em uma saída combinada.
Um bom exemplo de ROG é ChatGPT. Por outro lado, o Copilot (via Bing) amplia um LLM utilizando fontes externas de notícias e fornecendo links para essas fontes.
À primeira vista, RAG e RCG são semelhantes porque ambos envolvem a integração de informações externas ao processo de geração de linguagem. No entanto, elas diferem em como priorizam e usam informações recuperadas no processo de geração.
Em um sistema de RAG, a recuperação de dados externos é usada para aumentar os recursos generativos de um modelo de linguagem pré-treinado. As informações recuperadas fornecem mais contexto ou dados específicos que o modelo usa para informar suas respostas. Em um sistema RAG, o aspecto generativo do modelo de linguagem permanece central para a resposta. Os dados recuperados atuam como um elemento de suporte para melhorar a precisão ou a profundidade.
Um sistema RCG coloca uma ênfase mais forte nas informações recuperadas em si. Em um sistema RCG, os dados recuperados geralmente são a peça central da resposta, e a função do modelo de geração é, principalmente, refinar, formatar ou aprimorar ligeiramente o texto recuperado. Essa abordagem é usada especialmente quando a precisão e a relevância direta das informações são primordiais e menos síntese criativa ou extrapolação é necessária.
Os mecanismos de recuperação externa de dados que alimentam RAG e RCG são discutidos em artigos sobre como armazenar incorporações vetorizadas de documentos em comparação ao ajuste fino de um LLM, as duas abordagens predominantes para complementar o conhecimento disponível para o LLM com base no treinamento inicial.
Entender as distinções entre modelos de recuperação pode ajudá-lo a escolher a abordagem certa para aplicativos específicos. Ele ajuda a equilibrar a necessidade de síntese criativa versus precisão e fidelidade ao material de origem.
Fatores que afetam o funcionamento da inferência
Como você provavelmente está familiarizado com a interface do usuário baseada na Web do ChatGPT, entender como ele funciona para responder a perguntas pode ajudá-lo a entender conceitos vitais ao criar recursos de IA generativos em seus próprios aplicativos.
Quando um usuário conversa com o ChatGPT, o design da interface do usuário oferece a ilusão de uma sessão de chat longa que mantém o estado durante várias trocas de ida e volta entre você e o LLM. Na realidade, para uma determinada sessão de chat, todos os prompts e todas as respostas do LLM (também chamados de conclusões) são enviados com cada novo prompt. Conforme a conversa se desenvolve, você envia cada vez mais texto para o LLM processar. A cada novo comando, você envia todos os prompts e conclusões anteriores. O ChatGPT usa todo o contexto da sessão de chat, e não apenas o prompt atual, quando elabora uma resposta ao seu prompt atual. Toda a sessão de chat é chamada de janela de contexto.
Uma janela de contexto tem um limite de comprimento que varia de acordo com a versão do ChatGPT com a qual você trabalha. Qualquer parte da conversa de chat que exceda o limite de comprimento da janela de contexto é ignorada quando o ChatGPT compõe uma resposta ao seu prompt mais recente.
Conversas longas podem parecer uma boa ideia no início, mas janelas de contexto longas podem afetar a quantidade de computação necessária para processar o prompt e redigir uma conclusão. O tamanho das janelas de contexto afeta a latência da resposta e quanto custa para o OpenAI processar a solicitação.
O que é o limite da janela de contexto do ChatGPT? Ou seja, com quantas palavras o ChatGPT pode trabalhar?
O limite da janela de contexto depende do modelo, da versão e da edição do LLM com o qual você está trabalhando. Além disso, os comprimentos de contexto são medidos em tokens, não em palavras. Os tokens são as menores unidades de texto que o modelo pode entender e gerar. Essas unidades podem ser palavras, partes de palavras (como sílabas ou hastes) ou até mesmo caracteres individuais. Os tokens estão no centro do NLP (processamento de linguagem natural).
O uso de tokens afeta duas considerações importantes para os desenvolvedores:
- O limite máximo da janela de contexto
- O preço por prompt e a conclusão
O que é a tokenização?
Tokenização é o processo de conversão de texto em tokens. É uma etapa vital na preparação de dados para treinamento ou inferência (o processo de composição de conclusões com base em prompts) com um LLM. O processo envolve várias etapas, incluindo dividir texto complexo em partes gerenciáveis (tokens), que o modelo pode processar. Esse processo pode ser simples, como dividir texto por espaços e pontuação, ou mais complexo, envolvendo algoritmos sofisticados para lidar com diferentes idiomas, morfologias (a estrutura de palavras) e sintaxes (a disposição das palavras). Pesquisadores e desenvolvedores de LLM decidem sobre o método de tokenização com base no que estão tentando realizar.
A página do tokenizador
Como mencionado na nota ao final da página do Tokenizador OpenAI, em textos típicos em inglês, um token é equivalente a cerca de quatro caracteres. Em média, 100 tokens são aproximadamente iguais a 75 palavras ou três quartos de uma palavra por token.
A página Tokenizer do OpenAI também fala sobre tiktoken, um pacote para Python e JavaScript que você pode usar para calcular programaticamente quantos tokens são necessários para enviar um prompt específico para a API OpenAI.
O uso de token afeta a cobrança
Cada API do Azure OpenAI tem uma metodologia de cobrança diferente. Para processar e gerar texto com a API de Conclusões de Chat, você paga com base no número de tokens que envia como um prompt e no número de tokens gerados como resultado (conclusão).
Cada modelo LLM (por exemplo, GPT-3.5, GPT-3.5 Turbo ou GPT-4) geralmente tem um preço diferente, o que reflete a quantidade de computação necessária para processar e gerar tokens. Muitas vezes, o preço é apresentado como "preço por 1.000 tokens" ou "preço por 1 milhão de tokens".
Esse modelo de preços tem um efeito significativo sobre como você projeta as interações do usuário e a quantidade de pré-processamento e pós-processamento que você adiciona.
Prompts do sistema versus prompts do usuário
Até agora, a discussão se concentrou apenas em prompts de usuário. Um prompt de usuário é o tipo de prompt que compõe o intercâmbio entre um usuário e o ChatGPT.
A OpenAI introduziu o prompt do sistema (também chamado de instruções personalizadas). Um prompt do sistema é um conjunto abrangente de instruções que você define e adiciona a todas as suas conversas de chat. Pense nisso como um conjunto de instruções meta que você deseja que a LLM sempre observe sempre que iniciar uma nova sessão de chat. Por exemplo, você pode definir o prompt do sistema para "sempre responder na forma poética de haiku". Desse ponto em diante, cada novo prompt para ChatGPT resulta em um haiku que contém a resposta.
Embora "responder em forma de haiku" não seja um exemplo útil, ele ilustra a ideia de que é possível influenciar a conclusão de um LLM para seu prompt modificando o prompt em si.
Por que você deseja modificar o prompt do usuário? Se você estiver criando um recurso de IA gerativo ou um aplicativo para um público profissional, que pode incluir funcionários, clientes e parceiros da empresa, você, sem dúvida, deseja adicionar proteções para limitar o escopo de tópicos ou domínios que ele pode responder.
Mas modificar o prompt do usuário é apenas um método para melhorar a experiência de geração de texto para os usuários.
Métodos para melhorar a experiência de geração de texto para usuários no ChatGPT
Para melhorar os resultados da geração de texto, os desenvolvedores estão limitados a simplesmente melhorar o prompt e há muitas técnicas de engenharia de prompt que podem ajudar. No entanto, se você estiver criando seu próprio aplicativo de IA generativo, há várias maneiras de melhorar a experiência de geração de texto para os usuários e talvez você queira experimentar a implementação de todos eles:
- Modifique programaticamente os prompts do usuário.
- Implemente um pipeline de inferência.
- Geração Retrieval-Augmented (discutida em outros artigos).
- Ajuste fino (discutido em outros artigos).
Modificar prompts de usuário programaticamente
Para adicionar um prompt do sistema a uma conversa do usuário, você não usa uma API especial. Basta acrescentar instruções ao prompt conforme necessário.
Mas você pode usar algumas técnicas para melhorar os prompts do usuário:
- Preparo contextual: elabore prompts de sistema que definem explicitamente o contexto da conversa no domínio. Essa abordagem envolve fornecer uma breve descrição ou um conjunto de instruções no início de cada interação. As instruções orientam a IA a permanecer dentro do domínio do problema.
- diretrizes baseadas em exemplo: no prompt inicial, inclua exemplos dos tipos de perguntas e respostas relevantes para seu domínio. Essa abordagem ajuda a IA a entender que tipo de respostas esperar.
Você pode usar qualquer técnica de engenharia de prompt. Se você conseguir fazer isso programaticamente, poderá melhorar o prompt do usuário.
A ressalva dessa abordagem é que quanto maior o prompt, maior o custo de cada chamada para o LLM. Mesmo assim, essa abordagem é provavelmente a abordagem mais barata que este artigo descreve.
Implemente um pipeline de inferência
A próxima etapa além de modificar o prompt do usuário programaticamente é criar um pipeline de inferência inteiro.
Um pipeline de inferência é um processo completo que "limpa" a entrada bruta (como texto ou uma imagem) antes de usá-la para executar seu prompt primário (pré-processamento) ou verifica a conclusão para garantir que ela satisfaz as necessidades do usuário antes de exibi-la (pós-processamento).
O pré-processamento pode envolver verificação de palavra-chave, pontuação de relevância ou transformação da consulta para melhor se ajustar ao idioma de domínio esperado. Por exemplo, você pode analisar o prompt inicial que o usuário envia. Comece perguntando ao LLM se o prompt faz sentido, se está dentro dos limites do que você está disposto a aceitar, se é baseado em uma premissa equivocada ou se precisa ser reescrito para evitar certos vieses. Se o LLM analisar o prompt e encontrar problemas, você poderá tomar medidas adicionais. Você pode pedir ao LLM para reformular o prompt, a fim de possivelmente melhorar a resposta.
O pós-processamento pode envolver a validação da relevância e da adequação da resposta ao domínio. Pode incluir a remoção ou sinalização de respostas que não se ajustam aos requisitos de domínio. Por exemplo, talvez você queira inspecionar a conclusão fornecida pela LLM para garantir que ela atenda aos seus requisitos de qualidade e segurança. Você pode pedir ao LLM que avalie a resposta para ver se ela de fato atende aos requisitos aos quais você pediu que ela adere. Se isso não acontecer, você poderá pedir ao LLM que modifique a conclusão. Repita essas etapas até ter um resultado satisfatório.
Há uma ressalva para adicionar etapas de pré-processamento: cada vez que você adiciona uma chamada a uma LLM em seu pipeline de inferência, aumenta a latência geral (tempo para responder) e o custo de cada interação com o usuário. Como um desenvolvedor de software experiente, você provavelmente já está ciente desses tipos de compensações que afetam o orçamento, o desempenho e a eficácia de um sistema de software.
Para obter informações sobre as etapas específicas a serem tomadas para criar um pipeline de inferência, consulte Criar um sistema de geração aumentada por recuperação.
Outros fatores que influenciam as finalizações
Além de modificar programaticamente o prompt, criar um pipeline de inferência e outras técnicas, mais detalhes são discutidos em Aumentar um modelo de linguagem grande com geração aumentada por recuperação e ajuste fino. Além disso, você pode modificar parâmetros ao fazer chamadas para a API openai do Azure.
Para examinar os parâmetros obrigatórios e opcionais a serem passados que podem afetar vários aspectos da conclusão, consulte a documentação do ponto de extremidade de chat. Se você estiver usando um SDK, consulte a documentação do SDK para o idioma usado. Você pode experimentar os parâmetros no Playground.
Temperature
: controle a aleatoriedade da saída gerada pelo modelo. A zero, o modelo torna-se determinístico, selecionando consistentemente o próximo token mais provável de seus dados de treinamento. A uma temperatura de 1, o modelo se equilibra entre escolher tokens de alta probabilidade e introduzir aleatoriedade na saída.Max Tokens
: controla o comprimento máximo da resposta. Definir um limite maior ou inferior pode afetar os detalhes e o escopo do conteúdo gerado.Top P
(amostragem de núcleo): usado comTemperature
para controlar a aleatoriedade da resposta.Top P
limita a IA a considerar apenas o percentual superior de massa de probabilidade (P
) quando gerar cada token. Valores mais baixos levam a textos mais focados e previsíveis. Valores mais altos permitem mais diversidade.Frequency Penalty
: diminui a probabilidade do modelo repetir a mesma linha ou frase. Aumentar esse valor ajuda a evitar a redundância no texto gerado.Presence Penalty
: incentiva o modelo a introduzir novos conceitos e termos na conclusão.Presence Penalty
é útil para gerar saídas mais diversas e criativas.Stop Sequences
: você pode especificar uma ou mais sequências para instruir a API a parar de gerar mais tokens.Store Sequences
são úteis para controlar a estrutura da saída, como encerrar uma conclusão no final de uma frase ou parágrafo.Logit Bias
: permite modificar a probabilidade de tokens especificados que aparecerem na conclusão.Logit Bias
pode ser usado para orientar a conclusão em uma determinada direção ou suprimir conteúdo específico.
Proteções do Microsoft OpenAI
Além de manter as respostas da LLM associadas a domínios ou assuntos específicos, você também provavelmente está preocupado com os tipos de perguntas que os usuários estão fazendo sobre a LLM. É importante considerar os tipos de respostas que está gerando.
Primeiro, as chamadas da API para os Serviços Microsoft OpenAI filtram automaticamente o conteúdo que a API considera potencialmente ofensivo, e isso é relatado a você em várias categorias de filtragem.
Você pode usar diretamente a API de Moderação do OpenAI diretamente para verificar qualquer conteúdo potencialmente prejudicial.
Em seguida, você pode usar o Azure AI Content Safety para ajudar com moderação de texto, moderação de imagem, detecção de risco de jailbreak e detecção de material protegido. Isso combina uma configuração do portal, a função de relatórios e um código que você pode adicionar ao seu aplicativo para identificar conteúdo prejudicial.
Considerações finais para o design do aplicativo
Entender a tokenização, os preços, as janelas de contexto e a implementação de melhorias programáticas para aprimorar a experiência de geração de texto dos usuários afeta a forma como você projeta seu sistema de IA generativo.
Aqui está uma pequena lista de coisas a serem consideradas e outras conclusões deste artigo que podem afetar suas decisões de design de aplicativo:
- Avalie a necessidade de usar o modelo de IA mais recente em relação às considerações de custo. Modelos mais baratos podem ser suficientes para as necessidades do aplicativo. Balancear o desempenho com restrições de orçamento.
- Considere otimizar o comprimento da janela de contexto para gerenciar custos sem afetar significativamente a experiência do usuário. Cortar partes desnecessárias da conversa pode reduzir as taxas de processamento, mantendo interações de qualidade.
- Avalie como a tokenização e a granularidade de suas entradas e saídas afetam o desempenho. Entender como o LLM escolhido lida com a tokenização pode ajudá-lo a otimizar a eficiência de suas chamadas à API, potencialmente reduzindo custos e melhorando os tempos de resposta.
Se você quiser começar a experimentar na criação de uma solução de IA gerativa imediatamente, recomendamos que você dê uma olhada em Comece com o chat usando seu próprio exemplo de dados para Python. O tutorial também está disponível em .NET, Javae JavaScript.