RAG-Test / app.py
Nielo47's picture
Update space
339c369
raw
history blame
5.25 kB
from pathlib import Path
import ollama
import faiss
import gradio as gr
import numpy as np
import os
import glob
import pickle
print("Inicializando...")
# Função para carregar e processar o conhecimento
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}")
# Handle error appropriately, maybe exit or display an error in Gradio
raise SystemExit(f"Falha ao carregar recursos: {e}")
# Função para buscar contexto relevante
def buscar_contexto(pergunta, documentos, index, k=5):
"""Busca os k documentos mais relevantes para a pergunta."""
# Gera embedding para a pergunta usando o Ollama
response = ollama.embed(model="nomic-embed-text", input=pergunta)
query_embedding = np.array([response["embeddings"][0]], dtype=np.float32)
# Busca no índice FAISS
D, I = index.search(query_embedding, k)
return [documentos[i] for i in I[0]]
# Função para gerar resposta com o Ollama
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 com instruções detalhadas sobre CIF
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"]
# Função principal para a interface Gradio
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}")
# Handle error appropriately, maybe exit or display an error in Gradio
raise SystemExit(f"Falha ao carregar recursos: {e}")
# Configuração da interface Gradio
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.",
)
# Iniciar a interface
print("Gerando Interface...")
interface.launch(
server_name="0.0.0.0",
server_port=7860,
show_error=True,
debug=True,
) # optional, so you see any startup errors