|
from pathlib import Path |
|
import ollama |
|
import faiss |
|
import gradio as gr |
|
import numpy as np |
|
import os |
|
import glob |
|
import pickle |
|
|
|
print("Inicializando...") |
|
|
|
|
|
|
|
def carregar_recursos_pre_calculados(): |
|
"""Carrega documentos e o índice FAISS pré-calculados.""" |
|
print("Carregando documentos e índice FAISS pré-calculados...") |
|
try: |
|
with open("documentos.pkl", "rb") as f: |
|
documentos = pickle.load(f) |
|
print(f"Documentos carregados: {len(documentos)} itens.") |
|
except FileNotFoundError: |
|
print("Erro: documentos.pkl não encontrado.") |
|
raise |
|
except Exception as e: |
|
print(f"Erro ao carregar documentos.pkl: {e}") |
|
raise |
|
|
|
try: |
|
index = faiss.read_index("faiss_index.idx") |
|
print(f"Índice FAISS carregado. Dimensão: {index.d}, Total de vetores: {index.ntotal}") |
|
except FileNotFoundError: |
|
print("Erro: faiss_index.idx não encontrado.") |
|
raise |
|
except Exception as e: |
|
print(f"Erro ao carregar faiss_index.idx: {e}") |
|
raise |
|
|
|
return documentos, index |
|
|
|
|
|
print("Carregando RAG pré-calculado...") |
|
try: |
|
documentos_global, index_global = carregar_recursos_pre_calculados() |
|
except Exception as e: |
|
print(f"Falha crítica ao carregar recursos pré-calculados: {e}") |
|
|
|
raise SystemExit(f"Falha ao carregar recursos: {e}") |
|
|
|
|
|
|
|
def buscar_contexto(pergunta, documentos, index, k=5): |
|
"""Busca os k documentos mais relevantes para a pergunta.""" |
|
|
|
response = ollama.embed(model="nomic-embed-text", input=pergunta) |
|
query_embedding = np.array([response["embeddings"][0]], dtype=np.float32) |
|
|
|
|
|
D, I = index.search(query_embedding, k) |
|
return [documentos[i] for i in I[0]] |
|
|
|
|
|
|
|
def gerar_resposta(frase_entrada, documentos, index): |
|
"""Gera uma resposta baseada no contexto recuperado.""" |
|
contexto = buscar_contexto(frase_entrada, documentos, index) |
|
contexto_str = "\n".join(contexto) |
|
|
|
|
|
prompt = f""" |
|
1. Identifique o **conceito significativo** da frase "XXXXXX", ou seja, o propósito ou a ideia central que ela expressa, independentemente de ser uma pergunta ou uma afirmação. |
|
2. Para determinar a vinculação de um termo específico com a Classificação Internacional de Funcionalidade (CIF), segundo Cieza et al., 2016, siga as diretrizes a seguir: |
|
3. Identifique se o termo pertence ao universo da CIF, de acordo com o documento anexado: |
|
- Se o termo é mencionado no arquivo anexado, anote isso. |
|
- Se o termo não aparece no arquivo anexado, classifique como "Não coberto." |
|
4. Verifique a relação do termo com os componentes da CIF: |
|
- Funções Corporais: Se o termo se relaciona com códigos iniciados pela letra “b” |
|
- Estruturas Corporais: Se o termo se relaciona com códigos iniciados pela letra “s” |
|
- Atividades e Participação: Se o termo se relaciona com códigos iniciados pela letra “d” |
|
- Fatores Ambientais: Se o termo se relaciona com códigos iniciados pela letra “e” |
|
5. Classifique o termo: Se o termo for mencionado na CIF e tiver vínculo com um dos componentes acima, identifique qual categoria ele pertence. |
|
Se o termo for mencionado na CIF, mas não tiver vínculo com nenhuma das categorias existentes, classifique como "Não Definido." |
|
|
|
**RAG**: |
|
{contexto_str} |
|
|
|
**Frase**: |
|
{frase_entrada} |
|
|
|
**Formato da Resposta**: |
|
- **Conceito**: [Descrição do conceito significativo] |
|
- **Código CIF**: [Código CIF + nomeclatura] |
|
- **Justificativa**: [Explicação baseada no RAG] |
|
""" |
|
resposta = ollama.generate(model="gemma3:1b", prompt=prompt) |
|
return resposta["response"] |
|
|
|
|
|
|
|
def interface_rag(frase_entrada): |
|
"""Função chamada pela interface Gradio.""" |
|
resposta = gerar_resposta(frase_entrada, documentos, index) |
|
return resposta |
|
|
|
|
|
print("Carregando RAG pré-calculado...") |
|
try: |
|
documentos, index = carregar_recursos_pre_calculados() |
|
except Exception as e: |
|
print(f"Falha crítica ao carregar recursos pré-calculados: {e}") |
|
|
|
raise SystemExit(f"Falha ao carregar recursos: {e}") |
|
|
|
|
|
interface = gr.Interface( |
|
fn=interface_rag, |
|
inputs=gr.Textbox(label="Digite sua frase", placeholder="Ex.: O que é função puberal?"), |
|
outputs=gr.Textbox(label="Resposta"), |
|
title="Sistema RAG para CIF", |
|
description="Pergunte algo sobre Funções Corporais, Estruturas Corporais, Atividades e Participação ou Fatores Ambientais com base na CIF.", |
|
) |
|
|
|
|
|
print("Gerando Interface...") |
|
|
|
interface.launch( |
|
server_name="0.0.0.0", |
|
server_port=7860, |
|
show_error=True, |
|
debug=True, |
|
) |
|
|