Spaces:
Build error
Build error
| 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!") | |