File size: 4,775 Bytes
aabd32c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import streamlit as st
import os
import logging
from processingPdf.loader import get_layout_extractor
from processingPdf.logicSections import extract_logical_sections
from processingPdf.chunker import split_sections_into_chunks
from processingPdf.indexer import Indexer
from db.graph_db import GraphDB
from dotenv import load_dotenv

# Importazione del workflow LangGraph
from agentLogic.graph import app as rag_app

# Configurazione Logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

load_dotenv()

st.set_page_config(page_title="RAG Chatbot - PDF", layout="wide")

# Inizializzazione componenti nel session_state
if "indexer" not in st.session_state:
    st.session_state.indexer = Indexer()
if "layout_extractor" not in st.session_state:
    st.session_state.layout_extractor = get_layout_extractor()
if "chat_history" not in st.session_state:
    st.session_state.chat_history = []
if "pdf_ready" not in st.session_state:
    st.session_state.pdf_ready = False

st.title("RAG Chatbot")
st.markdown("Carica un PDF per indicizzarlo su Neo4j e iniziare a chattare.")

# --- SIDEBAR: CARICAMENTO E INDICIZZAZIONE ---
with st.sidebar:
    st.header("Profilo Utente")
    
    user_name_input = st.text_input("Ciao! Inserisci il tuo nome/nickname", placeholder="es. Laura")
    user_id_clean = user_name_input.strip().lower().replace(" ", "_")
    
    if not user_id_clean:
        st.warning("Inserisci un nome utente per procedere.")
    else:
        st.success(f"Loggato come: {user_id_clean}")
    
    st.divider()
    st.header("Caricamento PDF")
    uploaded_file = st.file_uploader("Scegli un file PDF", type="pdf")
    
    if uploaded_file is not None and user_id_clean:
        if st.button("Indicizza Documento"):
            with st.spinner("Elaborazione in corso..."):
                try:
                    file_bytes = uploaded_file.getvalue()
                    filename = uploaded_file.name
                    
                    doc = st.session_state.layout_extractor(file_bytes)
                    sections = extract_logical_sections(doc)
                    chunks = split_sections_into_chunks(sections, filename)
                    
                    st.session_state.indexer.index_chunks_to_neo4j(filename, chunks, user_id_clean)
                    
                    st.success(f"Ottimo {user_id_clean}! {len(chunks)} chunk indicizzati con successo.")
                    st.session_state.pdf_ready = True
                    st.session_state.current_user = user_id_clean
                except Exception as e:
                    st.error(f"Errore durante l'indicizzazione: {e}")
                    logger.error(f"Errore: {e}", exc_info=True)

# --- AREA CHAT ---
st.divider()

# Visualizzazione cronologia
for message in st.session_state.chat_history:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

# Input utente
if prompt := st.chat_input("Fai una domanda sul documento..."):
    st.session_state.chat_history.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.markdown(prompt)

    with st.chat_message("assistant"):
        response_placeholder = st.empty()
        
        if not st.session_state.pdf_ready:
            full_response = "Per favore, carica e indicizza un PDF prima di iniziare la chat."
            response_placeholder.markdown(full_response)
        else:
            with st.spinner("Ricerca e generazione risposta in corso..."):
                try:
                    # Preparazione dello stato iniziale per il grafo
                    initial_state = {
                        "query": prompt,
                        "user_id": st.session_state.current_user,
                        "filename": uploaded_file.name,
                        "intent_data": {},
                        "context_chunks": [],
                        "final_answer": ""
                    }
                    
                    # Esecuzione del workflow LangGraph
                    # Usiamo invoke per ottenere il risultato finale dopo che tutti i nodi sono stati processati
                    result = rag_app.invoke(initial_state)
                    
                    full_response = result.get("final_answer", "Non sono riuscito a generare una risposta.")
                    response_placeholder.markdown(full_response)
                    
                except Exception as e:
                    full_response = f"Errore durante l'elaborazione della domanda: {e}"
                    response_placeholder.error(full_response)
                    logger.error(f"Errore Chat: {e}", exc_info=True)
        
        st.session_state.chat_history.append({"role": "assistant", "content": full_response})