Partilhar via


Melhorar a qualidade do pipeline de dados RAG

Este artigo discute como experimentar opções de pipeline de dados de um ponto de vista prático na implementação de alterações de pipeline de dados.

Principais componentes do pipeline de dados

Diagrama do pipeline de dados e botões de qualidade.

A base de qualquer aplicativo RAG com dados não estruturados é o pipeline de dados. Esse pipeline é responsável por preparar os dados não estruturados em um formato que possa ser efetivamente utilizado pelo aplicativo RAG. Embora esse pipeline de dados possa se tornar arbitrariamente complexo, a seguir estão os principais componentes que você precisa pensar ao criar seu aplicativo RAG pela primeira vez:

  1. Composição do corpus: Selecionar as fontes de dados e o conteúdo corretos com base no caso de uso específico.
  2. Análise: Extração de informações relevantes dos dados brutos usando técnicas de análise apropriadas.
  3. Fragmentação: Dividir os dados analisados em partes menores e gerenciáveis para uma recuperação eficiente.
  4. Incorporação: Converter os dados de texto em partes em uma representação vetorial numérica que captura seu significado semântico.

Composição do corpus

Sem o corpus de dados correto, seu aplicativo RAG não pode recuperar as informações necessárias para responder a uma consulta do usuário. Os dados certos dependem inteiramente dos requisitos e objetivos específicos do seu aplicativo, tornando crucial dedicar tempo para entender as nuances dos dados disponíveis (consulte a seção de coleta de requisitos para obter orientação sobre isso).

Por exemplo, ao criar um bot de suporte ao cliente, você pode considerar incluir:

  • Documentos da base de dados de conhecimento
  • Perguntas mais frequentes (FAQ)
  • Manuais e especificações do produto
  • Guias de resolução de problemas

Envolva especialistas de domínio e partes interessadas desde o início de qualquer projeto para ajudar a identificar e selecionar conteúdo relevante que possa melhorar a qualidade e a cobertura do seu corpus de dados. Eles podem fornecer informações sobre os tipos de consultas que os usuários provavelmente enviarão e ajudar a priorizar as informações mais importantes a serem incluídas.

A Analisar

Depois de identificar as fontes de dados para seu aplicativo RAG, a próxima etapa é extrair as informações necessárias dos dados brutos. Esse processo, conhecido como análise, envolve a transformação dos dados não estruturados em um formato que pode ser efetivamente utilizado pelo aplicativo RAG.

As técnicas e ferramentas de análise específicas que você usa dependem do tipo de dados com os quais você está trabalhando. Por exemplo:

  • Documentos de texto (PDFs, documentos do Word): Bibliotecas prontas para uso, como não estruturadas e PyPDF2 , podem lidar com vários formatos de arquivo e fornecer opções para personalizar o processo de análise.
  • Documentos HTML: bibliotecas de análise HTML como BeautifulSoup podem ser usadas para extrair conteúdo relevante de páginas da web. Com eles, você pode navegar pela estrutura HTML, selecionar elementos específicos e extrair o texto ou atributos desejados.
  • Imagens e documentos digitalizados: As técnicas de Reconhecimento Ótico de Caracteres (OCR) são normalmente necessárias para extrair texto de imagens. As bibliotecas OCR populares incluem Tesseract, Amazon Textract, Azure AI Vision OCR e Google Cloud Vision API.

Práticas recomendadas para análise de dados

Ao analisar seus dados, considere as seguintes práticas recomendadas:

  1. Limpeza de dados: pré-processe o texto extraído para remover qualquer informação irrelevante ou barulhenta, como cabeçalhos, rodapés ou caracteres especiais. Esteja ciente de reduzir a quantidade de informações desnecessárias ou malformadas que sua cadeia RAG precisa processar.
  2. Tratamento de erros e exceções: implemente mecanismos de tratamento e registro de erros para identificar e resolver quaisquer problemas encontrados durante o processo de análise. Isso ajuda você a identificar e corrigir problemas rapidamente. Isso geralmente aponta para problemas a montante com a qualidade dos dados de origem.
  3. Personalização da lógica de análise: Dependendo da estrutura e do formato dos dados, talvez seja necessário personalizar a lógica de análise para extrair as informações mais relevantes. Embora possa exigir esforço adicional antecipadamente, invista tempo para fazer isso, se necessário, muitas vezes evita muitos problemas de qualidade a jusante.
  4. Avaliação da qualidade da análise: avalie regularmente a qualidade dos dados analisados revisando manualmente uma amostra da saída. Isso pode ajudá-lo a identificar quaisquer problemas ou áreas a serem melhoradas no processo de análise.

Fragmentação

Diagrama de dados do documento sendo fragmentados para o índice vetorial.

Depois de analisar os dados brutos em um formato mais estruturado, a próxima etapa é dividi-los em unidades menores e gerenciáveis chamadas partes. A segmentação de documentos grandes em partes menores e semanticamente concentradas garante que os dados recuperados se encaixem no contexto do LLM, minimizando a inclusão de informações perturbadoras ou irrelevantes. As escolhas feitas no chunking afetarão diretamente os dados recuperados que o LLM é fornecido, tornando-o uma das primeiras camadas de otimização em um aplicativo RAG.

Ao fragmentar seus dados, considere os seguintes fatores:

  1. Estratégia de fragmentação: o método usado para dividir o texto original em partes. Isso pode envolver técnicas básicas, como a divisão por frases, parágrafos ou contagens específicas de caracteres/tokens, até estratégias mais avançadas de divisão específicas de documentos.
  2. Tamanho do bloco: blocos menores podem se concentrar em detalhes específicos, mas perdem algumas informações ao redor. Partes maiores podem capturar mais contexto, mas também podem incluir informações irrelevantes.
  3. Sobreposição entre partes: para garantir que informações importantes não sejam perdidas ao dividir os dados em partes, considere incluir alguma sobreposição entre partes adjacentes. A sobreposição pode garantir a continuidade e a preservação do contexto entre partes.
  4. Coerência semântica: Quando possível, procure criar partes que sejam semanticamente coerentes, o que significa que contêm informações relacionadas e podem manter-se por si só como uma unidade significativa de texto. Isso pode ser alcançado considerando a estrutura dos dados originais, como parágrafos, seções ou limites de tópicos.
  5. Metadados: Incluir metadados relevantes em cada bloco, como o nome do documento de origem, o título da seção ou os nomes dos produtos, pode melhorar o processo de recuperação. Essas informações adicionais no bloco podem ajudar a fazer corresponder consultas de recuperação a partes.

Estratégias de fragmentação de dados

Encontrar o método de fragmentação certo é iterativo e dependente do contexto. Não existe uma abordagem única; O tamanho e o método ideais do bloco dependerão do caso de uso específico e da natureza dos dados que estão sendo processados. Em termos gerais, as estratégias de fragmentação podem ser vistas da seguinte forma:

  • Fragmentação de tamanho fixo: divida o texto em partes de um tamanho predeterminado, como um número fixo de caracteres ou tokens (por exemplo, LangChain CharacterTextSplitter). Embora a divisão por um número arbitrário de caracteres/tokens seja rápida e fácil de configurar, normalmente não resultará em partes consistentes semanticamente coerentes.
  • Fragmentação baseada em parágrafo: use os limites de parágrafo naturais no texto para definir blocos. Esse método pode ajudar a preservar a coerência semântica das partes, já que os parágrafos geralmente contêm informações relacionadas (por exemplo, LangChain RecursiveCharacterTextSplitter).
  • Fragmentação específica do formato: Formatos como markdown ou HTML têm uma estrutura inerente dentro deles que pode ser usada para definir limites de bloco (por exemplo, cabeçalhos de markdown). Ferramentas como MarkdownHeaderTextSplitter da LangChain ou divisores baseados em seção de cabeçalho/HTML podem ser usados para essa finalidade.
  • Fragmentação semântica: técnicas como modelagem de tópicos podem ser aplicadas para identificar seções semanticamente coerentes dentro do texto. Essas abordagens analisam o conteúdo ou a estrutura de cada documento para determinar os limites de partes mais apropriados com base em mudanças no tópico. Embora mais envolvido do que abordagens mais básicas, o agrupamento semântico pode ajudar a criar blocos mais alinhados com as divisões semânticas naturais no texto (veja LangChain SemanticChunker para um exemplo disso).

Exemplo: Fragmentação de tamanho fixo

Imagem mostrando um exemplo de fragmentação de tamanho fixo de um documento.

Exemplo de fragmentação de tamanho fixo usando RecursiveCharacterTextSplitter de LangChain com chunk_size=100 e chunk_overlap=20. ChunkViz fornece uma maneira interativa de visualizar como diferentes tamanhos de blocos e valores de sobreposição de blocos com os divisores de caracteres de Langchain afetam os blocos resultantes.

Modelo de incorporação

Diagrama de como os blocos de dados são vetorizados com base no significado semântico.

Depois de fragmentar os dados, a próxima etapa é converter os blocos de texto em uma representação vetorial usando um modelo de incorporação. Um modelo de incorporação é usado para converter cada bloco de texto em uma representação vetorial que captura seu significado semântico. Ao representar blocos como vetores densos, as incorporações permitem a recuperação rápida e precisa dos blocos mais relevantes com base em sua semelhança semântica com uma consulta de recuperação. No momento da consulta, a consulta de recuperação será transformada usando o mesmo modelo de incorporação que foi usado para incorporar partes no pipeline de dados.

Ao selecionar um modelo de incorporação, considere os seguintes fatores:

  • Escolha do modelo: cada modelo de incorporação tem suas nuances, e os benchmarks disponíveis podem não capturar as características específicas dos seus dados. Experimente diferentes modelos de incorporação prontos para uso, mesmo aqueles que podem ser classificados de forma inferior em tabelas de classificação padrão, como MTEB. Alguns exemplos a considerar incluem:
  • Max tokens: esteja ciente do limite máximo de tokens para o modelo de incorporação escolhido. Se você passar por partes que excedam esse limite, elas serão truncadas, potencialmente perdendo informações importantes. Por exemplo, bge-large-en-v1.5 tem um limite máximo de token de 512.
  • Tamanho do modelo: modelos de incorporação maiores geralmente oferecem melhor desempenho, mas exigem mais recursos computacionais. Estabeleça um equilíbrio entre desempenho e eficiência com base no seu caso de uso específico e nos recursos disponíveis.
  • Ajuste fino: se seu aplicativo RAG lida com linguagem específica do domínio (por exemplo, siglas ou terminologia interna da empresa), considere ajustar o modelo de incorporação em dados específicos do domínio. Isso pode ajudar o modelo a capturar melhor as nuances e a terminologia do seu domínio específico e, muitas vezes, pode levar a um melhor desempenho de recuperação.