A ingestão é o processo de análise de informações de documentos de origem para que elas possam ser incorporadas em um espaço de pesquisa para recuperação posterior. Embora este seja um processo simples para texto simples, surgem complicações quando os documentos de origem estão em formatos que não são de "texto", por exemplo, Microsoft Word ou PDF e quando contêm formatação complexa, como cabeçalhos e rodapés repetidos, texto em várias colunas ou tabelas.
Esta seção contém dicas, técnicas, aceleradores e referências a recursos que ajudam a superar esses desafios.
Se você não possui conhecimentos técnicos, seus documentos são relativamente simples e você precisa de uma solução no-code, use o watsonx Orchestrate.
Se você é um usuário técnico, seus documentos são relativamente simples e você tem acesso ao Watson Discovery, comece a partir daí. O Watson Discovery tem uma IU agradável com necessidade mínima de programação. Para documentos complexos, você pode usar o watson discovery para anotar e extrair partes específicas de seus documentos, seja para o pipeline de back-end da RAG ou para front-end e destacar os textos, obtendo a posição exata de um parágrafo dentro de seus documentos.
No entanto, o Watson Discovery tem suas limitações. Se seus documentos tiverem mais de 50 MB, você não poderá carregá-los no Watson Discovery. Se o documento for muito complexo (ou seja, inclui tabelas aninhadas ou formatos de tabela irregulares), o Watson Discovery pode não capturar toda a estrutura do documento. Talvez você queira implementar um pipeline de ingestão de dados personalizado usando bibliotecas de código aberto para esses casos.
Com relação às bibliotecas de código aberto, o LangChain e o LlamaIndex são muito semelhantes em termos de recursos de ingestão de dados. No entanto, o LangChain seria mais fácil de usar do que o LlamaIndex em termos de documentação e integração com bancos de dados de vetores e outras aplicações. Tanto o LangChain quanto o LlamaIndex possuem funções auxiliares que podem converter um objeto Document de um para o outro, permitindo alternar entre LangChain e LlamaIndex em qualquer etapa do seu pipeline.
As notas a seguir incluem diversas lições aprendidas sobre a ingestão de documentos que contêm tabelas complexas e diferentes abordagens que foram testadas durante um dos projetos. Veja que algumas das observações podem ser diferentes de um trabalho para outro, mas a maioria das conclusões deve ser semelhante para trabalhos que incluem documentos com tabelas aninhadas e complexas.
O Watson Discovery não suporta documentos maiores que 50 MB. Nos casos em que o tamanho grande se deve ao fato de os documentos originais estarem no formato Word, precisamos converter os documentos do Word em PDF para usar o Watson Discovery. No entanto, usando essa abordagem, o Watson Discovery às vezes não consegue capturar formatos de tabela de forma adequada, especialmente em casos de tabelas complexas ou aninhadas.
Para ingestão usando o Watson Discovery, duas abordagens diferentes podem ser testadas: um modelo pré-treinado e um modelo de usuário treinado anotando manualmente algumas páginas por meio do Smart Document Understanding do Discovery. A seguir, são discutidas as lições aprendidas com essas duas abordagens em um dos projetos que envolvia tabelas aninhadas complexas.
Embora os resultados do Watson Discovery não tenham sido tão precisos quanto os de outras bibliotecas personalizadas mencionadas abaixo para tabelas complexas e aninhadas, os resultados incluíram muitos metadados, como números de página e coordenadas dos textos, que são úteis para exibir os destaques na IU. Esses metadados podem ser muito úteis para adicionar filtros extras durante a recuperação ou até mesmo para dividir os documentos com base em determinadas seções HTML.
A biblioteca PyMuPDF é muito mais rápida e gera resultados mais precisos, especialmente em dados maiores. Usando as duas funções a seguir em um conjunto de dados de 50,6 MB, foram necessários 0,131 segundos para o PyMuPDF contra 0,366 segundos para o PypdfLoader da LangChain. Portanto, para arquivos grandes e se você não quiser extrair seções separadas do documento como seções separadas, use a biblioteca PyMuPdf.
def pdf_to_text(path: str,Na tentativa de preservar a estrutura das tabelas, inserimos elementos de tabela extraídos de HTML (usando a biblioteca Unstructured) em um LLM (o Mixtral é uma boa opção para tabelas longas devido ao tamanho do seu contexto). Em seguida, podemos criar um prompt para resumir as tabelas ou usar few-shot learning para convertê-las em um formato que acreditamos ser mais compreensível para modelos de linguagem de grande porte.
Outras bibliotecas de leitura de tabelas, como Camelot e Tabula, também foram testadas; no entanto, essas bibliotecas não foram tão precisas quanto a Unstructured para tabelas complexas e, como apenas detectam tabelas dentro de um documento, pode ser necessário mais pré-processamento para criar segmentos significativos a serem enviados aos modelos de linguagem de grande porte.
Em resumo, embora o Watson Discovery seja uma maneira fácil e rápida de ingerir documentos e capturar muitos metadados adicionais que podem ser úteis na construção da IU (para destacar trechos, por exemplo), a biblioteca "unstructured" (que possui wrappers tanto no LlamaIndex quanto no LangChain) poderia capturar as tabelas complexas dentro dos documentos com mais precisão em comparação com o Watson Discovery. Portanto, uma combinação das duas abordagens pode ser útil para projetos que incluem tabelas complexas em seus documentos.
A ingestão sem uma interface gráfica do usuário pode ser difícil para os usuários corporativos, pois exige experiência e conhecimento técnico. O Watsonx Orchestrate elimina a frustração dos usuários corporativos ao implementar uma interface de usuário (IU) de arrastar e soltar. Ao clicar no botão azul de upload, é possível carregar e armazenar documentos diretamente no watsonx Discovery (também conhecido como Elasticsearch).
Isso permite que o usuário carregue diretamente sua documentação no Elasticsearch para criar sua própria base de conhecimento personalizada.
Em vez de ingerir diretamente os documentos no watsonx Discovery, você também tem a opção de se conectar ao Watson Discovery por meio do watsonx Orchestrate. Você pode encontrar mais detalhes sobre como fazer ingestão de dados por meio do Watson Discovery abaixo.
Uma das outras ferramentas internas que podem ser usadas para ingestão é o Watson Discovery. O Watson Discovery não é puramente uma ferramenta de ingestão e, com ele, você pode ingerir, normalizar, enriquecer e pesquisar seus dados não estruturados. A imagem abaixo mostra os principais componentes e recursos do Watson Discovery.
Como você pode ver acima, um dos principais recursos do Watson Discovery é a ingestão de dados estruturados e não estruturados em diferentes formatos, como JSON, HTML, PDF, Word e outros, além do Smart Document Understanding.
Se você tiver o Watson Discovery provisionado em seu ambiente, poderá ingerir documentos facilmente criando primeiro um projeto e, em seguida, uma coleção, onde será possível enviar seus dados a partir de um armazenamento local ou de um local na nuvem, como um object storage bucket.
Depois de criar a coleção, você pode acessar a guia Manage Collections (Gerenciar coleções) no menu hambúrguer, em Identity Fields (Campos de identidade) e escolher o método que deseja usar para processar os documentos.
Há três opções:
Pode demorar um pouco até que todos os seus documentos sejam processados. Depois disso, você poderá usar a API do Watson Discovery para ler e usar os dados em seu código.
Abaixo está um exemplo de código mostrando como você pode usar a API para ler os dados da sua coleção:
from langchain.docstore.document import DocumentAo criar um projeto no Watson Discovery, você pode planejar um rastreamento da web para buscar informações de uma URL específica. Tudo o que você precisa fazer é selecionar o Web Crawl ao selecionar a fonte de dados e, em seguida, especificar a URL e o cronograma do Crawl.
Depois disso, você pode executar as etapas mencionadas acima para gerenciar sua coleção e usar a API para ler os dados dela. Para ver mais detalhes sobre como configurar o Web Crawl no Watson Discovery, você pode assistir a este vídeo.
Para mais informações e funcionalidades, você pode consultar a página do desenvolvedor do Watson Discovery.
O Deep Search é o toolkit de código aberto da IBM Research para ingestão. O Deep Search aproveita métodos de IA de última geração para coletar, converter, enriquecer e vincular continuamente grandes coleções de documentos. Você pode usá-lo para documentos PDF públicos e proprietários.
O Deep Search converte documentos PDF não estruturados em arquivos JSON estruturados com precisão e facilidade. Ele permite que você automatize a extração de conhecimento, bem como faça o ajuste fino de seus modelos de base e grandes modelos de linguagem proprietários.
Você pode encontrar mais informações sobre Deep Search aqui.
O Deep Search pode ser uma boa ferramenta interna para ler documentos complexos no lugar de bibliotecas não estruturadas ou outras bibliotecas de código aberto. Você também pode encontrar uma excelente documentação no repositório, com diferentes tipos de exemplos em notebooks Python:
Notebooks de exemplo para Deep Search
O Deep Search oferece bons resultados ao extrair tabelas de PDFs no formato JSON.
Para os testes, utilizamos um documento PDF parcial do CIPP, que inclui três páginas, cada uma exibindo dados em forma de tabela. Neste caso, o melhor desempenho do RAG é obtido usando o Deep Search para extrair tabelas em formato JSON e, em seguida, convertê-las para HTML para uso no Watson Discovery / watsonx Discovery, em vez de usar PDFs diretamente, converter PDFs para HTML sem o Deep Search ou usar apenas o JSON do Deep Search no Watson Discovery / watsonx Discovery. Descobrimos que o Watson Discovery seleciona a resposta errada da célula errada na tabela em alguns casos, mas de forma mais rápida e, no mesmo caso, o Watson Discovery pode identificar a resposta exata dentro da grade da tabela.
O IBM Datacap é uma solução abrangente para captura de documentos e dados; oferecendo digitalização, classificação, reconhecimento, validação e exportação rápidos, precisos e econômicos de dados e imagens de documentos. Ele captura documentos, extrai dados relevantes e os integra aos processos de negócios subsequentes.
O Datacap obtém documentos em papel por meio de scanners, impressoras multifuncionais ou dispositivos móveis e importa documentos eletrônicos de sistemas de arquivos, fax ou servidores de e-mail. A ferramenta aprimora a extração de dados com funcionalidades de processamento de imagem, como correção de distorção e remoção de linhas, borrões e bordas.
O Datacap usa reconhecimento óptico de caracteres (OCR), reconhecimento inteligente de caracteres (ICR) para escrita à mão, reconhecimento óptico de marcas (OMR) para marcas e leitura de código de barras para extrair dados com eficiência.
Para obter instruções detalhadas de instalação e uso, consulte a documentação do IBM Datacap.
O LangChain é compatível com diferentes tipos de carregadores de documentos que carregam dados de uma fonte como o objeto Document do LangChain. Um objeto Document é um trecho de texto e metadados associados que podem ser facilmente usados para fragmentação e recuperação posteriormente no pipeline.
Atualmente, o LangChain é compatível com carregadores para carregar um diretório inteiro ou diferentes tipos de arquivos, como:
Você pode usar esses carregadores com poucas linhas de código Python. Por exemplo, para carregar um PDF, você pode usar o seguinte código:
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("example_data/layout-parser-paper.pdf")
pages = loader.load_and_split()
Consulte a documentação do LangChain para saber como usar esses carregadores.
Além dos mencionados no link acima, você pode encontrar carregadores adicionais que podem carregar dados diretamente de aplicações específicas, como e-mail, Github, Google Drive etc. Você pode encontrar a lista de todos os diferentes carregadores aqui.
Nos casos em que você tem documentos com estruturas, formatos e tabelas complexos, você pode usar os carregadores unstructured do LangChain. Esses carregadores utilizam internamente a biblioteca unstructured, que é uma das melhores bibliotecas para documentos complexos (em diferentes formatos, como PDF, MS Word, PowerPoint etc.) e para dividir os documentos em diferentes componentes: LangChain UnstructuredLoader
Semelhante ao LangChain, o LlamaIndex também é compatível com diferentes tipos de carregadores. Uma das maneiras simples de carregar dados usando o LlamaIndex é usar o SimpleDirectoryReader. O SimpleDirectoryReader é compatível com os seguintes tipos:
Você pode utilizar o SimpleDirectoryLoader com o seguinte trecho de código:
from llama_index.core import SimpleDirectoryReader reader = SimpleDirectoryReader(input_dir="path/to/directory") documents = reader.load_data()
Você também pode adicionar extensões específicas para ler somente essas extensões do diretório:
SimpleDirectoryReader( input_dir="path/to/directory", required_exts=[".pdf", ".docx"] )
Para obter mais detalhes sobre como usar os carregadores do LlamaIndex, consulte a documentação.
Assim como no Huggingface, você pode criar seus próprios carregadores personalizados ou usar os carregadores personalizados de outras pessoas no llamahub.ai.
No entanto, uma desvantagem do LlamaIndex em comparação com o LangChain é que a documentação e o suporte da comunidade não são tão bons quanto o do LangChain, portanto, depurar seu código pode ser mais difícil.
Nos casos em que você estiver carregando documentos complexos, você também pode usar diretamente a biblioteca Unstructured. A biblioteca Unstructured é muito boa para leitura e análise de tabelas.
A biblioteca Unstructured também é compatível com os wrappers LangChain e LlamaIndex, o que pode facilitar seu uso em pipelines RAG no futuro, já que criarão e retornarão automaticamente os objetos Document. No entanto, se o seu projeto precisar de mais personalização e você quiser usar diretamente a biblioteca unstructured, consulte a documentação a seguir: Unstructured.
Sara Golestaneh, Vicky Kuo, Fahad Bhutta, Luke Major, Dean Sacoransky, Chris Kirby
Atualizado em: 15 de novembro de 2024