Como melhorar o desempenho do seu pipeline RAG
Com a crescente popularidade das aplicações Retrieval Augmented Generation(RAG), existe uma preocupação crescente em melhorar o seu desempenho. Este artigo apresenta todas as formas possíveis de otimizar os pipelines RAG e fornece ilustrações correspondentes para o ajudar a compreender rapidamente as principais estratégias de otimização RAG.
É importante observar que forneceremos apenas uma exploração de alto nível dessas estratégias e técnicas, concentrando-nos em como elas se integram a um sistema RAG. No entanto, não entraremos em detalhes intrincados nem o orientaremos na implementação passo a passo.
Um pipeline RAG padrão
O diagrama abaixo mostra o pipeline RAG mais simples e simples. Em primeiro lugar, os blocos de documentos são carregados num armazenamento de vectores (como o Milvus ou o Zilliz cloud). Em seguida, o armazém de vectores recupera os Top-K fragmentos mais relevantes relacionados com a consulta. Estes fragmentos relevantes são então injectados no prompt de contexto do LLM e, finalmente, o LLM devolve a resposta final.
Vários tipos de técnicas de melhoramento das RAG
Podemos classificar diferentes abordagens de melhoramento das RAG com base nas suas funções nas fases do processo das RAG.
- Melhoria da consulta: Modificar e manipular o processo de consulta da entrada do RAG para melhor expressar ou processar a intenção da consulta.
- Melhoria da indexação: Otimizar a criação de índices de chunking utilizando técnicas como o multi-chunking, a indexação por etapas ou a indexação multi-vias.
- Melhoria do recuperador: Aplicação de técnicas e estratégias de otimização durante o processo de recuperação.
- Melhoria do gerador: Ajustar e otimizar os prompts durante a montagem dos prompts para o LLM, de modo a fornecer melhores respostas.
- Melhoria do RAG Pipeline: Mudança dinâmica de processos dentro de todo o pipeline do RAG, incluindo a utilização de agentes ou ferramentas para otimizar as principais etapas do pipeline do RAG.
De seguida, apresentamos os métodos específicos de cada uma destas categorias.
Aprimoramento de consultas
Vamos explorar quatro métodos eficazes para melhorar a sua experiência de consulta: Perguntas hipotéticas, Embeddings de documentos hipotéticos, Subconsultas e Prompts de retrocesso.
Criando perguntas hipotéticas
A criação de perguntas hipotéticas envolve a utilização de um LLM para gerar várias perguntas que os utilizadores podem fazer sobre o conteúdo de cada fragmento de documento. Antes que a consulta real do utilizador chegue ao LLM, o armazenamento de vectores recupera as perguntas hipotéticas mais relevantes relacionadas com a consulta real, juntamente com os pedaços de documentos correspondentes, e encaminha-os para o LLM.
Esta metodologia contorna o problema da assimetria entre domínios no processo de pesquisa vetorial, envolvendo-se diretamente em pesquisas de pergunta para pergunta, aliviando a carga sobre as pesquisas vectoriais. No entanto, introduz uma sobrecarga adicional e incerteza na geração de perguntas hipotéticas.
HyDE (Hypothetical Document Embeddings)
HyDE significa Hypothetical Document Embeddings. Utiliza um LLM para criar um "documento hipotético" ou uma resposta falsa em resposta a uma pergunta do utilizador desprovida de informações contextuais. Esta resposta falsa é então convertida em embeddings vectoriais e utilizada para consultar os pedaços de documentos mais relevantes numa base de dados vetorial. Subsequentemente, a base de dados vetorial recupera os K blocos de documentos mais relevantes e transmite-os ao LLM e à consulta original do utilizador para gerar a resposta final.
Este método é semelhante à técnica da pergunta hipotética na abordagem da assimetria entre domínios nas pesquisas vectoriais. No entanto, também tem desvantagens, como os custos computacionais adicionais e as incertezas da geração de respostas falsas.
Para mais informações, consulte o documento HyDE.
Criar subconsultas
Quando uma consulta do utilizador é demasiado complicada, podemos utilizar um LLM para a dividir em subconsultas mais simples antes de as passar para a base de dados vetorial e para o LLM. Vejamos um exemplo.
Imagine que um utilizador pergunta:"Quais são as diferenças de caraterísticas entre o Milvus e o Zilliz Cloud?" Esta pergunta é bastante complexa e pode não ter uma resposta direta na nossa base de dados de conhecimentos. Para resolver esta questão, podemos dividi-la em duas subconsultas mais simples:
- Subconsulta 1: "Quais são as caraterísticas do Milvus?"
- Subconsulta 2: "Quais são as caraterísticas do Zilliz Cloud?"
Quando tivermos estas subconsultas, enviamo-las todas para a base de dados vetorial, depois de as convertermos em embeddings vectoriais. A base de dados vetorial encontra, então, os Top-K de documentos mais relevantes para cada subconsulta. Finalmente, o LLM usa esta informação para gerar uma resposta melhor.
Ao dividir a consulta do utilizador em subconsultas, tornamos mais fácil para o nosso sistema encontrar informações relevantes e fornecer respostas precisas, mesmo para perguntas complexas.
Criação de prompts de retrocesso
Outra forma de simplificar as consultas complexas do utilizador é através da criação de prompts de retrocesso. Esta técnica consiste em abstrair as perguntas complexas dos utilizadores em "perguntas de retorno"** utilizando um LLM. Em seguida, uma base de dados vetorial utiliza estas perguntas de retorno para obter os fragmentos de documentos mais relevantes. Por fim, o LLM gera uma resposta mais exacta com base nestes pedaços de documentos recuperados.
Vamos ilustrar esta técnica com um exemplo. Considere-se a seguinte pergunta, que é bastante complexa e não é fácil de responder diretamente:
Consulta original do utilizador: "Tenho um conjunto de dados com 10 mil milhões de registos e quero armazená-lo no Milvus para consulta. É possível?"
Para simplificar esta consulta do utilizador, podemos utilizar um LLM para gerar uma pergunta de retorno mais simples:
Pergunta de retorno: "Qual é o limite de tamanho do conjunto de dados que o Milvus consegue suportar?"
Este método pode ajudar-nos a obter respostas melhores e mais precisas a perguntas complexas. Divide a pergunta original numa forma mais simples, tornando mais fácil para o nosso sistema encontrar informações relevantes e fornecer respostas precisas.
Melhoria da indexação
A melhoria da indexação é outra estratégia para melhorar o desempenho das suas aplicações RAG. Vamos explorar três técnicas de melhoria da indexação.
Fusão automática de blocos de documentos
Ao construir um índice, podemos empregar dois níveis de granularidade: pedaços filhos e seus pedaços pais correspondentes. Inicialmente, procuramos por pedaços filhos num nível mais fino de detalhe. Depois, aplicamos uma estratégia de fusão: se um número específico, n, de pedaços filhos dos primeiros k pedaços filhos pertencerem ao mesmo pedaço pai, fornecemos este pedaço pai ao LLM como informação contextual.
Esta metodologia foi implementada no LlamaIndex.
Construção de índices hierárquicos
Ao criar índices para documentos, podemos estabelecer um índice de dois níveis: um para resumos de documentos e outro para pedaços de documentos. O processo de pesquisa vetorial é composto por duas fases: inicialmente, filtramos os documentos relevantes com base no resumo e, posteriormente, recuperamos os pedaços de documentos correspondentes exclusivamente dentro desses documentos relevantes.
Esta abordagem revela-se vantajosa em situações que envolvem grandes volumes de dados ou instâncias em que os dados são hierárquicos, como a recuperação de conteúdos numa coleção de biblioteca.
Recuperação e reavaliação híbridas
A técnica de recuperação e reordenação híbridas integra um ou mais métodos de recuperação suplementares com a recuperação por semelhança de vectores. Em seguida, um reranker classifica os resultados recuperados com base na sua relevância para a consulta do utilizador.
Os algoritmos de recuperação suplementar mais comuns incluem métodos baseados na frequência lexical, como o BM25, ou grandes modelos que utilizam embeddings esparsos, como o Splade. Os algoritmos de reclassificação incluem RRF ou modelos mais sofisticados como o Cross-Encoder, que se assemelha a arquitecturas do tipo BERT.
Esta abordagem tira partido de diversos métodos de recuperação para melhorar a qualidade da recuperação e colmatar potenciais lacunas na recuperação de vectores.
Melhoria do recuperador
O aperfeiçoamento do componente recuperador do sistema RAG também pode melhorar as aplicações RAG. Vamos explorar alguns métodos eficazes para melhorar o recuperador.
Recuperação da janela de frases
Num sistema RAG básico, o fragmento de documento fornecido ao LLM é uma janela maior que engloba o fragmento de incorporação recuperado. Isto assegura que a informação fornecida ao LLM inclui uma gama mais alargada de detalhes contextuais, minimizando a perda de informação. A técnica de recuperação por janela de frase separa o fragmento de documento utilizado para a recuperação da incorporação do fragmento fornecido à LLM.
No entanto, a expansão do tamanho da janela pode introduzir informações adicionais de interferência. Podemos ajustar o tamanho da expansão da janela com base nas necessidades específicas da empresa.
Filtragem de metadados
Para garantir respostas mais precisas, podemos refinar os documentos recuperados filtrando metadados como tempo e categoria antes de os passar para o LLM. Por exemplo, se forem recuperados relatórios financeiros que abrangem vários anos, a filtragem baseada no ano pretendido irá refinar a informação para satisfazer requisitos específicos. Este método revela-se eficaz em situações com dados extensos e metadados detalhados, como a recuperação de conteúdos em colecções de bibliotecas.
Melhoria do gerador
Vamos explorar mais técnicas de otimização RAG, melhorando o gerador num sistema RAG.
Compressão do prompt LLM
A informação de ruído nos fragmentos de documentos recuperados pode afetar significativamente a precisão da resposta final do RAG. A janela limitada da mensagem nos LLMs também representa um obstáculo para respostas mais exactas. Para enfrentar este desafio, podemos comprimir pormenores irrelevantes, enfatizar parágrafos-chave e reduzir o comprimento total do contexto dos fragmentos de documentos recuperados.
Esta abordagem é semelhante ao método híbrido de recuperação e classificação anterior, em que um classificador é utilizado para selecionar os fragmentos de documentos irrelevantes.
Ajustar a ordem dos pedaços no prompt
No artigo "Lost in the middle", os investigadores observaram que os LLM ignoram frequentemente a informação no meio de determinados documentos durante o processo de raciocínio. Em vez disso, tendem a confiar mais na informação apresentada no início e no fim dos documentos.
Com base nesta observação, podemos ajustar a ordem dos pedaços recuperados para melhorar a qualidade da resposta: ao recuperar vários pedaços de conhecimento, os pedaços com confiança relativamente baixa são colocados no meio, e os pedaços com confiança relativamente alta são posicionados em ambas as extremidades.
Melhoria do pipeline RAG
Também podemos melhorar o desempenho das suas aplicações RAG, melhorando todo o pipeline RAG.
Autorreflexão
Esta abordagem incorpora o conceito de autorreflexão nos agentes de IA. Então, como é que esta técnica funciona?
Algumas partes de documentos Top-K recuperadas inicialmente são ambíguas e podem não responder diretamente à pergunta do utilizador. Nesses casos, podemos efetuar uma segunda ronda de reflexão para verificar se esses blocos podem realmente responder à pergunta.
Podemos efetuar a reflexão utilizando métodos de reflexão eficientes, como modelos de inferência de linguagem natural (NLI) ou ferramentas adicionais, como pesquisas na Internet para verificação.
Este conceito de autorreflexão foi explorado em vários documentos ou projectos, incluindo Self-RAG, Corrective RAG, LangGraph, etc.
Encaminhamento de consultas com um agente
Por vezes, não é necessário utilizar um sistema RAG para responder a perguntas simples, uma vez que isso pode resultar em mais mal-entendidos e inferências a partir de informação enganadora. Nesses casos, podemos utilizar um agente como encaminhador na fase de consulta. Este agente avalia se a consulta precisa de passar pela conduta RAG. Em caso afirmativo, é iniciada a conduta RAG subsequente; caso contrário, o LLM aborda diretamente a consulta.
O agente pode assumir várias formas, incluindo uma LLM, um pequeno modelo de classificação ou mesmo um conjunto de regras.
Ao encaminhar as consultas com base na intenção do utilizador, é possível redirecionar uma parte das consultas, o que leva a um aumento significativo do tempo de resposta e a uma redução notável do ruído desnecessário.
Podemos alargar a técnica de encaminhamento de consultas a outros processos do sistema RAG, como determinar quando utilizar ferramentas como pesquisas na Web, efetuar subconsultas ou pesquisar imagens. Esta abordagem garante que cada passo do sistema RAG é optimizado com base nos requisitos específicos da consulta, conduzindo a uma recuperação de informação mais eficiente e precisa.
Resumo
Embora um pipeline RAG básico possa parecer simples, a obtenção de um desempenho comercial ótimo requer frequentemente técnicas de otimização mais sofisticadas.
Este artigo resume várias abordagens populares para melhorar o desempenho das suas aplicações RAG. Também fornecemos ilustrações claras para ajudá-lo a entender rapidamente esses conceitos e técnicas e acelerar sua implementação e otimização.
Você pode obter as implementações simples das principais abordagens listadas neste artigo neste link do GitHub.