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
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:
Composição do corpus: Selecionar a fonte de dados e o conteúdo corretos com base no caso de uso específico.
Análise: Extrair informações relevantes do uso de dados brutos com técnicas de análise apropriadas.
Fragmentação: Divida os dados analisados em partes menores e gerenciáveis para uma recuperação eficiente.
Incorporação: convertendo os dados de texto fragmentados 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 totalmente dos requisitos e objetivos específicos de seu aplicativo, o que torna 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 conhecimento
Perguntas frequentes (FAQs)
manuais e especificações do produto
Guia de solução de problemas
Envolva especialistas do 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 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 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 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, você pode navegar pela estrutura HTML, selecionar elementos específicos e extrair o texto ou os atributos desejados.
Imagens e documentos digitalizados: técnicas de reconhecimento óptico de caracteres (OCR) geralmente 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 analisar dados
Ao analisar seus dados, considere as seguintes práticas recomendadas:
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.
Tratamento de erros e exceções: implemente mecanismos de gerenciamento 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. Fazer isso geralmente indica problemas iniciais com a qualidade dos dados de origem.
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 mais esforço inicial, invista tempo para fazer isso, se necessário. Isso geralmente evita muitos problemas de qualidade posteriores.
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 de melhoria no processo de análise.
Desfragmentando
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, o que o torna uma das primeiras camadas de otimização em um aplicativo RAG.
Ao agrupar seus dados, considere os seguintes fatores:
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.
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.
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 em todos os blocos.
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.
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 é tanto iterativo quanto dependente do contexto. Não existe uma abordagem única para todos; 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 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.
Separação baseada em parágrafos: use os limites naturais do parágrafo no texto para definir partes. 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).
Fragmentação específica de formato: formatos como markdown ou HTML têm uma estrutura inerente que pode ser usada para definir limites de fragmentos (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.
Fragmentação semântica: técnicas como modelagem de tópicos podem ser aplicadas para identificar seções semanticamente coerentes no texto. Essas abordagens analisam o conteúdo ou a estrutura de cada documento para determinar os limites de partes mais apropriados com base nas mudanças no 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: fragmentação de tamanho fixo
Exemplo de fragmentação de tamanho fixo usando o RecursiveCharacterTextSplitter da LangChain com chunk_size=100
e chunk_overlap=20
. O ChunkViz fornece uma maneira interativa de visualizar como os diferentes tamanhos e valores de sobreposição de blocos com os divisores de caracteres do Langchain afetam os blocos resultantes.
Modelo de incorporação
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 partes como vetores densos, as incorporações permitem uma recuperação rápida e precisa das partes 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. Experimente diferentes modelos de incorporação prontos para uso, mesmo aqueles que podem ter uma 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 seu aplicativo RAG lida com linguagem específica de domínio (por exemplo, acrônimos 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 de seu domínio específico e, muitas vezes, pode levar a um melhor desempenho de recuperação.