Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo descreve como criar um pipeline de dados não estruturados para aplicativos de IA de geração. Os pipelines não estruturados são particularmente úteis para aplicações de Geração Aumentada por Recuperação (RAG).
Saiba como converter conteúdo não estruturado, como arquivos de texto e PDFs, em um índice vetorial que agentes de IA ou outros recuperadores podem consultar. Você também aprende a experimentar e ajustar seu pipeline para otimizar o agrupamento, a indexação e a análise de dados, permitindo que você solucione problemas e experimente o pipeline para obter melhores resultados.
Bloco de anotações de pipeline de dados não estruturados
O bloco de anotações a seguir mostra como implementar as informações neste artigo para criar um pipeline de dados não estruturados.
Pipeline de dados não estruturados da Databricks
Principais componentes do fluxo de dados
A base de qualquer aplicativo RAG com dados não estruturados é o pipeline de dados. Esse pipeline é responsável pela curadoria e preparação dos dados não estruturados em um formato que o aplicativo RAG pode usar de forma eficaz.
Embora esse pipeline de dados possa se tornar complexo dependendo do caso de uso, a seguir estão os principais componentes que você precisa pensar ao criar seu aplicativo RAG pela primeira vez:
- Composição do corpus e ingestão: Selecione as fontes de dados e o conteúdo corretos com base no caso de uso específico.
-
Pré-processamento de dados: transforme dados brutos num formato limpo e consistente, adequado para integração e recuperação.
- Análise: Extrair informações relevantes dos dados brutos usando técnicas de análise apropriadas.
-
Enriquecimento: Enriqueça os dados com metadados adicionais e remova o ruído.
- Extração de metadados: Extraia metadados úteis para implementar uma recuperação de dados mais rápida e eficiente.
- Desduplicação: Analise os documentos para identificar e eliminar documentos duplicados ou quase duplicados.
- Filtragem: Elimine documentos irrelevantes ou indesejados da coleção.
- Chunking: Divida os dados analisados em partes menores e geríveis para uma recuperação eficiente.
- Incorporação: Converta os dados de texto segmentados numa representação vetorial numérica que capte o seu significado semântico.
- Indexação e armazenamento: Crie índices vetoriais eficientes para um desempenho de pesquisa otimizado.
Composição e ingestão do corpus
Seu aplicativo RAG não pode recuperar as informações necessárias para responder a uma consulta do usuário sem o corpus de dados correto. Os dados corretos dependem inteiramente dos requisitos e objetivos específicos do seu aplicativo, tornando crucial dedicar tempo para entender as nuances dos dados disponíveis. Para obter mais informações, consulte o fluxo de trabalho do desenvolvedor de aplicações de IA generativa em .
Por exemplo, ao criar um bot de suporte ao cliente, você pode considerar incluir o seguinte:
- Documentos da base de dados de conhecimento
- Perguntas mais frequentes (FAQs)
- 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 críticas a serem incluídas.
O Databricks recomenda que você ingira dados de forma escalável e incremental. O Azure Databricks oferece vários métodos para ingestão de dados, incluindo conectores totalmente gerenciados para aplicativos SaaS e integrações de API. Como prática recomendada, os dados brutos de origem devem ser ingeridos e armazenados em uma tabela de destino. Essa abordagem garante a preservação, rastreabilidade e auditoria de dados. Consulte Conectores padrão no Lakeflow Connect.
Pré-processamento de dados
Depois que os dados forem ingeridos, é essencial limpar e formatar os dados brutos em um formato consistente adequado para incorporação e recuperação.
Análise
Depois de identificar as fontes de dados apropriadas para seu aplicativo retriever, 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 o aplicativo RAG pode usar efetivamente.
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 e lxml podem ser usadas para extrair conteúdo relevante de páginas web. Essas bibliotecas podem ajudar a navegar na estrutura HTML, selecionar elementos específicos e extrair o texto ou os atributos desejados.
- Imagens e documentos digitalizados: técnicas de reconhecimento ótico de caracteres (OCR) são normalmente necessárias para extrair texto de imagens. As bibliotecas OCR populares incluem bibliotecas de código aberto, como Tesseract ou versões SaaS, como Amazon Textract, Azure AI Vision OCRe Google Cloud Vision API.
Práticas recomendadas para análise de dados
A análise garante que os dados estejam limpos, estruturados e prontos para a geração de incorporação e a Pesquisa Vetorial. Ao analisar seus dados, considere as seguintes práticas recomendadas:
- Limpeza de dados: Pré-processe o texto extraído para remover informações irrelevantes ou barulhentas, como cabeçalhos, rodapés ou caracteres especiais. Reduza a quantidade de informações desnecessárias ou malformadas que sua cadeia RAG precisa processar.
- 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 iniciais com a qualidade dos dados de origem.
- 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 um esforço adicional inicial, invista tempo para o fazer, se necessário, uma vez que muitas vezes evita muitos problemas de qualidade a jusante.
- 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.
Enriquecimento
Enriqueça os dados com metadados adicionais e remova o ruído. Embora o enriquecimento seja opcional, ele pode melhorar drasticamente o desempenho geral do seu aplicativo.
Extração de metadados
Gerar e extrair metadados que capturam informações essenciais sobre o conteúdo, o contexto e a estrutura do documento pode melhorar significativamente a qualidade e o desempenho de recuperação de um aplicativo RAG. Os metadados fornecem sinais adicionais que melhoram a relevância, permitem filtragem avançada e suportam requisitos de pesquisa específicos do domínio.
Embora bibliotecas como LangChain e LlamaIndex forneçam analisadores integrados capazes de extrair automaticamente metadados padrão associados, muitas vezes é útil complementar isso com metadados personalizados adaptados ao seu caso de uso específico. Essa abordagem garante que informações críticas específicas do domínio sejam capturadas, melhorando a recuperação e a geração a jusante. Você também pode usar modelos de linguagem grandes (LLMs) para automatizar o aprimoramento de metadados.
Os tipos de metadados incluem:
- Metadados no nível do documento: Nome do arquivo, URLs, informações do autor, carimbos de data/hora de criação e modificação, coordenadas GPS e controle de versão do documento.
- Metadados baseados em conteúdo: Palavras-chave extraídas, resumos, tópicos, entidades nomeadas e tags específicas de domínio (nomes de produtos e categorias como PII ou HIPAA).
- Metadados estruturais: cabeçalhos de seção, índice, números de página e limites de conteúdo semântico (capítulos ou subseções).
- Metadados contextuais: sistema de origem, data de ingestão, nível de sensibilidade dos dados, idioma original ou instruções transnacionais.
Armazenar metadados ao lado de documentos em partes ou suas incorporações correspondentes é essencial para um desempenho ideal. Ele também ajudará a restringir as informações recuperadas e melhorar a precisão e a escalabilidade do seu aplicativo. Além disso, a integração de metadados em pipelines de pesquisa híbridos, o que significa combinar pesquisa de semelhança vetorial com filtragem baseada em palavras-chave, pode aumentar a relevância, especialmente em grandes conjuntos de dados ou cenários de critérios de pesquisa específicos.
Desduplicação
Dependendo de suas fontes, você pode acabar com documentos duplicados ou quase duplicados. Por exemplo, se você extrair de uma ou mais unidades compartilhadas, várias cópias do mesmo documento poderão existir em vários locais. Algumas dessas cópias podem ter modificações sutis. Da mesma forma, sua base de conhecimento pode ter cópias da documentação do produto ou cópias de rascunho de postagens de blog. Se essas duplicatas permanecerem em seu corpus, você pode acabar com partes altamente redundantes em seu índice final que podem diminuir o desempenho do seu aplicativo.
Você pode eliminar algumas duplicatas usando apenas metadados. Por exemplo, se um item tiver o mesmo título e data de criação, mas várias entradas de fontes ou locais diferentes, você poderá filtrá-las com base nos metadados.
No entanto, isso pode não ser suficiente. Para ajudar a identificar e eliminar duplicatas com base no conteúdo dos documentos, você pode usar uma técnica conhecida como hashing sensível à localidade. Especificamente, uma técnica chamada MinHash funciona bem aqui, e uma implementação do Spark já está disponível no Spark ML. Ele funciona criando um hash para o documento com base nas palavras que contém e, em seguida, pode identificar eficientemente duplicados ou quase duplicados comparando esses hashes. A um nível muito elevado, trata-se de um processo em quatro etapas:
- Crie um vetor de características para cada documento. Se necessário, considere a aplicação de técnicas como remoção de palavras irrelevantes, derivação e lematização para melhorar os resultados e, em seguida, fazer a tokenização em n-gramas.
- Ajuste um modelo MinHash e faça o hash dos vetores usando MinHash para o cálculo da distância Jaccard.
- Execute uma associação de similaridade usando esses hashes para produzir um conjunto de resultados para cada documento duplicado ou quase duplicado.
- Filtre as duplicatas que não deseja manter.
Uma etapa de desduplicação básica pode selecionar arbitrariamente os documentos a serem mantidos (como o primeiro dos resultados de cada duplicata ou uma escolha aleatória entre as duplicatas). Uma melhoria potencial seria selecionar a "melhor" versão da duplicata usando outra lógica (como a atualização mais recente, o status da publicação ou a fonte mais autorizada). Além disso, note que pode ser necessário experimentar com a etapa de featurização e o número de tabelas de hash utilizadas no modelo MinHash para otimizar os resultados correspondentes.
Para obter mais informações, consulte a documentação do Spark para hashing sensível à localidade .
Filtragem
Alguns dos documentos que ingere no seu corpus podem não ser úteis para o seu agente, quer porque são irrelevantes para a sua finalidade, demasiado antigos ou pouco fiáveis, quer porque contêm conteúdo problemático, como linguagem prejudicial. Ainda assim, outros documentos podem conter informações confidenciais que você não deseja expor por meio de seu agente.
Portanto, considere incluir uma etapa em seu pipeline para filtrar esses documentos usando quaisquer metadados, como aplicar um classificador de toxicidade ao documento para produzir uma previsão que você pode usar como filtro. Outro exemplo seria a aplicação de um algoritmo de deteção de informações pessoalmente identificáveis (PII) aos documentos para filtrar documentos.
Por fim, todas as fontes de documentos que o utilizador introduzir no seu agente são potenciais vetores de ataque para que agentes maliciosos lancem ataques de envenenamento de dados. Você também pode considerar a adição de mecanismos de deteção e filtragem para ajudar a identificá-los e eliminá-los.
Fragmentação
Depois de analisar os dados brutos em um formato mais estruturado, remover duplicatas e filtrar informações indesejadas, 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 fornece, tornando-o uma das primeiras camadas de otimização em um aplicativo RAG.
Ao fragmentar 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, contagens específicas de caracteres/tokens e estratégias mais avançadas de divisão específicas de documentos.
- Tamanho do bloco: Blocos menores podem se concentrar em detalhes específicos, mas perdem algumas informações contextuais ao redor. Partes maiores podem capturar mais contexto, mas podem incluir informações irrelevantes ou ser computacionalmente caras.
- 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 e melhorar os resultados da recuperação.
- Coerência semântica: Quando possível, procure criar partes semanticamente coerentes que contenham informações relacionadas, mas que possam ser independentes 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.
- Metadados relevantes:, como o nome do documento de origem, o título da seção ou os nomes dos produtos, podem melhorar a recuperação da informação. Essas informações adicionais podem ajudar a fazer corresponder as consultas de recuperação aos segmentos.
Estratégias de fragmentação de dados
Encontrar o método de fragmentação adequado é iterativo e dependente do contexto. Não existe uma abordagem única. O tamanho e o método ideais do bloco dependem do caso de uso específico e da natureza dos dados que estão sendo processados. De um modo geral, 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. Essa abordagem raramente funciona para aplicativos de nível de produção.
- 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 dos blocos, 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 que pode 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 no 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 de tópico. Embora mais envolvido do que abordagens 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, por exemplo).
Exemplo: Fragmentação de tamanho fixo
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.
Incorporação
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 converte 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. A consulta de recuperação será transformada no momento da consulta usando o mesmo modelo de incorporação 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 nuances e os benchmarks disponíveis podem não capturar as características específicas dos seus dados. É crucial selecionar um modelo que tenha sido treinado em dados semelhantes. Também pode ser benéfico explorar quaisquer modelos de incorporação disponíveis que sejam projetados para tarefas específicas. Experimente diferentes modelos de incorporação disponíveis no mercado, mesmo aqueles que podem ter classificações inferiores em rankings padrão, como MTEB. Alguns exemplos a considerar:
- Max tokens: Saiba o 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 têm um desempenho melhor, mas exigem mais recursos computacionais. Com base no seu caso de uso específico e nos recursos disponíveis, você precisará equilibrar desempenho e eficiência.
- Ajuste fino: Se seu aplicativo RAG lida com linguagem específica do domínio (como 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.
Indexação e armazenamento
A próxima etapa do pipeline é criar índices nos embebimentos e nos metadados gerados nas etapas anteriores. Esta etapa envolve a organização de incorporações vetoriais de alta dimensão em estruturas de dados eficientes que permitem pesquisas de semelhança rápidas e precisas.
O Mosaic AI Vetor Search usa as técnicas de indexação mais recentes quando você implanta um ponto de extremidade e índice de pesquisa vetorial para garantir pesquisas rápidas e eficientes para suas consultas de pesquisa vetorial. Você não precisa se preocupar em testar e escolher as melhores técnicas de indexação.
Depois que o índice é criado e implantado, ele está pronto para ser armazenado em um sistema que oferece suporte a consultas escaláveis e de baixa latência. Para pipelines RAG em produção com grandes conjuntos de dados, use um banco de dados vetorial ou um serviço de pesquisa escalável para garantir baixa latência e alto desempenho. Armazene metadados adicionais juntamente com incorporações para permitir uma filtragem eficiente durante a recuperação.