A geração aumentada de recuperação (RAG) é uma técnica usada para “fundamentar” grandes modelos de linguagem (LLMs) com fontes de dados específicas, muitas vezes fontes que não foram incluídas no treinamento original dos modelos. As três etapas do RAG são a recuperação de uma fonte especificada, o aumento do prompt com o contexto recuperado da fonte e, em seguida, a geração usando o modelo e o prompt aumentado.

Em um exercício de dogfooding, perguntei ao modelo de linguagem grande GPT-4 “O que é geração aumentada por recuperação?” usando seu plug-in Browse, que é uma implementação da geração aumentada de recuperação.

Isto é o que o GPT-4 finalmente me disse, depois que pedi para regenerar sua resposta:

—————–

A Geração Aumentada de Recuperação (RAG) é uma estrutura de IA que impacta significativamente o campo do Processamento de Linguagem Natural (PNL). Ele foi projetado para melhorar a precisão e a riqueza do conteúdo produzido por modelos de linguagem. Aqui está uma síntese dos pontos-chave relativos ao RAG de várias fontes:

– RAG é um sistema que recupera fatos de uma base de conhecimento externa para fornecer base para grandes modelos de linguagem (LLMs). Esta fundamentação garante que a informação gerada pelos LLMs se baseia em dados precisos e atuais, o que é particularmente importante dado que os LLMs podem por vezes produzir resultados inconsistentes[5†fonte】

– A estrutura funciona como um modelo híbrido, integrando modelos de recuperação e generativos. Essa integração permite que o RAG produza textos que não sejam apenas contextualmente precisos, mas também ricos em informações. A capacidade do RAG de extrair informações de extensos bancos de dados permite que ele contribua com conteúdo contextualmente relevante e detalhado para o processo gerador【6†fonte】.

– O RAG aborda uma limitação dos modelos linguísticos fundamentais, que geralmente são treinados off-line em corpora de domínio amplo e não são atualizados com novas informações após o treinamento. Isso os torna menos eficazes para tarefas que exigem conhecimento específico do domínio. Por outro lado, o RAG pode acessar os dados mais recentes, tornando-o mais adaptável e capaz de funcionar bem em aplicações específicas de domínio【7†fonte】.

– Em comparação com os modelos tradicionais de geração de texto, o RAG mostrou vantagens notáveis ​​e alcançou desempenho de última geração em muitas tarefas de PNL. Sua capacidade de aumentar o processo de geração com informações recuperadas o torna uma ferramenta poderosa para a criação de texto informativo e de alta qualidade【8†fonte】.

As capacidades combinadas do RAG para recuperar e gerar texto tornam-no uma ferramenta inovadora em PNL, aumentando a relevância e a qualidade do resultado dos modelos de linguagem.

——————

Com exceção de alguns pontos exagerados, essa é uma resposta decente. Isso deixou de fora o fato de que o RAG se originou no Facebook (agora Meta) AI Research.

Obtive resultados bastante bons usando implementações RAG para casos em que LLMs não aprimorados carecem de informações atuais e, especialmente, em casos em que o LLM básico sai dos trilhos e começa a alucinar com seus próprios fatos. Por outro lado, já vi LLMs alucinarem mesmo quando usavam RAG.

Usar fontes externas de informação (a parte de recuperação do RAG) não significa apenas fazer uma pesquisa na web. Também pode significar fornecer seus próprios documentos para o LLM usar ou apontar o LLM para documentação específica da web (sem necessidade de pesquisa adicional), por exemplo, conforme descrito por minha colega do InfoWorld, Sharon Machlis, neste artigo.

Os problemas: alucinações do LLM e contexto limitado

Os LLMs geralmente levam muito tempo usando recursos caros para treinar, às vezes meses de tempo de execução usando dezenas de GPUs de servidor de última geração, como NVIDIA H100s. Manter os LLMs completamente atualizados por meio de um novo treinamento do zero não é um bom começo, embora o processo mais barato de ajuste fino do modelo base em dados mais recentes possa ajudar.

No entanto, o ajuste fino às vezes tem suas desvantagens, pois pode reduzir a funcionalidade presente no modelo base (como consultas de uso geral bem tratadas no Llama) ao adicionar novas funcionalidades por meio do ajuste fino (como a geração de código adicionada ao Code Llama). .

O que acontece se você perguntar a um LLM que foi treinado com dados que terminaram em 2022 sobre algo que ocorreu em 2023? Duas possibilidades: ou perceberá que não sabe, ou não saberá. No primeiro caso, normalmente informará sobre seus dados de treinamento, por exemplo, “Na minha última atualização em janeiro de 2022, eu tinha informações sobre….” Neste último caso, ele tentará lhe dar uma resposta com base em dados mais antigos, semelhantes, mas irrelevantes, ou poderá inventar coisas (alucinar).

Para evitar o desencadeamento de alucinações de LLM, às vezes ajuda mencionar a data de um evento ou um URL da web relevante em seu prompt. Você também pode fornecer um documento relevante, mas fornecer documentos longos (seja fornecendo o texto ou a URL) funciona apenas até que o limite de contexto do LLM seja atingido e então ele interrompe a leitura. A propósito, os limites de contexto diferem entre os modelos: dois modelos de Claude oferecem uma janela de contexto de token de 100 mil, que equivale a cerca de 75.000 palavras, o que é muito maior do que a maioria dos outros LLMs.

A solução: fundamentar o LLM com fatos

Como você pode imaginar pelo título e início deste artigo, uma resposta para ambos os problemas é a geração aumentada por recuperação. Em alto nível, o RAG funciona combinando uma pesquisa na Internet ou em documentos com um modelo de linguagem, de forma a contornar os problemas que você encontraria ao tentar executar as duas etapas manualmente, por exemplo, o problema de ter o resultado da pesquisa excedendo o limite de contexto do modelo de linguagem.

A primeira etapa no RAG é usar a consulta para uma pesquisa na Internet, em documentos ou em bancos de dados e vetorizar as informações de origem em um formato denso e de alta dimensão, normalmente gerando um vetor de incorporação e armazenando-o em um banco de dados vetorial. Esta é a fase de recuperação.

Em seguida, você pode vetorizar a consulta em si e usar o FAISS ou outra pesquisa de similaridade, normalmente usando uma métrica de cosseno para similaridade, no banco de dados vetorial, e usar isso para extrair as porções mais relevantes (ou K itens principais) das informações de origem e apresentá-las. ao LLM junto com o texto da consulta. Esta é a fase de aumento.

Finalmente, o LLM, referido no artigo original do Facebook AI como modelo seq2seq, gera uma resposta. Esta é a fase de geração.

Tudo isso parece complicado, mas na verdade são apenas cinco linhas de Python se você usar a estrutura LangChain para orquestração:

from langchain.document_loaders import WebBaseLoader
from langchain.indexes import VectorstoreIndexCreator
loader = WebBaseLoader("https://www.promptingguide.ai/techniques/rag")
index = VectorstoreIndexCreator().from_loaders((loader))
index.query("What is RAG?")

Assim, o RAG aborda dois problemas com grandes modelos de linguagem: conjuntos de treinamento desatualizados e documentos de referência que excedem as janelas de contexto dos LLMs. Ao combinar a recuperação de informações atuais, vetorização, aumento da informação usando pesquisa de similaridade vetorial e gIA generativa, você pode obter resultados mais atuais, mais concisos e mais fundamentados do que usando apenas pesquisa ou IA generativa.