Spaces:
Sleeping
Sleeping
""" | |
Este script realiza las siguientes tareas: | |
1. Carga archivos desde un directorio especificado utilizando la clase `Loader` del m贸dulo `preprocess`. | |
2. Procesa los archivos mediante limpieza de texto y divisi贸n en fragmentos. | |
3. Genera representaciones vectoriales de los textos utilizando `sentence-transformers`. | |
4. Almacena los vectores en una base de datos Chroma para su posterior recuperaci贸n. | |
5. Inicializa un modelo y ejecuta una interfaz para interactuar con los datos procesados. | |
M贸dulos utilizados: | |
- `preprocess`: Contiene la clase `Loader` para la carga y preprocesamiento de documentos. | |
- `vdb`: Se asume que gestiona la base de datos vectorial. | |
- `model_load`: M贸dulo para cargar el modelo de machine learning. | |
- `st`: Se asume que proporciona la interfaz de usuario. | |
Estructura del c贸digo: | |
1. Define el directorio de los archivos a procesar. | |
2. Carga los archivos y los procesa si el n煤mero de archivos es menor a 2. | |
3. Si hay m煤ltiples archivos, los procesa en un bucle y concatena los fragmentos. | |
4. Genera embeddings utilizando `sentence-transformers/all-MiniLM-L12-v2`. | |
5. Almacena los embeddings en ChromaDB y configura un recuperador basado en similitud. | |
6. Carga el modelo de machine learning. | |
7. Inicia la interfaz de usuario.. | |
""" | |
from langchain.vectorstores import Chroma | |
from langchain.embeddings import HuggingFaceEmbeddings | |
from langchain_chroma import Chroma | |
from tqdm.auto import tqdm | |
#from chromadb.utils import embedding_functions | |
from src.preprocess import Loader | |
from src.vdb import EmbeddingGen | |
import src.model_load | |
import streamlit as st | |
if __name__=="__main__": | |
# Definici贸n de directorio | |
archivo = [r"data/Calculo_Trascendentes_Tempranas_Zill_4t.pdf"] | |
# Carga de archivos y procesamiento de texto | |
if len(archivo) < 2: | |
Load = Loader(archivo[0]) | |
documentos = Load.load_docs() | |
textos_limpios = [Loader.limpiar_texto(texto=doc) for doc in documentos] | |
textos = Loader.splitter(texto=textos_limpios, chunk_size=500, chunk_overlap=50) | |
else: | |
textos = [] | |
for i in range(len(archivo)): | |
Load = Loader(archivo) | |
documentos = Load.load_docs() | |
textos_limpios = [Load.limpiar_texto(texto=doc) for doc in documentos] | |
chunks = Load.splitter(texto=textos_limpios, chunk_size=500, chunk_overlap=50) | |
textos.extend(chunks) | |
# Generaci贸n de embeddings y almacenamiento en base de datos ChromaDB | |
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L12-v2") | |
persist_directory = "./persist_directory" | |
db = Chroma(persist_directory=persist_directory, embedding_function=embeddings.embed_documents) | |
vectorstore = Chroma.from_documents(textos[:10], embeddings, persist_directory="./chroma_db") | |
print("Vectorizado terminado") | |
retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 3}) | |
print("Carga del modelo") | |
# Carga del modelo y ejecuci贸n de la interfaz | |
src.model_load.load_model() | |
print("Lanzando interfaz") | |
# Configuraci贸n de la p谩gina | |
st.set_page_config( | |
page_title="MathQA - Asistente de Matem谩ticas", | |
page_icon="馃М", | |
layout="centered", | |
initial_sidebar_state="expanded" | |
) | |
# Paleta de colores neutra | |
primary_color = "#010001" | |
secondary_color = "#E7E6E7" | |
background_color = "#FBFBFA" | |
# Estilos CSS | |
st.markdown( | |
f""" | |
<style> | |
.stApp {{ background-color: {background_color}; }} | |
.stTextInput>div>div>input {{ | |
color: {primary_color}; | |
background-color: {secondary_color}; | |
border-radius: 8px; | |
}} | |
.stButton>button {{ | |
color: {primary_color}; | |
background-color: {secondary_color}; | |
border-radius: 8px; | |
transition: all 0.3s; | |
}} | |
.history-box {{ | |
border-left: 4px solid {secondary_color}; | |
padding: 1rem; | |
margin: 1rem 0; | |
background-color: {secondary_color}; | |
border-radius: 8px; | |
}} | |
</style> | |
""", | |
unsafe_allow_html=True | |
) | |
# Inicializar historial | |
if 'history' not in st.session_state: | |
st.session_state.history = [] | |
# Variable auxiliar para gestionar el input | |
if 'temp_input' not in st.session_state: | |
st.session_state.temp_input = "" | |
# T铆tulo de la aplicaci贸n | |
st.title("馃М MathQA - Asistente de Matem谩ticas") | |
st.markdown("") | |
# Widget de entrada con variable auxiliar | |
user_input = st.text_input( | |
"Escribe tu pregunta matem谩tica aqu铆:", | |
value=st.session_state.temp_input, | |
key="user_input", | |
placeholder="Ej: 驴Que es una integral?" | |
) | |
# Bot贸n de acci贸n | |
col1, col2, col3 = st.columns([5, 4, 4]) # Columnas vac铆as a los lados para centrar | |
with col2: | |
if st.button("Resolver pregunta"): | |
if user_input: # Accedemos al valor ingresado | |
# Simular respuesta | |
mock_answer = src.model_load.ask(user_input, retriever) | |
# Agregar al historial | |
st.session_state.history.insert(0, (user_input, mock_answer)) | |
# Limpiar la variable auxiliar | |
st.session_state.temp_input = "" | |
# Forzar actualizaci贸n | |
st.rerun() | |
# Mostrar historial | |
if st.session_state.history: | |
st.markdown("---") | |
st.subheader("Historial de Consultas") | |
for idx, (pregunta, respuesta) in enumerate(st.session_state.history): | |
with st.container(): | |
st.markdown( | |
f""" | |
<div class="history-box"> | |
<strong>Pregunta {len(st.session_state.history) - idx}:</strong> | |
<p>{pregunta}</p> | |
<strong>Respuesta:</strong> | |
<p>{respuesta}</p> | |
</div> | |
""", | |
unsafe_allow_html=True | |
) | |
# Pie de p谩gina | |
st.markdown("---") | |
st.markdown("馃攳 驴Necesitas ayuda con 谩lgebra, c谩lculo o geometr铆a? 隆Estoy aqu铆 para ayudarte!") | |