Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anterior Revisão anterior
Próxima revisão
Revisão anterior
pres:gerti:servico_de_desenvolvimento_de_sistemas_de_informacao:projetos:iago-dataflow [27/05/2025 14:44] – [Extração de Dados] mfaquinopres:gerti:servico_de_desenvolvimento_de_sistemas_de_informacao:projetos:iago-dataflow [09/09/2025 22:51] (atual) mfaquino
Linha 6: Linha 6:
  
 O primeiro passo da pipeline é monitorar quando um documento deve ser indexado, para isso, diáriamente a pipeline monitora as tabelas do Oracle (TCE_GO.**PRO_SUMARIO**, TCE_GO.**PRO_AUTUACAO**), caso exista um novo doucmento, ele é enviado para execução da Pipeline. O primeiro passo da pipeline é monitorar quando um documento deve ser indexado, para isso, diáriamente a pipeline monitora as tabelas do Oracle (TCE_GO.**PRO_SUMARIO**, TCE_GO.**PRO_AUTUACAO**), caso exista um novo doucmento, ele é enviado para execução da Pipeline.
-<code>SELECT+<code> 
 +SELECT
   PS.PROSUM_ID AS ID,   PS.PROSUM_ID AS ID,
   PS.PROAUTU_ID AS PROAUTU_ID,   PS.PROAUTU_ID AS PROAUTU_ID,
Linha 25: Linha 26:
     AND CONTROL.DESC_STATUS = 'OK'     AND CONTROL.DESC_STATUS = 'OK'
 WHERE CONTROL.ID_PROCEDIMENTO IS NULL WHERE CONTROL.ID_PROCEDIMENTO IS NULL
-ORDER BY PS.DATA_CRIACAO_D DESC;+ORDER BY PS.DATA_CRIACAO_D DESC 
 +OFFSET 0 ROWS FETCH NEXT 10000 ROWS ONLY;
  
 </code> </code>
- 
  
 ==== Processamento de Dados ==== ==== Processamento de Dados ====
  
-Uma vez identificado quais documentos devem ser indexados, os mesmo devem ser enviados para processamento, o processamento consiste em etapas:+Uma vez identificado quais documentos devem ser indexados, os mesmo devem ser enviados para processamento, o processamento consiste em etapas:
  
   - Extração de Metadados   - Extração de Metadados
   - Extração do Documento/Texto e Geração de OCR   - Extração do Documento/Texto e Geração de OCR
   - Geração de Embeddings com o Texto do Documento   - Geração de Embeddings com o Texto do Documento
 +  - Cálculo de Tokens do Documento
 +  - Geração de Resumo do Documento
 +  - Geração de Resumo do Processo
  
 **Processamento de Metadados** **Processamento de Metadados**
  
-O processamento dos metadados é feito chamando a API do ETCE: [[https://api.etce.tce.gti.br/api/v1/Processo/consulta/extracao|https://api.etce.tce.gti.br/api/v1/Processo/consulta/extracao]]+O processamento dos metadados é feito chamando a API do ETCE: [[https://api-etce.tce.go.gov.br/api/v1/Processo/consulta/extracao|https://api-etce.tce.go.gov.br/api/v1/Processo/consulta/extracao]]
 <code> <code>
  
Linha 93: Linha 97:
 **Processamento de Texto e OCR** **Processamento de Texto e OCR**
  
-O processamento e extração do documento PDF do texto do documento é realizado pela API do ETCE: [[https://api.etce.tce.gti.br/api/v1/Processo/documento/extracao|https://api.etce.tce.gti.br/api/v1/Processo/documento/extracao]] & [[https://api.etce.tce.gti.br/api/v1/Processo/documento/extracao/download|https://api.etce.tce.gti.br/api/v1/Processo/documento/extracao/download]]+O processamento e extração do documento PDF do texto do documento é realizado pela API do ETCE: \\  \\ [[https://api-etce.tce.go.gov.br/api/v1/Processo/documento/extracao|https://api-etce.tce.go.gov.br/api/v1/Processo/documento/extracao]] & \\ 
 +[[https://api-etce.tce.go.gov.br/api/v1/Processo/documento/extracao/download|https://api-etce.tce.go.gov.br/api/v1/Processo/documento/extracao/download]]
 <code> <code>
  
Linha 111: Linha 116:
  
 Com o documento PDF recuperado, o mesmo é submetido a OCR pela API do Docling: [[http://gpu-server01.tce.go.gov.br:11000/extract_text_from_file|http://gpu-server01.tce.go.gov.br:11000/extract_text_from_file]] Com o documento PDF recuperado, o mesmo é submetido a OCR pela API do Docling: [[http://gpu-server01.tce.go.gov.br:11000/extract_text_from_file|http://gpu-server01.tce.go.gov.br:11000/extract_text_from_file]]
 +
 +**OBS: Antes de indexar o texto no elasticsearch, a pipeline verifica se o texto ou a OCR possui no mínimo 90% do texto legível. Caso contrário o documento não é indexado. O mesmo é salvo como um erro na tabela do controle, onde deve ser análisado manualmente, isso é feito para garantir que documentos com ruídos entre na base.**
  
 **Processamento de Embeddings** **Processamento de Embeddings**
  
 Com o texto extraido do OCR, os embeddings são gerados em chunks pelo mesmo modelo com finetunnig usado no legis **arturmatos/bge-ft-legis-full** Com o texto extraido do OCR, os embeddings são gerados em chunks pelo mesmo modelo com finetunnig usado no legis **arturmatos/bge-ft-legis-full**
 +<code>
 +
 +import torch
 +from transformers import AutoTokenizer, AutoModel
 +
 +# Detecta GPU, se disponível
 +device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
 +
 +# Carrega modelo e tokenizer
 +model_name = "arturmatos/bge-ft-legis-full"
 +tokenizer = AutoTokenizer.from_pretrained(model_name)
 +model = AutoModel.from_pretrained(model_name)
 +model.to(device)
 +model.eval()
 +
 +def get_cuda_embedding(texto: str):
 +    start = time.time()
 +    # Tokenização + envio para GPU
 +    inputs = tokenizer(texto, return_tensors="pt", truncation=True, padding=True).to(device)
 +
 +    with torch.no_grad():
 +        outputs = model(**inputs)
 +
 +    # Assume-se que os embeddings são extraídos da saída da última camada (hidden_states)
 +    # Aqui usamos o embedding do CLS token (posição 0)
 +    embeddings = outputs.last_hidden_state[:, 0, :]
 +
 +    # Opcional: normaliza o vetor
 +    embeddings = torch.nn.functional.normalize(embeddings, p=2, dim=1)
 +
 +    # Move para CPU e converte para numpy array
 +    return embeddings.squeeze().tolist()
 +
 +</code>
 +
 +**Cálculo de Tokens**
 +
 +Com o texto extraido do documento e OCR, é realizado o cálculo da quantidade de tokens presentes no texto usando o script a seguir e salvos no campo do elasticsearch **metainfo.tokens**:
 +
 +<code>
 +class DocUtils:
 +
 +@staticmethod
 +def count_tokens(text: str, model: str = "gpt-4") -> int:
 +    try:
 +        codificador = tiktoken.encoding_for_model(model)
 +    except KeyError:
 +        codificador = tiktoken.get_encoding("cl100k_base")
 +    tokens = codificador.encode(text)
 +    return len(tokens)
 +
 +</code>
 +
 +**Geração de Resumo do Documento**
 +
 +Com o texto extraido do documento e OCR, é realizado a geração de um resumo do documento e salvo no campo do elasticsearch **summary, **o resumo é feito utilizando uma LLM \\  \\ - GPT-4.1-mini atráves do serviço da [[:pres:gerti:servico_de_desenvolvimento_de_sistemas_de_informacao:projetos:openai|OpenAI]] do Azure \\
 +- llama3.3 atráves do [[https://ollama.tce.go.gov.br|https://ollama.tce.go.gov.br]]
 +
 +O seguinte prompt é utilizado para gerar o resumo:
 +<code>
 +
 +Você é um assistente especializado em análise documental no contexto de Tribunais de Contas. A seguir, será apresentado o conteúdo de um documento integrante de um processo.
 +
 +Sua tarefa é gerar um resumo claro, conciso e informativo, com no máximo 5 frases, mantendo uma linguagem formal, adequada ao contexto institucional.
 +
 +Identifique o documento e tipo
 +
 +Destaque o assunto principal ou objeto da análise
 +
 +Informe, se houver, qualquer conclusão, recomendação ou decisão relevante constante no documento
 +
 +Use linguagem objetiva e formal. Não copie trechos literais — reescreva com clareza e concisão.
 +
 +Importante: Retorne apenas o texto do resumo. Não inclua nenhuma frase introdutória, como “Resumo:” ou “Segue o resumo abaixo.”
 +
 +{document}
 +
 +</code>
 +
 +====   ====
 +
 +**Geração de Resumo do Processo**
 +
 +Após realizado o resumo dos documentos de um processo, é realizado a geração do resumo do processo usando os resumos de documentos, o resultado é salvo em cada registro de documento no campo do elasticsearch **process_summary, **o resumo é feito utilizando uma LLM \\  \\ - GPT-4.1-mini atráves do serviço da [[:pres:gerti:servico_de_desenvolvimento_de_sistemas_de_informacao:projetos:openai|OpenAI]] do Azure \\
 +- llama3.3 atráves do [[https://ollama.tce.go.gov.br|https://ollama.tce.go.gov.br]]
 +<code>
 +
 +O seguinte prompt é utilizado para gerar o resumo:
 +
 +Você é um assistente especializado em síntese de processos administrativos e de controle externo no contexto de Tribunais de Contas.
 +
 +A seguir, serão apresentados resumos de documentos que compõem um único processo. Cada resumo já contém informações estruturadas sobre tipo de documento, assunto e conclusões.
 +
 +Sua tarefa é gerar um resumo geral e coeso do processo, com no máximo 6 frases, que:
 +
 +Apresente o objetivo central do processo
 +
 +Destaque os principais temas tratados ao longo dos documentos
 +
 +Aponte as partes envolvidas, valores ou objetos auditados, se disponíveis
 +
 +Mencione conclusões, encaminhamentos ou decisões relevantes
 +
 +Regras obrigatórias:
 +
 +O texto gerado deve ser direto e coeso, com linguagem técnica, formal e objetiva
 +
 +Retorne apenas o texto do resumo. Não inclua frases introdutórias como "Resumo do Processo:", "Segue o resumo", "Síntese:" ou similares
 +
 +Não repita literalmente os resumos individuais dos documentos. Faça uma síntese integrada e fluida
 +
 +{documents}
 +
 +</code>
  
 ==== Carga de Dados ==== ==== Carga de Dados ====
Linha 120: Linha 241:
 Ao final o resultado do processamento é carregado no elasticsearch, o link para visualizar os documentos carregados é: [[https://elk.tce.go.gov.br/app/discover#/view/89d03c4d-9087-4644-9300-216e1eaea51b|https://elk.tce.go.gov.br/app/discover#/view/89d03c4d-9087-4644-9300-216e1eaea51b]] Ao final o resultado do processamento é carregado no elasticsearch, o link para visualizar os documentos carregados é: [[https://elk.tce.go.gov.br/app/discover#/view/89d03c4d-9087-4644-9300-216e1eaea51b|https://elk.tce.go.gov.br/app/discover#/view/89d03c4d-9087-4644-9300-216e1eaea51b]]
  
-{{https://projetos.tce.go.gov.br/attachments/download/20180/clipboard-202505220944-yfadg.png?nolink&1871x951}}+{{https://projetos.tce.go.gov.br/attachments/download/22171/clipboard-202507102050-q99zi.png?nolink&1876x940}}
  
 ==== Pipeline no Airflow ==== ==== Pipeline no Airflow ====
  
-Essa pipeline é orquestrada e executada periodicamente pelo Airflow, o link de acesso é: [[https://dataflow.tce.go.gov.br/dags/iago.autuacao/grid|https://dataflow.tce.go.gov.br/dags/iago.autuacao/grid]]+Essa pipeline é orquestrada e executada periodicamente pelo Airflow, o link de acesso é
 + 
 +Pipeline de Dados: [[https://dataflow.tce.go.gov.br/dags/iago.autuacao/grid|https://dataflow.tce.go.gov.br/dags/iago.autuacao/grid]] \\ 
 +Pipeline de Resumos: [[https://dataflow.tce.go.gov.br/dags/iago.autuacao.summary/grid|https://dataflow.tce.go.gov.br/dags/iago.autuacao.summary/grid]] 
 + 
 +{{https://projetos.tce.go.gov.br/attachments/download/20340/clipboard-202505271145-dbr3p.png?nolink&1863x951}} 
 + 
 +==== Processos Sigilosos ==== 
 + 
 +Diariamente é executado a pipeline de verificação de documentos sigilosos: [[https://dataflow.tce.go.gov.br/dags/iago.confidential/graph|https://dataflow.tce.go.gov.br/dags/iago.confidential/graph]] \\ 
 +A verificação é realizada executando a seguinte query no Oracle, que retorna todos os processos que atualmente são sigilosos: 
 +<code> 
 + 
 +SELECT 
 +   PROAUTU_ID AS PROAUTU_ID, 
 +   CODG_PROCESSO_N AS PROCESSO 
 +FROM TCE_GO.PRO_AUTUACAO 
 +WHERE INDR_BLOQUEIODOC_A IS NOT NULL 
 +ORDER BY PROAUTU_ID DESC 
 + 
 +</code> 
 + 
 +Caso seja encontrado algum desses processos no elasticsearch, o mesmo é removido da base ''iago-search-autuacao'' \\ Caso o documento se torne público posteriormente, o mesmo será incluido novamente na base pela pipeline de carga de dados diária. \\ **OBS: A atualização dos dados é assíncrona podendo levar algumas horas entre a mudança de status no Oracle e a exclusão no elasticsearch.**
  
-{{https://projetos.tce.go.gov.br/attachments/download/20189/clipboard-202505221043-p27yw.png?nolink&1851x886}}+Os logs dos processos removidos são registrados no próprio Airflow, sendo possível acompanhar periodicamente os documentos processados pelos administradores da ferramenta, ou usuários apenas leitores\\ A seguir um exemplo de log de um processo que foi removido por se tornar sigiloso: **202500047003283**
  
 +{{https://projetos.tce.go.gov.br/attachments/download/24324/clipboard-202509091945-472hj.png?nolink&1844x889}}
  
 ==== Tabela de Controle ==== ==== Tabela de Controle ====
  • pres/gerti/servico_de_desenvolvimento_de_sistemas_de_informacao/projetos/iago-dataflow.1748357051.txt.gz
  • Última modificação: 27/05/2025 14:44
  • por mfaquino