Partilhar via


Principais conceitos e considerações para a construção de soluções generativas de IA

Os modelos de linguagem grande (LLMs) são incríveis, mas têm limitações. Como desenvolvedor, você precisa entender essas limitações, o que os LLMs são capazes de "sair da caixa" e como modificá-los para obter os melhores resultados para as soluções de IA generativa que você cria. Este artigo identifica vários desafios e fatores limitantes dos 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 generativa 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 observados quando você trabalha com LLMs:

  • Limite de conhecimento: Devido ao elevado custo de treino de um LLM, o conjunto de conhecimentos de um LLM é limitado ao que foi treinado num determinado momento no tempo. Sem plug-ins ou outras acomodações, um LLM não tem acesso a informações em tempo real e não pode acessar dados privados.

  • Alucinação: Um LLM usa probabilidades estatísticas e um pouco de aleatoriedade para gerar informações. Existem mecanismos para manter as respostas geradas alinhadas com a intenção do ser humano nas perguntas que são feitas e as informações sobre as quais um LLM foi treinado, mas é possível que um LLM crie respostas que não são precisas.

  • Transparência: Também devido à forma como um LLM é treinado, ele não tem mais acesso ao conhecimento fundamental sobre o qual foi treinado. Mesmo que ocorresse, 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 à limitação de conhecimento, se tiver informações privadas, como documentos internos da empresa, o LLM não foi treinado com essas informações. Não tem conhecimento de dados específicos do domínio.

O que você pode fazer para mitigar 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 como você pode complementar onde um LLM obtém seus dados.

Onde os LLMs obtêm suas informações

Um bom ponto de partida para obter os melhores resultados de um LLM é entender onde ou como os LLMs obtêm suas informações. As categorias a seguir representam diferentes abordagens de como os LLMs interagem com várias fontes de informação para gerar respostas.

Diagrama que descreve três tipos diferentes de geração de recuperação: geração de recuperação-off, geração aumentada de recuperação e geração centrada em recuperação.

  • Geração de recuperação (ROG): LLMs tradicionais usam este modelo. O modelo gera respostas baseadas apenas no conhecimento em que foi treinado, sem acessar ou recuperar qualquer informação externa durante o processo de geração. O conhecimento do modelo é estático e limitado ao que foi incluído nos seus dados de treinamento até a data limite. Além da escrita criativa, ele pode responder a perguntas sobre informações que estão prontamente disponíveis na internet.

  • de geração aumentada de recuperação (RAG): Combina os recursos generativos de LLMs com a capacidade de recuperar informações de bancos de dados ou documentos externos em tempo real. O modelo consulta uma fonte externa para encontrar informações relevantes. Em seguida, utiliza a informação para formar a sua resposta. Essa abordagem permite que o modelo forneça informações mais precisas e up-todo que fornece usando apenas seu conhecimento pré-treinado. Os casos de uso incluem verificação de fatos, responder a perguntas com base em dados em tempo real ou responder a perguntas com base em dados privados específicos do domínio.

  • Geração centrada na recuperação (RCG): Coloca ainda mais ênfase no conteúdo recuperado externamente, muitas vezes estruturando respostas em torno das informações obtidas de fontes externas. O modelo pode incorporar diretamente grandes segmentos de texto recuperado em suas saídas, editando-os ou anotando-os para se ajustar à consulta do usuário. Esta abordagem pode ser vista como um híbrido entre métodos baseados em recuperação e generativos, onde o equilíbrio pode favorecer fortemente as informações recuperadas em detrimento das próprias capacidades generativas do modelo. Os casos de uso incluem a sumarização de um documento mais longo, assistência à pesquisa para fornecer comparações e explorações temáticas em vários documentos semelhantes e compilação ou agrupamento de diferentes fontes de material em um resultado combinado.

Um bom exemplo de ROG é o ChatGPT. Por outro lado, o Copilot (via Bing) amplia um LLM ao utilizar fontes externas provenientes de notícias (e ao fornecer links para essas fontes).

À primeira vista, RAG e RCG parecem semelhantes porque ambos envolvem a integração de informações externas no processo de geração de linguagem. No entanto, eles diferem na forma como priorizam e usam as informações recuperadas no processo de geração.

Em um sistema RAG, a recuperação de dados externos é usada para aumentar as capacidades generativas 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 aspeto 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 na própria informação recuperada. Em um sistema RCG, os dados recuperados geralmente são o centro da resposta, e o papel do modelo generativo consiste principalmente em refinar, formatar ou melhorar ligeiramente o texto recuperado. Esta abordagem é usada particularmente quando a precisão e a relevância direta da informação são primordiais, e menos síntese criativa ou extrapolação é necessária.

Os mecanismos de recuperação externa de dados que alimentam tanto o RAG quanto o RCG são discutidos em artigos sobre o armazenamento de incorporações vetorizadas de documentos versus o ajuste fino de um LLM, as duas abordagens predominantes para complementar o conhecimento disponível para o LLM com base em seu treinamento inicial.

Compreender as distinções entre modelos de recuperação pode ajudá-lo a escolher a abordagem certa para aplicações específicas. 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 de usuário baseada na Web do ChatGPT, entender como ela funciona para responder a perguntas pode ajudá-lo a entender conceitos que são vitais quando você cria recursos de IA generativa em seus próprios aplicativos.

Quando um usuário conversa com o ChatGPT, o design da interface do usuário lhe dá a ilusão de uma sessão de bate-papo de longa duração que mantém o estado ao longo de várias trocas de ida e volta entre você e o LLM. Na verdade, para uma determinada sessão de chat, todos os prompts e todas as respostas LLM (também chamadas de conclusões) são enviadas com cada novo prompt. À medida que a sua conversa cresce, você envia cada vez mais texto para o LLM para processamento. A cada novo prompt, 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 compõe 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 sua 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 compor 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.

Qual é o limite da janela de contexto do ChatGPT? Ou seja, com quantas palavras o ChatGPT pode funcionar?

O limite da janela de contexto depende do modelo, versão e 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 processamento de linguagem natural (NLP).

O uso de tokens afeta duas considerações importantes para os desenvolvedores:

  • O limite máximo da janela de contexto
  • O preço por cada prompt e conclusão

O que é tokenização?

A tokenização é o processo de converter texto em tokens. É uma etapa crucial na preparação de dados para treino ou inferência (o processo de gerar completamentos com base em prompts) com um LLM. O processo envolve várias etapas, incluindo a divisão de texto complexo em partes gerenciáveis (tokens), que o modelo pode processar. Este processo pode ser simples, como dividir o texto por espaços e pontuação, ou mais complexo, envolvendo algoritmos sofisticados para lidar com diferentes linguagens, morfologias (a estrutura das 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 OpenAI explica mais sobre tokenização. A página tem até uma calculadora que ilustra como uma frase ou parágrafo se divide em tokens.

Como a nota na parte inferior da página do OpenAI Tokenizer afirma, em textos típicos em inglês, um token equivale 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 OpenAI Tokenizer também fala sobre tiktoken, um pacote para Python e JavaScript que você pode usar para estimar programaticamente quantos tokens são necessários para enviar um prompt específico para a API OpenAI.

O uso do token afeta a cobrança

Cada API OpenAI do Azure tem uma metodologia de cobrança diferente. Para processar e gerar texto com a API de Conclusão de Chat, você é cobrado com base no número de tokens enviados 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, 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 adicionada.

Prompts do sistema vs. prompts do usuário

Até este ponto, a discussão se concentrou apenas em solicitações do 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 bate-papo. Pense nisso como um conjunto de meta instruções que você deseja que o LLM sempre observe cada vez que você inicia uma nova sessão de bate-papo. Por exemplo, você pode definir o prompt do sistema para "sempre responder na forma poética de haiku". A partir desse ponto, cada novo prompt para o ChatGPT resulta em um haicai contendo a resposta.

Embora "responder em forma de haiku" não seja um exemplo útil, isso ilustra a ideia de que pode influenciar a conclusão de um LLM no seu prompt ao modificar o próprio prompt.

Por que você gostaria de modificar o prompt do usuário? Se você está criando um recurso ou aplicativo de IA generativa para um público profissional, que pode incluir funcionários da empresa, clientes e parceiros, sem dúvida deseja adicionar salvaguardas 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 se limitam 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 generativa, há várias maneiras de melhorar a experiência de geração de texto para os usuários, e você pode querer experimentar a implementação de todas elas:

  • Modifique programaticamente as mensagens ao utilizador.
  • Implemente um pipeline de inferência.
  • Geração Retrieval-Augmented (discutida em outros artigos).
  • Ajuste fino (discutido em outros artigos).

Modificar programaticamente os prompts do usuário

Para adicionar um prompt do sistema a uma conversa de usuário, você não usa uma API especial. Basta adicionar instruções ao prompt conforme necessário.

Mas você pode usar algumas técnicas para melhorar os prompts do usuário:

  • Contextual priming: Criar prompts de sistema que definam explicitamente o contexto da conversa dentro do domínio. Esta 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.
  • Orientação baseada em exemplos: No prompt inicial, inclua exemplos dos tipos de perguntas e respostas relevantes para o 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 for possível realizá-lo programaticamente, pode melhorar o prompt do utilizador em seu nome.

A advertência a esta abordagem é que, quanto mais longo for o prompt, maior será o custo de cada chamada para o LLM. Mesmo assim, esta abordagem é provavelmente a abordagem menos dispendiosa que este artigo descreve.

Implementar 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 de ponta a ponta que "limpa" a entrada bruta (como texto ou imagem) antes de usá-la para executar seu prompt primário (pré-processamento) ou verifica a conclusão para garantir que ela atenda às necessidades do usuário antes de exibi-la (pós-processamento).

O pré-processamento pode envolver verificação de palavras-chave, pontuação de relevância ou transformação da consulta para melhor se adequar à linguagem de domínio esperada. Por exemplo, você pode analisar o prompt inicial enviado pelo usuário. 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 incorreta ou se precisa ser reescrito para evitar certos vieses. Se o LLM analisar o prompt e encontrar problemas, você pode ir um passo além. Pode pedir ao LLM que reformule o prompt para, assim, melhorar a resposta.

O pós-processamento pode envolver a validação da relevância e adequação da resposta ao domínio. Pode incluir a remoção ou sinalização de respostas que não se ajustam aos requisitos do domínio. Por exemplo, pode querer inspecionar a conclusão fornecida pelo LLM para garantir que satisfaça os seus requisitos de qualidade e segurança. Você pode pedir ao LLM que avalie a resposta para ver se de fato cumpre os requisitos que você solicitou. Se isso não acontecer, você pode pedir ao LLM para modificar a conclusão. Repita estes passos até obter um resultado satisfatório.

Há uma ressalva para adicionar etapas de pré-processamento: cada vez que você adiciona uma chamada a um LLM em seu pipeline de inferência, você aumenta a latência geral (tempo de resposta) 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 executadas para criar um pipeline de inferência, consulte Criar um sistema avançado de geração aumentada de 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 Aumentando um modelo de linguagem grande com geração aumentada de recuperação e ajuste fino. Além disso, você pode modificar parâmetros ao fazer chamadas para a API OpenAI do Azure.

Para rever os parâmetros obrigatórios e opcionais a serem passados, que podem afetar vários aspetos da conclusão, consulte a documentação do endpoint do 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 que o modelo gera. Em zero, o modelo torna-se determinista, selecionando consistentemente o próximo token mais provável de seus dados de treinamento. A uma temperatura de 1, o modelo 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 menor pode afetar os detalhes e o escopo do conteúdo gerado.

  • Top P (amostragem do núcleo): Utilizado com Temperature para controlar a aleatoriedade da resposta. Top P limita a IA a considerar apenas a porcentagem superior de massa de probabilidade (P) quando gera cada token. Valores mais baixos levam a um texto mais focado e previsível. Valores mais elevados permitem uma maior diversidade.

  • Frequency Penalty: Diminui a probabilidade de o modelo repetir a mesma linha ou frase. Aumentar esse valor ajuda a evitar redundância no texto gerado.

  • Presence Penalty: Incentiva o modelo a introduzir novos conceitos e termos na conclusão. Presence Penalty é útil para gerar produções mais diversificadas 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 terminar uma conclusão no final de uma frase ou parágrafo.

  • Logit Bias: Permite modificar a probabilidade de tokens especificados aparecerem na conclusão. Logit Bias pode ser usado para orientar a conclusão em uma determinada direção ou para suprimir conteúdo específico.

Proteções do Microsoft OpenAI

Além de manter as respostas do LLM vinculadas a assuntos ou domínios específicos, você provavelmente também está preocupado com os tipos de perguntas que seus usuários estão fazendo ao LLM. É importante considerar os tipos de respostas que está gerando.

Primeiro, as chamadas de API para o Microsoft OpenAI Services filtram automaticamente o conteúdo que a API considera potencialmente ofensivo e relatam isso para você em muitas categorias de filtragem.

Você pode usar diretamente a API de moderação do OpenAI diretamente para verificar qualquer conteúdo em busca de conteúdo potencialmente prejudicial.

Em seguida, você pode usar a Segurança de Conteúdo do Azure AI para ajudar com moderação de texto, moderação de imagem, deteção de risco de jailbreak e deteção de material protegido. Isso combina uma experiência de instalação, configuração e relatório do portal com o código que você pode adicionar ao seu aplicativo para identificar conteúdo nocivo.

Considerações finais para o design do aplicativo

Compreender a tokenização, os preços, as janelas de contexto e a implementação de melhorias programáticas para melhorar a experiência de geração de texto dos usuários afeta a forma como você projeta seu sistema de IA generativa.

Aqui está uma pequena lista de coisas a considerar 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 a considerações de custo. Modelos mais baratos podem ser suficientes para as necessidades do seu aplicativo. Equilibre o desempenho com restrições orçamentárias.
  • 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 de API, potencialmente reduzindo custos e melhorando os tempos de resposta.

Se você quiser começar a experimentar a criação de uma solução de IA generativa imediatamente, recomendamos que você dê uma olhada em Comece com o bate-papo usando sua própria amostra de dados para Python. O tutorial também está disponível em .NET, Javae JavaScript.