from setup.easy_imports import PyPDFLoader, RecursiveCharacterTextSplitter, Document from typing import List, Dict, Tuple, Optional from _utils.models.gerar_relatorio import ( DocumentChunk, ) import uuid class Splitter: def __init__( self, chunk_size, chunk_overlap, ): self.text_splitter = RecursiveCharacterTextSplitter( chunk_size=chunk_size, chunk_overlap=chunk_overlap ) self.chunk_metadata = {} # Store chunk metadata for tracing def load_and_split_document(self, pdf_path: str) -> List[DocumentChunk]: """Load PDF and split into chunks with metadata""" loader = PyPDFLoader(pdf_path) pages = ( loader.load() ) # Gera uma lista de objetos Document, sendo cada item da lista referente a UMA PÁGINA inteira do PDF. chunks = [] char_count = 0 for page in pages: text = page.page_content page_chunks = self.text_splitter.split_text( text ) # Quebra o item que é um Document de UMA PÁGINA inteira em um lista onde cada item é referente a um chunk, que são pedaços menores do que uma página. for chunk in page_chunks: chunk_id = str(uuid.uuid4()) start_char = text.find( chunk ) # Retorna a posição onde se encontra o chunk dentro da página inteira end_char = start_char + len(chunk) doc_chunk = DocumentChunk( # Gera o objeto do chunk com informações adicionais, como a posição e id do chunk content=chunk, page_number=page.metadata.get("page") + 1, # 1-based page numbering chunk_id=chunk_id, start_char=char_count + start_char, end_char=char_count + end_char, ) chunks.append(doc_chunk) # Store metadata for later retrieval self.chunk_metadata[chunk_id] = { "page": doc_chunk.page_number, "start_char": doc_chunk.start_char, "end_char": doc_chunk.end_char, } char_count += len(text) return chunks def load_and_split_text(self, text: str) -> List[DocumentChunk]: """Load Text and split into chunks with metadata - Criei essa função apenas para o ragas""" page = Document(page_content=text, metadata={"page": 1}) chunks = [] char_count = 0 text = page.page_content page_chunks = self.text_splitter.split_text( text ) # Quebra o item que é um Document de UMA PÁGINA inteira em um lista onde cada item é referente a um chunk, que são pedaços menores do que uma página. print("\n\n\n") print("page_chunks: ", page_chunks) for chunk in page_chunks: chunk_id = str(uuid.uuid4()) start_char = text.find( chunk ) # Retorna a posição onde se encontra o chunk dentro da página inteira end_char = start_char + len(chunk) doc_chunk = DocumentChunk( # Gera o objeto do chunk com informações adicionais, como a posição e id do chunk content=chunk, page_number=page.metadata.get("page") + 1, # 1-based page numbering chunk_id=chunk_id, start_char=char_count + start_char, end_char=char_count + end_char, ) chunks.append(doc_chunk) # Store metadata for later retrieval self.chunk_metadata[chunk_id] = { "page": doc_chunk.page_number, "start_char": doc_chunk.start_char, "end_char": doc_chunk.end_char, } char_count += len(text) return chunks