Compartilhar via


Aumentando um Modelo de Linguagem Grande com geração aumentada por recuperação e ajuste fino

Os artigos desta série discutem os modelos de recuperação de conhecimento que os LLMs usam para gerar suas respostas. Por padrão, um LLM (Large Language Model) só tem acesso aos seus dados de treinamento. No entanto, você pode aumentar o modelo para incluir dados em tempo real ou dados privados. Este artigo discute um dos dois mecanismos para aumentar um modelo.

O primeiro mecanismo é a Geração Aumentada por Recuperação (RAG), que é uma forma de pré-processamento que combina pesquisa semântica com priming contextual (discutido em outro artigo).

O segundo mecanismo é o ajuste fino, que se refere ao processo de treinamento adicional do modelo em um conjunto de dados específico após seu treinamento inicial e amplo, com o objetivo de adaptá-lo para ter um melhor desempenho nas tarefas ou entender os conceitos relacionados a esse conjunto de dados. Esse processo ajuda o modelo a se especializar ou melhorar sua precisão e eficiência na manipulação de tipos específicos de entrada ou domínios.

As seções a seguir descrevem esses dois mecanismos com mais detalhes.

Noções básicas sobre o RAG

O RAG é frequentemente usado para habilitar o cenário de "bate-papo sobre meus dados", onde as empresas que possuem um grande corpus de conteúdo textual (documentos internos, documentação, etc.) e desejam usar esse corpus como base para respostas às solicitações do usuário.

Em um alto nível, você cria uma entrada de banco de dados para cada documento (ou parte de um documento chamada de "bloco"). O pedaço é indexado em sua incorporação, um vetor (matriz) de números que representam facetas do documento. Quando um usuário envia uma consulta, você pesquisa no banco de dados documentos semelhantes e, em seguida, envia a consulta e os documentos ao LLM para redigir uma resposta.

Observação

O termo Geração Aumentada por Recuperação (RAG) acomodativamente. O processo de implementação de um sistema de bate-papo baseado em RAG descrito neste artigo pode ser aplicado se houver um desejo de usar dados externos para serem usados em uma capacidade de suporte (RAG) ou para serem usados como a peça central da resposta (RCG). Essa distinção sutil não é abordada na maioria das leituras relacionadas ao RAG.

Criando um índice de documentos vetorizados

A primeira etapa para criar um sistema de bate-papo baseado em RAG é criar um armazenamento de dados vetoriais contendo a incorporação vetorial do documento (ou uma parte do documento). Considere o diagrama a seguir que descreve as etapas básicas para criar um índice vetorizado de documentos.

Diagrama que descreve os diferentes estágios de ingestão de documentos, começando com a fragmentação, depois as etapas do processo de fragmentação, depois as chamadas para a API de incorporação e, em seguida, salvando as partes do documento como incorporações vetorizadas no banco de dados vetorial.

Este diagrama representa um pipeline de dados, que é responsável pela ingestão, processamento e gerenciamento de dados usados pelo sistema. Isso inclui o pré-processamento de dados a serem armazenados no banco de dados vetorial e a garantia de que os dados alimentados no LLM estejam no formato correto.

Todo o processo é impulsionado pela noção de incorporação, que é uma representação numérica de dados (normalmente palavras, frases, sentenças ou até mesmo documentos inteiros) que captura as propriedades semânticas da entrada de uma forma que pode ser processada por modelos de aprendizado de máquina.

Para criar uma inserção, envie a parte do conteúdo (frases, parágrafos ou documentos inteiros) para a API de inserção do OpenAI do Azure. O que é retornado da API de incorporação é um vetor. Cada valor no vetor representa alguma característica (dimensão) do conteúdo. As dimensões podem incluir assunto, significado semântico, sintaxe e gramática, uso de palavras e frases, relações contextuais, estilo e tom, etc. Juntos, todos os valores do vetor representam o espaço dimensional do conteúdo. Em outras palavras, se você pode pensar em uma representação 3D de um vetor com três valores, um determinado vetor vive em uma determinada área do plano x, y, z. E se você tiver 1000 (ou mais) valores? Embora não seja possível para os humanos desenhar um gráfico de 1000 dimensões em uma folha de papel para torná-lo mais compreensível, os computadores não têm problemas para entender esse grau de espaço dimensional.

A próxima etapa do diagrama descreve o armazenamento do vetor junto com o próprio conteúdo (ou um ponteiro para o local do conteúdo) e outros metadados em um banco de dados vetorial. Um banco de dados vetorial é como qualquer tipo de banco de dados, com duas diferenças:

  • Os bancos de dados vetoriais usam um vetor como índice para pesquisar dados.
  • Os bancos de dados vetoriais implementam um algoritmo chamado pesquisa semelhante a cosseno, também conhecido como vizinho mais próximo, que usa vetores que mais se aproximam dos critérios de pesquisa.

Com o corpus de documentos armazenados em um banco de dados vetorial, os desenvolvedores podem criar um componente retriever que recupera documentos que correspondem à consulta do usuário do banco de dados para fornecer ao LLM o que ele precisa para responder à consulta do usuário.

Respondendo a consultas com seus documentos

Um sistema RAG primeiro usa a pesquisa semântica para encontrar artigos que possam ser úteis para o LLM ao redigir uma resposta. A próxima etapa é enviar os artigos correspondentes junto com o prompt original do usuário para o LLM para redigir uma resposta.

Considere o diagrama a seguir como uma implementação RAG simples (às vezes chamada de "RAG ingênuo").

Diagrama que descreve um fluxo RAG simples, com caixas representando etapas ou processos e setas conectando cada caixa. O fluxo começa com a consulta do usuário, que é enviada para a API de inserção. A API de incorporação retorna resultados em uma consulta vetorizada, que é usada para encontrar as correspondências mais próximas (partes do artigo) no banco de dados vetorial. As partes da consulta e do artigo são enviadas para a API de Conclusão e os resultados são enviados para o usuário.

No diagrama, um usuário envia uma consulta. A primeira etapa é criar uma incorporação para o prompt do usuário para recuperar um vetor. A próxima etapa é pesquisar no banco de dados vetorial os documentos (ou partes de documentos) que correspondem ao "vizinho mais próximo".

A similaridade de cosseno é uma medida usada para determinar a semelhança de dois vetores, avaliando essencialmente o cosseno do ângulo entre eles. Uma semelhança de cosseno próxima a 1 indica um alto grau de similaridade (ângulo pequeno), enquanto uma semelhança próxima a -1 indica dissimilaridade (ângulo próximo a 180 graus). Essa métrica é crucial para tarefas como similaridade de documentos, em que o objetivo é encontrar documentos com conteúdo ou significado semelhante.

Os algoritmos de "vizinho mais próximo" funcionam encontrando os vetores mais próximos (vizinhos) de um determinado ponto no espaço vetorial. No algoritmo k-vizinhos mais próximos (KNN), 'k' refere-se ao número de vizinhos mais próximos a serem considerados. Essa abordagem é amplamente utilizada em classificação e regressão, em que o algoritmo prevê o rótulo de um novo ponto de dados com base no rótulo majoritário de seus 'k' vizinhos mais próximos no conjunto de treinamento. KNN e similaridade de cosseno são frequentemente usados juntos em sistemas como mecanismos de recomendação, onde o objetivo é encontrar itens mais semelhantes às preferências de um usuário, representados como vetores no espaço de incorporação.

Você obtém os melhores resultados dessa pesquisa e envia o conteúdo correspondente junto com o prompt do usuário para gerar uma resposta que (esperançosamente) seja informada pelo conteúdo correspondente.

Desafios e considerações

A implementação de um sistema RAG vem com seu conjunto de desafios. A privacidade dos dados é fundamental, pois o sistema deve lidar com os dados do usuário com responsabilidade, especialmente ao recuperar e processar informações de fontes externas. Os requisitos computacionais também podem ser significativos, pois os processos de recuperação e generativos consomem muitos recursos. Garantir a precisão e a relevância das respostas enquanto gerencia os vieses presentes nos dados ou no modelo é outra consideração crítica. Os desenvolvedores devem enfrentar esses desafios com cuidado para criar sistemas RAG eficientes, éticos e valiosos.

O próximo artigo desta série, Construindo sistemas avançados de geração aumentada por recuperação, fornece mais detalhes sobre a criação de pipelines de dados e inferência para habilitar um sistema RAG pronto para produção.

Se você quiser começar a experimentar a criação de uma solução de IA generativa imediatamente, recomendamos dar uma olhada em Introdução ao chat usando seu próprio exemplo de dados para Python. Existem versões do tutorial também disponíveis em .NET, Java e JavaScript.

Ajustando um modelo

O ajuste fino, no contexto de um LLM, refere-se ao processo de ajustar os parâmetros do modelo em um conjunto de dados específico de domínio após ser treinado inicialmente em um conjunto de dados grande e diversificado.

Os LLMs são treinados (pré-treinados) em um amplo conjunto de dados, compreendendo a estrutura da linguagem, o contexto e uma ampla gama de conhecimentos. Este estágio envolve o aprendizado de padrões gerais de linguagem. O ajuste fino está adicionando mais treinamento ao modelo pré-treinado com base em um conjunto de dados menor e específico. Esta fase secundária de treinamento visa adaptar o modelo para um melhor desempenho em tarefas específicas ou entender domínios específicos, aumentando sua precisão e relevância para essas aplicações especializadas. Durante o ajuste fino, os pesos do modelo são ajustados para prever ou entender melhor as nuances desse conjunto de dados menor.

Algumas considerações:

  • Especialização: o ajuste fino adapta o modelo a tarefas específicas, como análise de documentos jurídicos, interpretação de texto médico ou interações de atendimento ao cliente. Isso torna o modelo mais eficaz nessas áreas.
  • Eficiência: é mais eficiente ajustar um modelo pré-treinado para uma tarefa específica do que treinar um modelo do zero, pois o ajuste fino requer menos dados e recursos computacionais.
  • Adaptabilidade: O ajuste fino permite a adaptação a novas tarefas ou domínios que não faziam parte dos dados de treinamento originais, tornando os LLMs ferramentas versáteis para várias aplicações.
  • Desempenho aprimorado: para tarefas diferentes dos dados nos quais o modelo foi originalmente treinado, o ajuste fino pode levar a um melhor desempenho, pois ajusta o modelo para entender a linguagem, o estilo ou a terminologia específicos usados no novo domínio.
  • Personalização: em alguns aplicativos, o ajuste fino pode ajudar a personalizar as respostas ou previsões do modelo para atender às necessidades ou preferências específicas de um usuário ou organização. No entanto, o ajuste fino também apresenta certas desvantagens e limitações. Compreendê-los pode ajudar a decidir quando optar pelo ajuste fino versus alternativas como a geração aumentada por recuperação (RAG).
  • Requisito de dados: o ajuste fino requer um conjunto de dados suficientemente grande e de alta qualidade específico para a tarefa ou domínio de destino. Coletar e organizar esse conjunto de dados pode ser desafiador e consumir muitos recursos.
  • Risco de sobreajuste: há um risco de sobreajuste, especialmente com um pequeno conjunto de dados. O sobreajuste faz com que o modelo tenha um bom desempenho nos dados de treinamento, mas ruim em dados novos e não vistos, reduzindo sua generalização.
  • Custo e recursos: embora menos intensivo em recursos do que o treinamento do zero, o ajuste fino ainda requer recursos computacionais, especialmente para grandes modelos e conjuntos de dados, o que pode ser proibitivo para alguns usuários ou projetos.
  • Manutenção e atualização: os modelos ajustados podem precisar de atualizações regulares para permanecerem eficazes à medida que as informações específicas do domínio mudam ao longo do tempo. Essa manutenção contínua requer recursos e dados extras.
  • Desvio do modelo: como o modelo é ajustado para tarefas específicas, ele pode perder parte de sua compreensão geral da linguagem e versatilidade, levando a um fenômeno conhecido como desvio do modelo.

Personalizando um modelo com ajuste fino explica como ajustar um modelo. Em um alto nível, você fornece um conjunto de dados JSON de possíveis perguntas e respostas preferenciais. A documentação sugere que há melhorias perceptíveis ao fornecer de 50 a 100 pares de perguntas / respostas, mas o número certo varia muito de acordo com o caso de uso.

Ajuste fino versus geração aumentada por recuperação

Superficialmente, pode parecer que há um pouco de sobreposição entre o ajuste fino e a geração aumentada por recuperação. A escolha entre o ajuste fino e a geração aumentada por recuperação depende dos requisitos específicos da tarefa, incluindo expectativas de desempenho, disponibilidade de recursos e a necessidade de especificidade de domínio versus generalização.

Quando preferir o ajuste fino em vez da geração aumentada por recuperação:

  • Desempenho específico da tarefa - O ajuste fino é preferível quando o alto desempenho em uma tarefa específica é crítico e existem dados específicos de domínio suficientes para treinar o modelo de forma eficaz sem riscos significativos de sobreajuste.
  • Controle sobre os dados - Se você tiver dados proprietários ou altamente especializados que diferem significativamente dos dados nos quais o modelo base foi treinado, o ajuste fino permite incorporar esse conhecimento exclusivo ao modelo.
  • Necessidade limitada de atualizações em tempo real - Se a tarefa não exigir que o modelo seja constantemente atualizado com as informações mais recentes, o ajuste fino pode ser mais eficiente, pois os modelos RAG normalmente precisam de acesso a bancos de dados externos atualizados ou à Internet para extrair dados recentes.

Quando preferir a geração aumentada por recuperação em vez do ajuste fino:

  • Conteúdo dinâmico ou em evolução - O RAG é mais adequado para tarefas em que ter as informações mais atuais é fundamental. Como os modelos RAG podem extrair dados de fontes externas em tempo real, eles são mais adequados para aplicações como geração de notícias ou resposta a perguntas sobre eventos recentes.
  • Generalização sobre especialização - Se o objetivo é manter um forte desempenho em uma ampla gama de tópicos, em vez de se destacar em um domínio restrito, o RAG pode ser preferível. Ele usa bases de conhecimento externas, permitindo gerar respostas em diversos domínios sem o risco de sobreajuste a um conjunto de dados específico.
  • Restrições de recursos - Para organizações com recursos limitados para coleta de dados e treinamento de modelos, o uso de uma abordagem RAG pode oferecer uma alternativa econômica ao ajuste fino, especialmente se o modelo base já tiver um desempenho razoavelmente bom nas tarefas desejadas.

Considerações finais que podem influenciar suas decisões de design de aplicativos

Aqui está uma pequena lista de coisas a serem consideradas e outras conclusões deste artigo que afetam suas decisões de design de aplicativos:

  • Decida entre o ajuste fino e a geração aumentada por recuperação com base nas necessidades específicas do seu aplicativo. O ajuste fino pode oferecer melhor desempenho para tarefas especializadas, enquanto o RAG pode fornecer flexibilidade e conteúdo atualizado para aplicativos dinâmicos.