Melhorar a qualidade da cadeia RAG

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

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

A cadeia RAG recebe uma consulta do usuário como entrada, recupera informações relevantes com base nessa consulta e gera uma resposta apropriada com base nos dados recuperados. Embora os passos exatos em uma cadeia RAG possam variar muito, dependendo do caso de uso e dos requisitos, a seguir estão os key componentes a serem considerados ao criar sua cadeia RAG:

  1. Compreensão de consultas: Analisar e transformar as consultas dos usuários para melhor representar a intenção e extrair informações relevantes, como filtros ou palavras-chave, para aprimorar o processo de recuperação.

  2. Recuperação: Encontrar as partes mais relevantes da informação em uma consulta de recuperação. No caso de dados não estruturados, isso normalmente envolve uma ou uma combinação de pesquisa semântica ou baseada em palavras-chave.

  3. Aumento do prompt: Combinação de uma consulta do usuário com informações recuperadas e instruções para orientar o LLM a gerar respostas de alta qualidade.

  4. LLM: seleção do modelo mais adequado (e dos parâmetros do modelo) para seu aplicativo, a fim de otimizar/equilibrar o desempenho, a latência e o custo.

  5. Pós-processamento e barreiras de proteção: Aplicação de passos adicionais de processamento e medidas de segurança para garantir que as respostas geradas pelo LLMestejam dentro do tópico, sejam factualmente consistentes e sigam diretrizes ou restrições específicas.

Implementar iterativamente & avaliar correções de qualidade 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 é vantajoso reformular a consulta antes do passo a passo da recuperação. O entendimento da consulta compreende um passo (ou uma série de passos) no início de uma cadeia para analisar e transformar as consultas do usuário para melhor representar a intenção, extrair informações relevantes e, por fim, ajudar no processo de recuperação subsequente. As abordagens para transformar uma consulta do usuário para melhorar a recuperação incluem:

  1. Reescrita de consultas: A reescrita de consultas envolve a tradução de uma consulta do usuário em uma ou mais consultas que representem melhor a intenção original. O objetivo é reformular a consulta de uma forma que aumente a probabilidade de a 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 a história da conversa em um bate-papo com vários turnos

    • Correção de erros de ortografia na consulta do usuário

    • Substituição de palavras ou frases na consulta do usuário por sinônimos para capturar uma gama mais ampla de documentos relevantes

    Importante

    A reescrita de consultas 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 o passo 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:

    • Extração de períodos de tempo específicos mencionados na consulta, como "artigos dos últimos 6 meses" ou "relatórios de 2023".

    • Identificar menções de produtos, serviços ou categorias específicas na consulta, como "Databricks Professional service" ou "laptops".

    • Extração de entidades geográficas da consulta, como nomes de cidades ou códigos de países.

    Observação

    A extração de filtros 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. O passo de extração de metadados deve garantir que os campos de metadados relevantes estejam disponíveis para cada documento/chunk, e o passo de recuperação deve ser implementado para aceitar e aplicar filtros extraídos.

Além da reescrita da consulta e da extração de filtros, outra consideração importante na compreensão da consulta é se deve ser usada uma única chamada ao LLM ou várias chamadas. Embora o uso de uma única chamada com um prompt cuidadosamente elaborado possa ser eficiente, há casos em que a divisão do processo de compreensão da consulta em várias chamadas ao LLM pode levar a melhores resultados. Essa, a propósito, é uma regra geral aplicável quando o senhor está tentando implementar vários passos lógicos complexos em um único prompt.

Por exemplo, o senhor 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 acrescentar alguma latência ao processo geral, ela pode permitir um controle mais refinado e, possivelmente, melhorar a qualidade dos documentos recuperados.

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

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

  1. Classificação da intenção: Use um LLM para classificar a consulta do usuário em categorias predefinidas, como "informações sobre o produto", "solução de problemas" ou "gerenciamento doaccount ".

  2. Extração de entidades: 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 account.

  3. Reescrita de consultas: Use a intenção e as entidades extraídas para reescrever a consulta original em um formato mais específico e direcionado, por exemplo, "Minha cadeia RAG não está conseguindo ser implantada no modelo servindo, estou vendo o seguinte erro...".

Recuperação

O componente de recuperação da cadeia RAG é responsável por encontrar os blocos de informações mais relevantes em 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 o senhor espera processar. Vamos comparar essas 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 de palavras compartilhadas entre a consulta de recuperação e os documentos indexados. Quanto mais frequentemente as mesmas palavras aparecerem na consulta e em um 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 da pesquisa baseada em palavras-chave, empregando um processo de recuperação em duas etapas. Primeiro, ele 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. Por fim, ele combina as pontuações de ambos os passos para classificar os documentos.

Comparar estratégias de recuperação

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

Busca semântica

Busca por palavra-chave

Pesquisa híbrida

Explicação simples

Se os mesmos conceitos aparecerem na consulta e em um documento potencial, eles são relevantes.

Se as mesmas palavras aparecerem na consulta e em um documento potencial, elas são relevantes. Quanto mais palavras da consulta houver no documento, mais relevante será o documento.

executa AMBAS uma pesquisa semântica e uma pesquisa por palavra-chave e, em seguida, combina os resultados.

Exemplo de caso de uso

Suporte ao cliente em que as dúvidas dos usuários são diferentes das palavras nos manuais do produto. Exemplo: "how do i turn my phone on?" (como faço para ligar meu telefone?) e a seção do manual é chamada de "toggling the power" (alternar a energia).

Suporte ao cliente em que as consultas contêm termos técnicos específicos e não descritivos. Exemplo: "O que o modelo HD7-8D faz?"

Consultas de suporte ao cliente que combinavam termos semânticos e técnicos. Exemplo: "Como faço para ligar minha HD7-8D?"

Abordagens técnicas

Usa embeddings para representar o texto em um espaço vetorial contínuo, permitindo a pesquisa semântica.

Baseia-se em métodos discretos baseados em tokens, como bag-of-words, TF-IDF, BM25 para correspondência de palavras-chave.

Use uma abordagem de reclassificação para combinar os resultados, como a fusão de classificação recíproca ou um modelo de reclassificação.

Pontos fortes

Recuperação de 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 focadas em termos específicos, como nomes de produtos.

Combina o melhor de ambas as abordagens.

Formas de aprimorar o processo de recuperação

Além dessas estratégias essenciais de recuperação, há várias técnicas que o senhor pode aplicar para aprimorar ainda mais o processo de recuperação:

  • Expansão da consulta: A expansão da consulta pode ajudar a capturar uma gama mais ampla de documentos relevantes usando diversas variações da consulta de recuperação. Isso pode ser feito por meio da realização de 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.

Observação

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

  • Reordenação: Depois de recuperar um conjunto inicial de blocos, aplique critérios de classificação adicionais (por exemplo, classificar por tempo) ou um modelo de classificação para reordenar os resultados. A reclassificação pode ajudar a priorizar os blocos mais relevantes de acordo com uma consulta de recuperação específica. O ranqueamento com modelos de codificadores cruzados, como o mxbai-rerank e o ColBERTv2, pode gerar um aumento no desempenho da recuperação.

  • Filtragem de metadados: Use filtros de metadados extraídos do entendimento 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 de domínio. Ao combinar filtros de metadados com pesquisa semântica ou baseada em palavras-chave, o senhor pode criar uma recuperação mais direcionada e eficiente.

Observação

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

Aumento imediato

O aumento do prompt é o passo em que a consulta do usuário é combinada com as informações e instruções recuperadas em um padrão de prompt para orientar o modelo de linguagem a gerar respostas de alta qualidade. A iteração desse padrão para otimizar o prompt fornecido ao LLM (também conhecido como engenharia de prompt) é necessária para garantir que o modelo seja orientado para produzir respostas precisas, fundamentadas e coerentes.

Há um guia completo para a engenharia de prompts, mas aqui estão algumas considerações que o senhor deve ter em mente quando estiver trabalhando com o padrão de prompts:

  1. Forneça exemplos

    • Inclua exemplos de consultas bem formadas e suas respostas ideais correspondentes dentro do próprio padrão do prompt(aprendizado de poucas tentativas). 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 tem dificuldades. 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ê prevê no momento da inferência. Procure abranger uma gama diversificada de consultas esperadas para ajudar o modelo a se generalizar melhor.

  2. Parametrize seu padrão de prompt

    • Projete seu padrão 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 usuário ou outros metadados relevantes.

    • A injeção dessas variáveis no prompt no momento da inferência pode permitir respostas mais personalizadas ou sensíveis ao contexto.

  3. Considere o estímulo da cadeia de pensamento

    • Para consultas complexas em que as respostas diretas não são prontamente aparentes, considere a solicitação de Chain-of-Thought (CoT). Essa estratégia de engenharia imediata divide perguntas complicadas em passos mais simples e sequenciais, guiando o LLM por um processo de raciocínio lógico.

    • Ao solicitar que o modelo "pense no problema passo a passo", o senhor 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 podem não ser transferidos entre os modelos

    • Reconhecer que os prompts muitas vezes não são transferidos sem problemas entre modelos de idiomas diferentes. Cada modelo tem suas próprias características exclusivas, e um prompt que funciona bem para um modelo pode não ser tão eficaz para outro.

    • Experimente diferentes formatos e durações de prompts, consulte guias on-line (como o 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 pega o prompt padrão aumentado do passo 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 qualquer outro passo que envolva chamadas LLM:

  1. Faça experiências com diferentes modelos prontos para uso.

    • Cada modelo tem suas próprias propriedades, pontos fortes e fracos. Alguns modelos podem ter uma compreensão melhor de determinados domínios ou ter um desempenho melhor em tarefas específicas.

    • Conforme mencionado anteriormente, lembre-se de que a escolha do modelo também pode influenciar o processo de engenharia de prompts, pois modelos diferentes podem responder de forma diferente aos mesmos prompts.

    • Se houver vários passos em sua cadeia que exijam um LLM, como chamadas para a compreensão da consulta, além do passo de geração, considere o uso de modelos diferentes para passos diferentes. Modelos mais caros e de uso geral podem ser um exagero para tarefas como determinar a intenção de uma consulta do usuário.

  2. Comece pequeno e aumente conforme necessário.

    • Embora possa ser tentador escolher imediatamente os modelos mais potentes e capazes disponíveis (por exemplo, GPT-4, Claude), geralmente é mais eficiente começar com modelos menores e mais leves.

    • Em muitos casos, alternativas menores de código aberto, como o Llama 3 ou o DBRX, podem fornecer resultados satisfatórios a um custo menor 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.

    • Ao desenvolver e refinar sua cadeia RAG, avalie continuamente o desempenho e as limitações do modelo escolhido. Se o senhor perceber que o modelo tem dificuldades com determinados tipos de consultas ou não consegue fornecer respostas suficientemente detalhadas ou precisas, considere a possibilidade de aumentar a escala para um modelo mais capaz.

    • Monitore o impacto da mudança de modelos em key métricas como qualidade de resposta, latência e custo para garantir que o senhor esteja atingindo o equilíbrio certo para os requisitos do seu caso de uso específico.

  3. Otimizar os parâmetros do modelo

    • Faça experiências com diferentes configurações de parâmetros para encontrar o equilíbrio ideal entre qualidade de resposta, diversidade e coerência. Por exemplo, o ajuste da temperatura pode controlar a aleatoriedade do texto gerado, enquanto max_tokens pode limitar o comprimento da resposta.

    • O senhor deve estar ciente de que as configurações ideais dos parâmetros podem variar de acordo com a tarefa específica, o prompt e o estilo de saída desejado. Testar e refinar iterativamente essas configurações com base na avaliação das respostas geradas.

  4. Ajuste fino específico da tarefa

    • Ao refinar o desempenho, considere o ajuste fino de modelos menores para subtarefas específicas dentro da cadeia de RAGs, como a compreensão de consultas.

    • Ao treinar modelos especializados para tarefas individuais com a cadeia RAG, o senhor pode potencialmente melhorar o desempenho geral, reduzir a latência e diminuir os custos de inferência em comparação com o uso de um único modelo grande para todas as tarefas.

  5. Pré-treinamento contínuo

    • Se o seu aplicativo RAG lidar com um domínio especializado ou exigir conhecimento que não esteja bem representado no LLM pré-treinado, considere a possibilidade de realizar um 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 sobre terminologia específica ou conceitos exclusivos do seu domínio. Por sua vez, isso pode reduzir a necessidade de uma extensa engenharia imediata ou de exemplos de poucos disparos.

Pós-processamento e barreiras de proteção

Depois que o LLM gera uma resposta, muitas vezes é necessário aplicar técnicas de pós-processamento ou guardrails para garantir que o resultado atenda aos requisitos de formato, estilo e conteúdo desejados. Esse último passo (ou vários passos) na cadeia pode ajudar a manter a consistência e a qualidade das respostas geradas. Se o senhor estiver implementando o pós-processamento e os guardrails, considere alguns dos seguintes itens:

  1. Aplicação do formato de saída

    • Dependendo do seu caso de uso, o senhor pode exigir que as respostas geradas sigam um formato específico, como um padrão estruturado ou um tipo de arquivo específico (como JSON, HTML, Markdown e assim por diante).

    • Se for necessária uma saída estruturada, bibliotecas como a Instructor ou a Outlines são bons pontos de partida para implementar esse tipo de validação.

    • Ao desenvolver, reserve um tempo para garantir que o passo a passo do pós-processamento seja flexível o suficiente para lidar com variações nas respostas geradas e, ao mesmo tempo, manter o formato exigido.

  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 vs. casual, conciso vs. detalhado), um passo de pós-processamento pode verificar e aplicar esses atributos de estilo nas respostas geradas.

  3. Filtros de conteúdo e grades de proteção

  4. Como lidar com as alucinações

    • A defesa contra alucinações também pode ser implementada como um passo pós-processamento. Isso pode envolver a referência cruzada do resultado gerado com documentos recuperados ou o uso de LLMs adicionais para validar a precisão factual da resposta.

    • Desenvolva mecanismos de fallback para lidar com casos em que a resposta gerada não atenda aos requisitos de precisão factual, como a geração de respostas alternativas ou o fornecimento de isenções de responsabilidade ao usuário.

  5. Tratamento de erros

    • Com todos os passos de pós-processamento, implemente mecanismos para lidar com os casos em que o passo encontra um problema ou não consegue gerar uma resposta satisfatória. Isso pode envolver a geração de uma resposta em default ou o encaminhamento do problema a um operador humano para análise manual.