Partilhar via


Melhorar a qualidade da cadeia RAG

Diagrama dos componentes da cadeia RAG que contribuem para a qualidade.

Este artigo aborda como você pode melhorar a qualidade do aplicativo RAG usando componentes da cadeia RAG.

A cadeia RAG toma uma consulta do usuário como entrada, recupera informações relevantes dadas a essa consulta e gera uma resposta apropriada baseada nos dados recuperados. Embora as etapas exatas dentro de uma cadeia RAG possam variar muito, dependendo do caso de uso e dos requisitos, os seguintes são os principais componentes a serem considerados ao construir sua cadeia RAG:

  1. Compreensão da consulta: Analisar e transformar as consultas do usuário para representar melhor a intenção e extrair informações relevantes, como filtros ou palavras-chave, para melhorar o processo de recuperação.
  2. Recuperação: Encontrar as partes mais relevantes de informações dadas a uma consulta de recuperação. No caso de dados não estruturados, isso geralmente envolve uma ou uma combinação de pesquisa semântica ou baseada em palavras-chave.
  3. Aumento imediato: Combinando uma consulta do usuário com informações recuperadas e instruções para orientar o LLM a gerar respostas de alta qualidade.
  4. LLM: Selecionar o modelo (e os parâmetros do modelo) mais apropriados para seu aplicativo para otimizar/equilibrar o desempenho, a latência e o custo.
  5. Pós-processamento e guarda-corpos: Aplicar etapas de processamento adicionais e medidas de segurança para garantir que as respostas geradas pelo LLM sejam no tópico, factualmente consistentes e respeitem diretrizes ou restrições específicas.

Iteratively implement & evaluate quality fixes mostra como iterar sobre os componentes de uma cadeia.

Compreensão da consulta

Usar a consulta do usuário diretamente como uma consulta de recuperação pode funcionar para algumas consultas. No entanto, geralmente é benéfico reformular a consulta antes da etapa de recuperação. A compreensão da consulta compreende uma etapa (ou série de etapas) no início de uma cadeia para analisar e transformar as consultas do usuário para representar melhor a intenção, extrair informações relevantes e, finalmente, ajudar no processo de recuperação subsequente. As abordagens para transformar uma consulta de usuário para melhorar a recuperação incluem:

  1. Reconfiguração de consulta: a reconfiguração de consulta envolve a tradução de uma consulta de usuário em uma ou mais consultas que representam melhor a intenção original. O objetivo é reformular a consulta de forma a aumentar a probabilidade de a etapa de recuperação encontrar os documentos mais relevantes. Isso pode ser particularmente útil ao lidar com consultas complexas ou ambíguas que podem não corresponder diretamente à terminologia usada nos documentos de recuperação.

    Exemplos:

    • Parafraseando o histórico de conversas em um bate-papo de vários turnos
    • Corrigir erros ortográficos na consulta do utilizador
    • Substituir palavras ou frases na consulta do usuário por sinônimos para capturar uma gama mais ampla de documentos relevantes

    Importante

    A reconfiguração da consulta deve ser feita em conjunto com as alterações no componente de recuperação

  2. Extração de filtros: em alguns casos, as consultas do usuário podem conter filtros ou critérios específicos que podem ser usados para restringir os resultados da pesquisa. A extração de filtros envolve identificar e extrair esses filtros da consulta e passá-los para a etapa de recuperação como parâmetros adicionais. Isso pode ajudar a melhorar a relevância dos documentos recuperados, concentrando-se em subconjuntos específicos dos dados disponíveis.

    Exemplos:

    • Extrair períodos de tempo específicos mencionados na consulta, como "artigos dos últimos 6 meses" ou "relatórios de 2023".
    • Identificar menções a produtos, serviços ou categorias específicas na consulta, como "Databricks Professional Services" ou "laptops".
    • Extração de entidades geográficas da consulta, como nomes de cidades ou códigos de país.

    Nota

    A extração do filtro deve ser feita em conjunto com alterações nos componentes do pipeline de dados de extração de metadados e da cadeia de recuperação. A etapa de extração de metadados deve garantir que os campos de metadados relevantes estejam disponíveis para cada documento/bloco e a etapa de recuperação deve ser implementada para aceitar e aplicar filtros extraídos.

Além da reescrita de consultas e extração de filtros, outra consideração importante no entendimento de consultas é usar uma única chamada LLM ou várias chamadas. Embora o uso de uma única chamada com um prompt cuidadosamente criado possa ser eficiente, há casos em que dividir o processo de compreensão da consulta em várias chamadas LLM pode levar a melhores resultados. Isso, a propósito, é uma regra geral aplicável quando você está tentando implementar várias etapas lógicas complexas em um único prompt.

Por exemplo, você pode usar uma chamada LLM para classificar a intenção da consulta, outra para extrair entidades relevantes e uma terceira para reescrever a consulta com base nas informações extraídas. Embora essa abordagem possa adicionar alguma latência ao processo geral, ela pode permitir um controle mais refinado e potencialmente melhorar a qualidade dos documentos recuperados.

Compreensão de consulta em várias etapas para um bot de suporte

Veja como um componente de compreensão de consulta de várias etapas pode procurar um bot de suporte ao cliente:

  1. Classificação de intenção: use um LLM para classificar a consulta do usuário em categorias predefinidas, como "informações do produto", "solução de problemas" ou "gerenciamento de contas".
  2. Extração de entidade: com base na intenção identificada, use outra chamada LLM para extrair entidades relevantes da consulta, como nomes de produtos, erros relatados ou números de conta.
  3. Reescrita de consulta: use a intenção extraída e as entidades para reescrever a consulta original em um formato mais específico e direcionado, por exemplo, "Minha cadeia RAG está falhando ao implantar no Model Serving, estou vendo o seguinte erro...".

Obtenção

O componente de recuperação da cadeia RAG é responsável por encontrar os blocos de informação mais relevantes fornecidos a uma consulta de recuperação. No contexto de dados não estruturados, a recuperação normalmente envolve uma ou uma combinação de pesquisa semântica, pesquisa baseada em palavras-chave e filtragem de metadados. A escolha da estratégia de recuperação depende dos requisitos específicos do seu aplicativo, da natureza dos dados e dos tipos de consultas que você espera tratar. Vamos comparar estas opções:

  1. Pesquisa semântica: a pesquisa semântica usa um modelo de incorporação para converter cada pedaço de texto em uma representação vetorial que captura seu significado semântico. Ao comparar a representação vetorial da consulta de recuperação com as representações vetoriais dos blocos, a pesquisa semântica pode recuperar documentos conceitualmente semelhantes, mesmo que eles não contenham as palavras-chave exatas da consulta.
  2. Pesquisa baseada em palavras-chave: a pesquisa baseada em palavras-chave determina a relevância dos documentos analisando a frequência e a distribuição das palavras compartilhadas entre a consulta de recuperação e os documentos indexados. Quanto mais frequentemente as mesmas palavras aparecerem na consulta e num documento, maior será a pontuação de relevância atribuída a esse documento.
  3. Pesquisa híbrida: a pesquisa híbrida combina os pontos fortes da pesquisa semântica e baseada em palavras-chave, empregando um processo de recuperação em duas etapas. Primeiro, realiza uma pesquisa semântica para recuperar um conjunto de documentos conceitualmente relevantes. Em seguida, ele aplica a pesquisa baseada em palavras-chave nesse conjunto reduzido para refinar ainda mais os resultados com base em correspondências exatas de palavras-chave. Finalmente, combina as pontuações de ambas as etapas para classificar os documentos.

Comparar estratégias de recuperação

A tabela a seguir contrasta cada uma dessas estratégias de recuperação entre si:

Pesquisa semântica Pesquisa de palavra-chave Pesquisa híbrida
Explicação simples Se os mesmos conceitos aparecerem na consulta e em um documento potencial, eles serão relevantes. Se as mesmas palavras aparecerem na consulta e num potencial documento, são relevantes. Quanto mais palavras da consulta no documento, mais relevante é esse documento. Executa TANTO uma pesquisa semântica como uma pesquisa por palavra-chave e, em seguida, combina os resultados.
Exemplo de caso de uso Suporte ao cliente onde as consultas do usuário são diferentes das palavras nos manuais do produto. Exemplo: "como faço para ligar meu telefone?" e a seção manual é chamada de "alternando a potência". Suporte ao cliente quando as consultas contêm termos técnicos específicos e não descritivos. Exemplo: "o que faz o modelo HD7-8D?" Consultas de suporte ao cliente que combinavam termos semânticos e técnicos. Exemplo: "como ligo o meu HD7-8D?"
Abordagens técnicas Usa incorporações para representar texto em um espaço vetorial contínuo, permitindo a pesquisa semântica. Depende de métodos baseados em tokens discretos como bag-of-words, TF-IDF, BM25 para correspondência de palavras-chave. Use uma abordagem de reclassificação para combinar os resultados, como fusão de classificação recíproca ou um modelo de reclassificação.
Pontos fortes Recuperar informações contextualmente semelhantes a uma consulta, mesmo que as palavras exatas não sejam usadas. Cenários que exigem correspondências precisas de palavras-chave, ideais para consultas específicas focadas em termos, como nomes de produtos. Combina o melhor de ambas as abordagens.

Formas de melhorar o processo de recuperação

Além dessas principais estratégias de recuperação, há várias técnicas que você pode aplicar para melhorar ainda mais o processo de recuperação:

  • Expansão de consulta: a expansão de consulta pode ajudar a capturar uma gama mais ampla de documentos relevantes usando várias variações da consulta de recuperação. Isso pode ser conseguido realizando pesquisas individuais para cada consulta expandida ou usando uma concatenação de todas as consultas de pesquisa expandidas em uma única consulta de recuperação.

Nota

A expansão da consulta deve ser feita em conjunto com alterações no componente de compreensão da consulta (cadeia RAG). As múltiplas variações de uma consulta de recuperação são normalmente geradas nesta etapa.

  • Reclassificação: Depois de recuperar um conjunto inicial de partes, aplique critérios de classificação adicionais (por exemplo, classificar por tempo) ou um modelo de reclassificação para reordenar os resultados. A reclassificação pode ajudar a priorizar as partes mais relevantes de acordo com uma consulta de recuperação específica. A reclassificação com modelos de codificadores cruzados, como mxbai-rerank e ColBERTv2 , pode gerar um aumento no desempenho de recuperação.
  • Filtragem de metadados: use filtros de metadados extraídos da etapa de compreensão da consulta para restringir o espaço de pesquisa com base em critérios específicos. Os filtros de metadados podem incluir atributos como tipo de documento, data de criação, autor ou tags específicas do domínio. Ao combinar filtros de metadados com pesquisa semântica ou baseada em palavras-chave, você pode criar uma recuperação mais direcionada e eficiente.

Nota

A filtragem de metadados deve ser feita em conjunto com alterações nos componentes de compreensão de consulta (cadeia RAG) e extração de metadados (pipeline de dados).

Aumento imediato

O aumento de prompt é a etapa em que a consulta do usuário é combinada com as informações e instruções recuperadas em um modelo de prompt para orientar o modelo de linguagem para gerar respostas de alta qualidade. É necessário iterar neste modelo para otimizar o prompt fornecido ao LLM (AKA prompt engineering) para garantir que o modelo seja orientado para produzir respostas precisas, fundamentadas e coerentes.

Há guias inteiros para engenharia de prompts, mas aqui estão algumas considerações a ter em mente quando você estiver iterando no modelo de prompt:

  1. Forneça exemplos
    • Inclua exemplos de consultas bem formadas e suas correspondentes respostas ideais dentro do próprio modelo de prompt (aprendizagem de poucas imagens). Isso ajuda o modelo a entender o formato, o estilo e o conteúdo desejados das respostas.
    • Uma maneira útil de encontrar bons exemplos é identificar os tipos de consultas com as quais sua cadeia se debate. Crie respostas padrão ouro para essas consultas e inclua-as como exemplos no prompt.
    • Certifique-se de que os exemplos fornecidos sejam representativos das consultas do usuário que você antecipa no momento da inferência. Procure cobrir uma gama diversificada de consultas esperadas para ajudar o modelo a generalizar melhor.
  2. Parametrizar seu modelo de prompt
    • Projete seu modelo de prompt para ser flexível, parametrizando-o para incorporar informações adicionais além dos dados recuperados e da consulta do usuário. Podem ser variáveis como a data atual, o contexto do utilizador ou outros metadados relevantes.
    • Injetar essas variáveis no prompt no momento da inferência pode permitir respostas mais personalizadas ou sensíveis ao contexto.
  3. Considere a solicitação da cadeia de pensamento
    • Para consultas complexas em que as respostas diretas não são facilmente aparentes, considere a solicitação de Cadeia de Pensamento (CoT). Esta estratégia de engenharia rápida divide questões complicadas em etapas mais simples e sequenciais, guiando o LLM através de um processo de raciocínio lógico.
    • Ao solicitar que o modelo "pense no problema passo a passo", você o incentiva a fornecer respostas mais detalhadas e bem fundamentadas, o que pode ser particularmente eficaz para lidar com consultas de várias etapas ou abertas.
  4. Os prompts não podem ser transferidos entre modelos
    • Reconheça que os prompts geralmente não são transferidos perfeitamente entre diferentes modelos de idioma. Cada modelo tem suas próprias características únicas, onde um prompt que funciona bem para um modelo pode não ser tão eficaz para outro.
    • Experimente diferentes formatos e comprimentos de prompt, consulte guias on-line (como OpenAI Cookbook, Anthropic cookbook) e esteja preparado para adaptar e refinar seus prompts ao alternar entre modelos.

LLM

O componente de geração da cadeia RAG usa o modelo de prompt aumentado da etapa anterior e o passa para um LLM. Ao selecionar e otimizar um LLM para o componente de geração de uma cadeia RAG, considere os seguintes fatores, que são igualmente aplicáveis a quaisquer outras etapas que envolvam chamadas LLM:

  1. Experimente diferentes modelos prontos para uso.
    • Cada modelo tem suas próprias propriedades, forças e fraquezas únicas. Alguns modelos podem ter uma melhor compreensão de certos domínios ou ter um melhor desempenho em tarefas específicas.
    • Como mencionado anteriormente, tenha em mente que a escolha do modelo também pode influenciar o processo de engenharia imediata, pois modelos diferentes podem responder de forma diferente aos mesmos prompts.
    • Se houver várias etapas em sua cadeia que exijam um LLM, como chamadas para compreensão de consulta, além da etapa de geração, considere o uso de modelos diferentes para etapas diferentes. Modelos mais caros e de uso geral podem ser exagerados para tarefas como determinar a intenção de uma consulta de usuário.
  2. Comece pequeno e aumente a escala conforme necessário.
    • Embora possa ser tentador alcançar imediatamente os modelos mais potentes e capazes disponíveis (por exemplo, GPT-4, Claude), muitas vezes é mais eficiente começar com modelos menores e mais leves.
    • Em muitos casos, alternativas menores de código aberto como Llama 3 ou DBRX podem fornecer resultados satisfatórios a um custo mais baixo e com tempos de inferência mais rápidos. Esses modelos podem ser particularmente eficazes para tarefas que não exigem raciocínio altamente complexo ou amplo conhecimento do mundo.
    • À medida que você desenvolve e refina sua cadeia RAG, avalie continuamente o desempenho e as limitações do modelo escolhido. Se você achar que o modelo tem dificuldades com certos tipos de consultas ou não fornece respostas suficientemente detalhadas ou precisas, considere escalar para um modelo mais capaz.
    • Monitore o impacto da alteração de modelos em métricas-chave, como qualidade de resposta, latência e custo, para garantir que você esteja encontrando o equilíbrio certo para os requisitos de seu caso de uso específico.
  3. Otimizar os parâmetros do modelo
    • Experimente diferentes configurações de parâmetros para encontrar o equilíbrio ideal entre qualidade de resposta, diversidade e coerência. Por exemplo, ajustar a temperatura pode controlar a aleatoriedade do texto gerado, enquanto max_tokens pode limitar o comprimento da resposta.
    • Lembre-se de que as configurações ideais de parâmetros podem variar dependendo da tarefa específica, do prompt e do estilo de saída desejado. Teste e refine iterativamente essas configurações com base na avaliação das respostas geradas.
  4. Ajuste fino específico da tarefa
    • À medida que refina o desempenho, considere ajustar modelos menores para subtarefas específicas dentro da cadeia RAG, como o entendimento de consultas.
    • Ao treinar modelos especializados para tarefas individuais com a cadeia RAG, você pode potencialmente melhorar o desempenho geral, reduzir a latência e reduzir os custos de inferência em comparação com o uso de um único modelo grande para todas as tarefas.
  5. Pré-formação contínua
    • Se o seu aplicativo RAG lida com um domínio especializado ou requer conhecimento que não está bem representado no LLM pré-treinado, considere a realização de pré-treinamento contínuo (CPT) em dados específicos do domínio.
    • O pré-treinamento contínuo pode melhorar a compreensão de um modelo de terminologia específica ou conceitos exclusivos do seu domínio. Por sua vez, isso pode reduzir a necessidade de engenharia rápida extensiva ou exemplos de poucos tiros.

Pós-processamento e guarda-corpos

Depois que o LLM gera uma resposta, muitas vezes é necessário aplicar técnicas de pós-processamento ou guarda-corpos para garantir que a saída atenda aos requisitos de formato, estilo e conteúdo desejados. Esta etapa final (ou várias etapas) na cadeia pode ajudar a manter a consistência e a qualidade em todas as respostas geradas. Se você estiver implementando pós-processamento e guarda-corpos, considere alguns dos seguintes:

  1. Impondo o formato de saída
    • Dependendo do seu caso de uso, você pode exigir que as respostas geradas adiram a um formato específico, como um modelo estruturado ou um tipo de arquivo específico (como JSON, HTML, Markdown e assim por diante).
    • Se a saída estruturada for necessária, bibliotecas como Instructor ou Outlines fornecem bons pontos de partida para implementar esse tipo de etapa de validação.
    • Ao desenvolver, reserve um tempo para garantir que a etapa de pós-processamento seja flexível o suficiente para lidar com variações nas respostas geradas, mantendo o formato necessário.
  2. Manter a consistência do estilo
    • Se o seu aplicativo RAG tiver diretrizes de estilo ou requisitos de tom específicos (por exemplo, formal versus casual, conciso versus detalhado), uma etapa de pós-processamento poderá verificar e impor esses atributos de estilo nas respostas geradas.
  3. Filtros de conteúdo e guarda-corpos de segurança
  4. Manuseamento de alucinações
    • A defesa contra alucinações também pode ser implementada como uma etapa de pós-processamento. Isso pode envolver o cruzamento da saída gerada com documentos recuperados ou o uso de LLMs adicionais para validar a precisão factual da resposta.
    • Desenvolver mecanismos de fallback para lidar com casos em que a resposta gerada não atenda aos requisitos de precisão factual, como gerar respostas alternativas ou fornecer isenções de responsabilidade ao usuário.
  5. Tratamento de erros
    • Com quaisquer etapas de pós-processamento, implemente mecanismos para lidar graciosamente com casos em que a etapa encontra um problema ou não consegue gerar uma resposta satisfatória. Isso pode envolver a geração de uma resposta padrão ou escalar o problema para um operador humano para revisão manual.