Melhorar a qualidade do pipeline de dados RAG

Este artigo discute como experimentar as opções de pipeline de dados de um ponto de vista prático na implementação de mudanças em 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 key componentes nos quais o senhor precisa pensar ao criar seu aplicativo RAG:

  1. Composição do corpus: Selecionar a fonte de dados e o conteúdo corretos com base no caso de uso específico.

  2. Análise: Extrair informações relevantes do uso de dados brutos com técnicas de análise apropriadas.

  3. Chunking: Dividir os dados analisados em partes menores e gerenciáveis para uma recuperação eficiente.

  4. Incorporação: Converter os dados de texto em pedaços em uma representação de vetor numérico que capture 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 corretos dependem inteiramente dos requisitos e objetivos específicos do seu aplicativo, o que torna crucial dedicar tempo para entender as nuances dos dados disponíveis (consulte a seção de levantamento de requisitos para obter orientação sobre isso).

Por exemplo, ao criar um bot de suporte ao cliente, o senhor pode considerar incluir:

  • Documentos da base de conhecimento

  • Perguntas frequentes (FAQs)

  • manuais e especificações do produto

  • Guia de soluçã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 de seu corpus de dados. Eles podem fornecer percepçõ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.

Análise

Depois de identificar a fonte de dados para seu aplicativo RAG, o próximo passo é 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 possa ser efetivamente utilizado pelo aplicativo RAG.

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

  • Documentos de texto (PDFs, documentos do Word): Bibliotecas prontas para uso, como a unstructured e a PyPDF2, podem lidar com vários formatos de arquivo e oferecer opções para personalizar o processo de análise.

  • Documentos HTML: A biblioteca de análise de HTML, como a BeautifulSoup, pode ser usada para extrair conteúdo relevante de páginas da Web. Com eles, o senhor pode navegar pela estrutura HTML, selecionar elementos específicos e extrair o texto ou os atributos desejados.

  • Imagens e documentos digitalizados: Normalmente, as técnicas de reconhecimento óptico de caracteres (OCR) são necessárias para extrair texto de imagens. As bibliotecas populares de OCR incluem Tesseract, Amazon Textract, Azure IA 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é-processar o texto extraído para remover qualquer informação irrelevante ou com ruído, como cabeçalhos, rodapés ou caracteres especiais. O senhor deve estar ciente da necessidade 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 o senhor a identificar e corrigir problemas rapidamente. Isso geralmente aponta para problemas de upstream com a qualidade dos dados de origem.

  3. Personalização da lógica de análise: Dependendo da estrutura e do formato dos seus dados, talvez seja necessário personalizar a lógica de análise para extrair as informações mais relevantes. Embora isso possa exigir um esforço adicional no início, invista tempo para fazer isso, se necessário - isso geralmente evita muitos problemas de qualidade posteriores.

  4. Avaliação da qualidade da análise: Avaliar regularmente a qualidade dos dados analisados, revisando manualmente uma amostra da saída. Isso pode ajudá-lo a identificar quaisquer problemas ou áreas de melhoria no processo de análise.

Chunking

Diagrama dos dados do documento que estão sendo divididos em pedaços para o índice vetorial.

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

Ao dividir seus dados em partes, considere os seguintes fatores:

  1. Estratégia de fragmentação: O método que o senhor usa 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: Pedaços menores podem se concentrar em detalhes específicos, mas perdem algumas informações ao redor. Os blocos maiores podem capturar mais contexto, mas também podem incluir informações irrelevantes.

  3. Sobreposição entre blocos: Para garantir que informações importantes não sejam perdidas ao dividir os dados em blocos, considere incluir alguma sobreposição entre os blocos adjacentes. A sobreposição pode garantir a continuidade e a preservação do contexto entre os blocos.

  4. Coerência semântica: Quando possível, procure criar blocos que sejam semanticamente coerentes, o que significa que eles contêm informações relacionadas e podem se manter sozinhos como uma unidade significativa de texto. Isso pode ser feito considerando a estrutura dos dados originais, como parágrafos, seções ou limites de tópicos.

  5. Metadados: A inclusão de 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 combinar as consultas de recuperação com os blocos.

Estratégias de fragmentação de dados

Encontrar o método de fragmentação correto é iterativo e depende do contexto. Não existe uma abordagem única para todos os casos; o tamanho e o método ideais dos pedaços 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 como as seguintes:

  • Divisão de tamanho fixo: Dividir 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, ela normalmente não resultará em blocos consistentes e semanticamente coerentes.

  • Agrupamento baseado em parágrafos: Usar os limites naturais dos parágrafos no texto para definir os blocos. Esse método pode ajudar a preservar a coerência semântica dos blocos, pois os parágrafos geralmente contêm informações relacionadas (por exemplo, LangChain RecursiveCharacterTextSplitter).

  • Chunking específico do formato: Formatos como markdown ou HTML têm uma estrutura inerente que pode ser usada para definir os limites dos blocos (por exemplo, cabeçalhos de markdown). Ferramentas como o MarkdownHeaderTextSplitter da LangChain ou divisores baseadosem cabeçalho/seção HTML podemser usados para essa finalidade.

  • Agrupamento semântico: Técnicas como a 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 blocos mais adequados com base nas mudanças de tópico. Embora mais complexo do que as abordagens mais básicas, o chunking semântico pode ajudar a criar pedaços mais alinhados com as divisões semânticas naturais do texto (consulte LangChain SemanticChunker para ver um exemplo disso).

Exemplo: Chunking de tamanho fixo

Imagem mostrando um exemplo de chunking de tamanho fixo de um documento.

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

Modelo de incorporação

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

Depois de dividir os dados em pedaços, o próximo passo é converter os pedaços de texto em uma representação vetorial usando um modelo de incorporação. Um modelo de incorporação é usado para converter cada pedaço de texto em uma representação vetorial que captura seu significado semântico. Ao representar os blocos como vetores densos, os embeddings 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 pedaços 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 de seus dados. Faça experiências com diferentes modelos de incorporação prontos para uso, mesmo aqueles que podem ter classificação inferior em tabelas de classificação padrão, como o MTEB. Alguns exemplos a serem considerados incluem:

  • Max tokens: Esteja ciente do limite máximo de tokens para o modelo de incorporação escolhido. Se o senhor passar pedaços que excedam esse limite, eles serão truncados, podendo perder informações importantes. Por exemplo, o bge-large-en-v1.5 tem um limite máximo de 512 tokens.

  • Tamanho do modelo: Modelos de incorporação maiores geralmente oferecem melhor desempenho, mas exigem mais recursos computacionais. Encontre um equilíbrio entre desempenho e eficiência com base em seu caso de uso específico e no recurso disponível.

  • Ajuste fino: Se o seu aplicativo RAG lida com linguagem específica do domínio (por exemplo, acrônimos ou terminologia interna da empresa), considere o ajuste fino do modelo de incorporação em dados específicos do domínio. Isso pode ajudar o modelo a capturar melhor as nuances e a terminologia de seu domínio específico e, muitas vezes, pode levar a um melhor desempenho de recuperação.