File size: 6,356 Bytes
02cfe6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2da7eee
02cfe6e
0e05e63
8b9de16
3ed3728
8925a22
ea827e7
02cfe6e
4208327
02cfe6e
56e8868
02cfe6e
 
 
 
 
 
 
 
 
d1ed8a8
7ade141
02cfe6e
 
 
 
 
efd92c7
02cfe6e
 
 
 
8b9de16
30d0ed3
0e05e63
b026195
ef9fd01
02cfe6e
6a3fbff
02cfe6e
f865812
6a3fbff
eba589f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
04989bd
eba589f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
"""
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!")