File size: 4,171 Bytes
b4ae22d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
498ce53
b4ae22d
 
498ce53
b4ae22d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
498ce53
b4ae22d
 
 
 
 
 
 
 
 
 
 
 
498ce53
b4ae22d
 
 
 
 
498ce53
b4ae22d
 
 
 
 
498ce53
b4ae22d
 
 
 
 
 
 
 
 
 
 
 
498ce53
b4ae22d
 
 
 
498ce53
 
b4ae22d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import fitz  # PyMuPDF
from pdf_processor import read_pdf, process_chunks
from embedding import (
    embed_text_chunks,
    save_to_chroma_db,
    query_chroma_db,
    generate_document_id,
)
from llm_query import query_llm
from chroma_setup import initialize_client
import random
import uuid
from streamlit_pdf_viewer import pdf_viewer  # Visor de PDF integrado en Streamlit

# Inicializa el cliente de ChromaDB (base de datos vectorial)
client = initialize_client()

# Frases sarcásticas para mostrar al usuario mientras procesa
sarcastic_lines = [
    "Cocinando el PDF... 🍳",
    "Esto puede tomar un momento; estoy convenciendo al PDF de que coopere... 🤔",
    "Transformando mágicamente el papel en datos... ✨",
    "Agitando mi varita mágica... 🪄",
    "Invocando a los espíritus del PDF... 👻",
    "Un momento, mientras enseño modales a este PDF... 📚",
    "El PDF está contemplando su existencia... 🧘‍♂️",
    "El PDF se resiste, pero lo domesticaré... ¡en breve!",
]

# Asegura un identificador de usuario único en la sesión
if "user_id" not in st.session_state:
    st.session_state.user_id = str(uuid.uuid4())

user_id = st.session_state.user_id

# Historial de conversación
if "qa_history" not in st.session_state:
    st.session_state.qa_history = []

# Configura la página
st.set_page_config(page_title="Asistente PDF", page_icon="📄")

# Título principal
st.title("📄 Asistente PDF: Procesemos tu Documento")
st.markdown("Sube tu PDF en formato de texto y haz preguntas sobre su contenido.")

# Paso 1: Subir archivo
uploaded_file = st.file_uploader("Subir PDF", type="pdf")

if uploaded_file:
    # Genera un ID único de documento
    document_id = generate_document_id()
    st.success("¡Archivo subido con éxito! Podemos comenzar.")

    # Muestra una frase sarcástica
    st.markdown(random.choice(sarcastic_lines))

    pdf_bytes = uploaded_file.read()  # Lee los bytes del archivo subido

    # Muestra el PDF usando el visor
    st.subheader("PDF Subido")
    pdf_viewer(pdf_bytes)

    # Paso 2: Procesar PDF (extraer texto)
    with st.spinner("Procesando..."):
        st.markdown(random.choice(sarcastic_lines))
        pages_and_text = read_pdf(pdf_bytes)
    st.success("¡PDF procesado con éxito!")

    # Paso 3: Dividir texto en oraciones y chunks
    with st.spinner("Dividiendo en secciones..."):
        st.markdown(random.choice(sarcastic_lines))
        processed_chunks = process_chunks(pages_and_text)
    st.success("¡Texto dividido en chunks!")

    # Paso 4: Generar embeddings localmente
    with st.spinner("Creando embeddings..."):
        st.markdown(random.choice(sarcastic_lines))
        embeddings_df = embed_text_chunks(processed_chunks)
    st.success("¡Embeddings generados!")

    # Paso 5: Guardar embeddings en ChromaDB
    with st.spinner("Guardando embeddings..."):
        st.markdown(random.choice(sarcastic_lines))
        save_to_chroma_db(embeddings_df, user_id, document_id)
    st.success(f"¡Embeddings guardados para el documento con ID: {document_id}")

    # Paso 6: Interacción con el chat
    # Campo de texto para que el usuario haga su pregunta
    query = st.chat_input("Pregunta algo sobre el documento")

    if query:
        with st.spinner("Buscando respuestas..."):
            # Opcional: si quieres ver cuál es el contexto extraído, puedes llamar a:
            # context = query_chroma_db(user_id, document_id, query)
            response = query_llm(query, user_id, document_id)
            # Agrega la interacción al historial
            st.session_state.qa_history.append({"question": query, "answer": response})

# Mostrar historial de chat
if st.session_state.qa_history:
    st.subheader("Historial de Conversación")
    for interaction in st.session_state.qa_history:
        with st.chat_message("user"):
            st.write(interaction["question"])
        with st.chat_message("assistant"):
            st.write(interaction["answer"])

# Botón para borrar el historial
if st.button("Borrar Historial"):
    st.session_state.qa_history = []
    st.success("¡Historial de conversación borrado!")