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