tecuhtli commited on
Commit
da12e9c
·
verified ·
1 Parent(s): 0e29538

Converting Mori into a deployed app, to help students learn easily

Browse files
README.md CHANGED
@@ -1,13 +1,54 @@
1
- ---
2
- title: Mori Bot
3
- emoji: 🏆
4
- colorFrom: pink
5
- colorTo: gray
6
- sdk: streamlit
7
- sdk_version: 1.44.0
8
- app_file: app.py
9
- pinned: false
10
- short_description: Mori is a conversational data processing topics assistant
11
- ---
12
-
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 🧠 Mori: Your Friendly Data Science Assistant
2
+
3
+ **Mori** is a conversational assistant trained to answer questions about data science, AI concepts, and related topics.
4
+ It uses a dual-response system: one technical model and one social model, allowing it to switch between factual answers and casual interactions.
5
+
6
+ ---
7
+
8
+ ## 🚀 Try it out!
9
+
10
+ Just type your question in the input box and let Mori guide you!
11
+ You can ask things like:
12
+ - *What is overfitting?*
13
+ - *Can you explain PCA?*
14
+ - *Tell me a data science joke!*
15
+ - *I'm feeling tired...*
16
+
17
+ ---
18
+
19
+ ## 🛠️ How it works
20
+
21
+ Mori is powered by two custom fine-tuned models based on the T5 architecture:
22
+ - `Mori Técnico`: answers technical questions about data science and machine learning
23
+ - `Mori Social`: replies in a friendly, supportive tone for casual conversation
24
+
25
+ It uses **Streamlit** for the interface and **Hugging Face Transformers** to load and run the models.
26
+
27
+ ---
28
+
29
+ ## 📁 Project structure
30
+
31
+ . ├── app.py # Streamlit app ├── requirements.txt # Required packages ├── Models/ # Fine-tuned models (Técnico + Social) └── Statistics/ # Logs generated on user interaction (not persistent)
32
+
33
+
34
+ ---
35
+
36
+ ## 📊 Logging
37
+
38
+ All interactions are logged locally in the `Statistics/` folder as `.csv` and `.jsonl` files.
39
+ *Note: Hugging Face Spaces do not persist these files between restarts.*
40
+
41
+ ---
42
+
43
+ ## 👤 Author
44
+
45
+ Created by **[hazutecuhtli](https://huggingface.co/hazutecuhtli)**
46
+ PhD in Electronic Engineering, passionate about data, modeling, and sharing knowledge.
47
+
48
+ ---
49
+
50
+ ## 💡 Future Plans
51
+
52
+ - Add model explanation outputs
53
+ - Enable user-uploaded datasets
54
+ - Connect logs to Google Sheets for persistent stats
Requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ streamlit
2
+ transformers
3
+ torch
4
+ sentencepiece
5
+ spacy
6
+ python-dotenv
7
+ unidecode
Statistics/conversaciones_log.csv ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ timestamp,user_id,tipo,pregunta,respuesta
2
+ 2025-03-31T16:28:17.368963,cf87d3ce,Social,Hola Mori,🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?
3
+ 2025-03-31T16:28:24.028333,cf87d3ce,Social,Como estas?,🤝 [Mori Social] Estoy genial y listo para ayudarte! Qué quieres aprender hoy?
4
+ 2025-03-31T16:28:55.260462,cf87d3ce,Social,adios,🤝 [Mori Social] Qué tal si aprendemos algo nuevo juntos? Tengo muchas ideas.
5
+ 2025-03-31T16:30:21.418012,55f58750,Social,Que pex!,"🤝 [Mori Social] Hola, que puedo hacer por ti hoy? !"
6
+ 2025-03-31T16:31:32.713328,42387ade,Social,Kiubo,"🤝 [Mori Social] Kiubo, unassumingly, was a naive man, bringing the humor to bear with him. Kiubo was a good teacher and a good soccer player, but he hasn'"
7
+ 2025-03-31T16:33:22.549415,e8c2a10c,Social,Hola Mori,🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?
8
+ 2025-03-31T16:36:22.123926,17a640e3,Social,Hola!,🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?
9
+ 2025-03-31T16:38:52.069727,ac12720e,Social,Hola!,🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?
10
+ 2025-03-31T16:39:07.845789,ac12720e,Social,Como estas?,🤝 [Mori Social] Estoy genial y listo para ayudarte! Qué quieres aprender hoy?
11
+ 2025-03-31T16:40:51.799872,a32b6f62,Social,Que pex!,"🤝 [Mori Social] Hola, que puedo hacer por ti hoy? !"
12
+ 2025-03-31T16:41:34.537810,f6137fc4,Social,Hola!,🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?
13
+ 2025-03-31T16:41:42.157033,f6137fc4,Social,Como estas?,🤝 [Mori Social] Estoy genial y listo para ayudarte! Qué quieres aprender hoy?
14
+ 2025-03-31T16:41:52.608217,f6137fc4,Técnica,Que es auc,🧠 [Mori Técnico] Es una técnica que se utiliza para evaluar si una predicción sobre una variable depende de una predicción correcta o predicción correcta.
15
+ 2025-03-31T16:42:02.848731,f6137fc4,Técnica,Que es area under the curve,🧠 [Mori Técnico] Es la superficie de la red neuronal que se entrena para el pre-entrenamiento de un modelo de lenguaje grande.
16
+ 2025-03-31T16:42:15.602768,f6137fc4,Técnica,Que es la roc curve,🧠 [Mori Técnico] Relaciona el recall con el ratio de falsos positivos. Es una medida de la scadencia de la probabilidad de que ocurra un error.
17
+ 2025-03-31T17:17:08.276847,4e07ab74,Social,Hola Mori,🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?
18
+ 2025-03-31T17:17:15.413028,4e07ab74,Social,Como estas?,🤝 [Mori Social] Estoy genial y listo para ayudarte! Qué quieres aprender hoy?
19
+ 2025-03-31T17:17:22.034776,4e07ab74,Social,Me ayudas?,🤝 [Mori Social] Claro! En qué te puedo ayudar?
20
+ 2025-03-31T17:17:37.773793,4e07ab74,Técnica,Que es clasificacion?,🧠 [Mori Técnico] Es el proceso de aprendizaje automático que clasifica los datos en grupos o clases.
21
+ 2025-03-31T17:17:51.623283,4e07ab74,Técnica,Que es estadistica?,"🧠 [Mori Técnico] Es el proceso estadstico, como la determinación de la etiqueta, la determinación de la salida, la determinación de la etiqueta, la determinación de la salida, la determinación"
22
+ 2025-03-31T17:18:01.442976,4e07ab74,Técnica,Define matriz,🧠 [Mori Técnico] Una matriz en una colección de datos que se utiliza para matrizar una colección de datos.
23
+ 2025-03-31T17:21:01.027598,67ba31b1,Social,Hola!,🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?
24
+ 2025-03-31T17:21:16.283109,67ba31b1,Social,Que haces?,🤝 [Mori Social] Estoy diseado para responder preguntas técnicas sobre ciencia de datos y aprendizaje automático.
25
+ 2025-03-31T17:21:33.640908,67ba31b1,Técnica,QUe es la media?,"🧠 [Mori Técnico] Es la suma de todos los elementos de un conjunto, que se calcula sumando todos los valores de los valores."
26
+ 2025-03-31T17:21:43.997955,67ba31b1,Técnica,QUe es la moda?,🧠 [Mori Técnico] Es la suma de todas las diferencias existentes entre los valores predichos y los valores reales.
27
+ 2025-03-31T17:21:59.428604,67ba31b1,Técnica,Que es moda en estadistica?,"🧠 [Mori Técnico] Es una técnica que se utiliza para mejorar la calidad de las respuestas de un modelo. Se basa en la lectura de las ciencias, la lectura de las ciencias y la lectur"
28
+ 2025-03-31T17:47:22.713161,5e6ee205,Social,Hola Mori!,🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?
29
+ 2025-03-31T17:47:31.893520,5e6ee205,Social,Como estas?,🤝 [Mori Social] Estoy genial y listo para ayudarte! Qué quieres aprender hoy?
30
+ 2025-03-31T17:48:48.753589,5e6ee205,Técnica,Me explicas que es pandas,🧠 [Mori Técnico] Es un grupo de péndas donde las tasas de datos son similares a los tasas de datos. Pandas se pueden utilizar para el análisis de datos.
31
+ 2025-03-31T17:49:45.764205,e1939321,Social,Hola Mori!,🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?
32
+ 2025-03-31T17:53:54.509862,8058821c,Social,Que pex!,"🤝 [Mori Social] Hola, que puedo hacer por ti hoy? !"
33
+ 2025-03-31T17:54:07.576373,8058821c,Técnica,Me explicas precission,🧠 [Mori Técnico] Es una técnica que precisión suele ampliar la eficiencia de una operación o componente al precisión de un modelo.
34
+ 2025-03-31T17:54:15.268164,8058821c,Técnica,Me explicas accuracy,🧠 [Mori Técnico] Una propiedad que predice si un modelo predice cuántas predicciones son correctas y precisas para un objeto.
35
+ 2025-03-31T17:54:23.471874,8058821c,Técnica,Que es accuracy,🧠 [Mori Técnico] Es una métrica que mide la precisión de los datos de entrenamiento. Se utiliza para medir la precisión de los datos.
36
+ 2025-03-31T17:54:32.696201,8058821c,Técnica,Que es precision,"🧠 [Mori Técnico] Es una métrica que mide la precisión de un modelo en datos, lo que refleja la precisión de los datos. Se utiliza para evaluar si los datos son exactos, precisos o precisos"
37
+ 2025-03-31T17:54:41.358049,8058821c,Técnica,Que es precission,🧠 [Mori Técnico] Es una técnica que precisión suele generar una estructura adicional y una estructura adicional.
38
+ 2025-03-31T17:54:48.398258,8058821c,Técnica,Que es recall,🧠 [Mori Técnico] Se refiere a la capacidad de un modelo para retenir y reajustar datos en forma comprimida y recomendar los datos más relevantes.
39
+ 2025-03-31T17:56:30.761211,bdad959c,Técnica,Que onda,🧠 [Mori Técnico] Es una técnica que se utiliza para evaluar la calidad de la aplicación de un modelo de lenguaje grande.
40
+ 2025-03-31T17:56:39.323924,bdad959c,Social,Tengo Hambre,🤝 [Mori Social] Eso significa que tu cuerpo está procesando bien. Pero tu cuerpo está procesando bien.
Statistics/conversaciones_log.jsonl ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"timestamp": "2025-03-31T16:28:17.368963", "user_id": "cf87d3ce", "tipo": "Social", "pregunta": "Hola Mori", "respuesta": "🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?"}
2
+ {"timestamp": "2025-03-31T16:28:24.028333", "user_id": "cf87d3ce", "tipo": "Social", "pregunta": "Como estas?", "respuesta": "🤝 [Mori Social] Estoy genial y listo para ayudarte! Qué quieres aprender hoy?"}
3
+ {"timestamp": "2025-03-31T16:28:55.260462", "user_id": "cf87d3ce", "tipo": "Social", "pregunta": "adios", "respuesta": "🤝 [Mori Social] Qué tal si aprendemos algo nuevo juntos? Tengo muchas ideas."}
4
+ {"timestamp": "2025-03-31T16:30:21.418012", "user_id": "55f58750", "tipo": "Social", "pregunta": "Que pex!", "respuesta": "🤝 [Mori Social] Hola, que puedo hacer por ti hoy? !"}
5
+ {"timestamp": "2025-03-31T16:31:32.713328", "user_id": "42387ade", "tipo": "Social", "pregunta": "Kiubo", "respuesta": "🤝 [Mori Social] Kiubo, unassumingly, was a naive man, bringing the humor to bear with him. Kiubo was a good teacher and a good soccer player, but he hasn'"}
6
+ {"timestamp": "2025-03-31T16:33:22.549415", "user_id": "e8c2a10c", "tipo": "Social", "pregunta": "Hola Mori", "respuesta": "🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?"}
7
+ {"timestamp": "2025-03-31T16:36:22.123926", "user_id": "17a640e3", "tipo": "Social", "pregunta": "Hola!", "respuesta": "🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?"}
8
+ {"timestamp": "2025-03-31T16:38:52.069727", "user_id": "ac12720e", "tipo": "Social", "pregunta": "Hola!", "respuesta": "🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?"}
9
+ {"timestamp": "2025-03-31T16:39:07.845789", "user_id": "ac12720e", "tipo": "Social", "pregunta": "Como estas?", "respuesta": "🤝 [Mori Social] Estoy genial y listo para ayudarte! Qué quieres aprender hoy?"}
10
+ {"timestamp": "2025-03-31T16:40:51.799872", "user_id": "a32b6f62", "tipo": "Social", "pregunta": "Que pex!", "respuesta": "🤝 [Mori Social] Hola, que puedo hacer por ti hoy? !"}
11
+ {"timestamp": "2025-03-31T16:41:34.537810", "user_id": "f6137fc4", "tipo": "Social", "pregunta": "Hola!", "respuesta": "🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?"}
12
+ {"timestamp": "2025-03-31T16:41:42.157033", "user_id": "f6137fc4", "tipo": "Social", "pregunta": "Como estas?", "respuesta": "🤝 [Mori Social] Estoy genial y listo para ayudarte! Qué quieres aprender hoy?"}
13
+ {"timestamp": "2025-03-31T16:41:52.608217", "user_id": "f6137fc4", "tipo": "Técnica", "pregunta": "Que es auc", "respuesta": "🧠 [Mori Técnico] Es una técnica que se utiliza para evaluar si una predicción sobre una variable depende de una predicción correcta o predicción correcta."}
14
+ {"timestamp": "2025-03-31T16:42:02.848731", "user_id": "f6137fc4", "tipo": "Técnica", "pregunta": "Que es area under the curve", "respuesta": "🧠 [Mori Técnico] Es la superficie de la red neuronal que se entrena para el pre-entrenamiento de un modelo de lenguaje grande."}
15
+ {"timestamp": "2025-03-31T16:42:15.602768", "user_id": "f6137fc4", "tipo": "Técnica", "pregunta": "Que es la roc curve", "respuesta": "🧠 [Mori Técnico] Relaciona el recall con el ratio de falsos positivos. Es una medida de la scadencia de la probabilidad de que ocurra un error."}
16
+ {"timestamp": "2025-03-31T17:17:08.276847", "user_id": "4e07ab74", "tipo": "Social", "pregunta": "Hola Mori", "respuesta": "🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?"}
17
+ {"timestamp": "2025-03-31T17:17:15.413028", "user_id": "4e07ab74", "tipo": "Social", "pregunta": "Como estas?", "respuesta": "🤝 [Mori Social] Estoy genial y listo para ayudarte! Qué quieres aprender hoy?"}
18
+ {"timestamp": "2025-03-31T17:17:22.034776", "user_id": "4e07ab74", "tipo": "Social", "pregunta": "Me ayudas?", "respuesta": "🤝 [Mori Social] Claro! En qué te puedo ayudar?"}
19
+ {"timestamp": "2025-03-31T17:17:37.773793", "user_id": "4e07ab74", "tipo": "Técnica", "pregunta": "Que es clasificacion?", "respuesta": "🧠 [Mori Técnico] Es el proceso de aprendizaje automático que clasifica los datos en grupos o clases."}
20
+ {"timestamp": "2025-03-31T17:17:51.623283", "user_id": "4e07ab74", "tipo": "Técnica", "pregunta": "Que es estadistica?", "respuesta": "🧠 [Mori Técnico] Es el proceso estadstico, como la determinación de la etiqueta, la determinación de la salida, la determinación de la etiqueta, la determinación de la salida, la determinación"}
21
+ {"timestamp": "2025-03-31T17:18:01.442976", "user_id": "4e07ab74", "tipo": "Técnica", "pregunta": "Define matriz", "respuesta": "🧠 [Mori Técnico] Una matriz en una colección de datos que se utiliza para matrizar una colección de datos."}
22
+ {"timestamp": "2025-03-31T17:21:01.027598", "user_id": "67ba31b1", "tipo": "Social", "pregunta": "Hola!", "respuesta": "🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?"}
23
+ {"timestamp": "2025-03-31T17:21:16.283109", "user_id": "67ba31b1", "tipo": "Social", "pregunta": "Que haces?", "respuesta": "🤝 [Mori Social] Estoy diseado para responder preguntas técnicas sobre ciencia de datos y aprendizaje automático."}
24
+ {"timestamp": "2025-03-31T17:21:33.640908", "user_id": "67ba31b1", "tipo": "Técnica", "pregunta": "QUe es la media?", "respuesta": "🧠 [Mori Técnico] Es la suma de todos los elementos de un conjunto, que se calcula sumando todos los valores de los valores."}
25
+ {"timestamp": "2025-03-31T17:21:43.997955", "user_id": "67ba31b1", "tipo": "Técnica", "pregunta": "QUe es la moda?", "respuesta": "🧠 [Mori Técnico] Es la suma de todas las diferencias existentes entre los valores predichos y los valores reales."}
26
+ {"timestamp": "2025-03-31T17:21:59.428604", "user_id": "67ba31b1", "tipo": "Técnica", "pregunta": "Que es moda en estadistica?", "respuesta": "🧠 [Mori Técnico] Es una técnica que se utiliza para mejorar la calidad de las respuestas de un modelo. Se basa en la lectura de las ciencias, la lectura de las ciencias y la lectur"}
27
+ {"timestamp": "2025-03-31T17:47:22.713161", "user_id": "5e6ee205", "tipo": "Social", "pregunta": "Hola Mori!", "respuesta": "🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?"}
28
+ {"timestamp": "2025-03-31T17:47:31.893520", "user_id": "5e6ee205", "tipo": "Social", "pregunta": "Como estas?", "respuesta": "🤝 [Mori Social] Estoy genial y listo para ayudarte! Qué quieres aprender hoy?"}
29
+ {"timestamp": "2025-03-31T17:48:48.753589", "user_id": "5e6ee205", "tipo": "Técnica", "pregunta": "Me explicas que es pandas", "respuesta": "🧠 [Mori Técnico] Es un grupo de péndas donde las tasas de datos son similares a los tasas de datos. Pandas se pueden utilizar para el análisis de datos."}
30
+ {"timestamp": "2025-03-31T17:49:45.764205", "user_id": "e1939321", "tipo": "Social", "pregunta": "Hola Mori!", "respuesta": "🤝 [Mori Social] Hola! Qué gusto saludarte. Con qué tema de ciencia de datos necesitas ayuda?"}
31
+ {"timestamp": "2025-03-31T17:53:54.509862", "user_id": "8058821c", "tipo": "Social", "pregunta": "Que pex!", "respuesta": "🤝 [Mori Social] Hola, que puedo hacer por ti hoy? !"}
32
+ {"timestamp": "2025-03-31T17:54:07.576373", "user_id": "8058821c", "tipo": "Técnica", "pregunta": "Me explicas precission", "respuesta": "🧠 [Mori Técnico] Es una técnica que precisión suele ampliar la eficiencia de una operación o componente al precisión de un modelo."}
33
+ {"timestamp": "2025-03-31T17:54:15.268164", "user_id": "8058821c", "tipo": "Técnica", "pregunta": "Me explicas accuracy", "respuesta": "🧠 [Mori Técnico] Una propiedad que predice si un modelo predice cuántas predicciones son correctas y precisas para un objeto."}
34
+ {"timestamp": "2025-03-31T17:54:23.471874", "user_id": "8058821c", "tipo": "Técnica", "pregunta": "Que es accuracy", "respuesta": "🧠 [Mori Técnico] Es una métrica que mide la precisión de los datos de entrenamiento. Se utiliza para medir la precisión de los datos."}
35
+ {"timestamp": "2025-03-31T17:54:32.696201", "user_id": "8058821c", "tipo": "Técnica", "pregunta": "Que es precision", "respuesta": "🧠 [Mori Técnico] Es una métrica que mide la precisión de un modelo en datos, lo que refleja la precisión de los datos. Se utiliza para evaluar si los datos son exactos, precisos o precisos"}
36
+ {"timestamp": "2025-03-31T17:54:41.358049", "user_id": "8058821c", "tipo": "Técnica", "pregunta": "Que es precission", "respuesta": "🧠 [Mori Técnico] Es una técnica que precisión suele generar una estructura adicional y una estructura adicional."}
37
+ {"timestamp": "2025-03-31T17:54:48.398258", "user_id": "8058821c", "tipo": "Técnica", "pregunta": "Que es recall", "respuesta": "🧠 [Mori Técnico] Se refiere a la capacidad de un modelo para retenir y reajustar datos en forma comprimida y recomendar los datos más relevantes."}
38
+ {"timestamp": "2025-03-31T17:56:30.761211", "user_id": "bdad959c", "tipo": "Técnica", "pregunta": "Que onda", "respuesta": "🧠 [Mori Técnico] Es una técnica que se utiliza para evaluar la calidad de la aplicación de un modelo de lenguaje grande."}
39
+ {"timestamp": "2025-03-31T17:56:39.323924", "user_id": "bdad959c", "tipo": "Social", "pregunta": "Tengo Hambre", "respuesta": "🤝 [Mori Social] Eso significa que tu cuerpo está procesando bien. Pero tu cuerpo está procesando bien."}
app.py ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os, sys
2
+ os.environ["TF_ENABLE_ONEDNN_OPTS"] = "0"
3
+ import streamlit as st
4
+ from pathlib import Path
5
+ import torch, json, csv, warnings
6
+ from transformers import T5Tokenizer, T5ForConditionalGeneration
7
+ from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
8
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
9
+ from pathlib import Path
10
+ from unidecode import unidecode
11
+ from datetime import datetime
12
+ import uuid
13
+
14
+ # 🆔 Asigna un ID de sesión si no existe
15
+ if "user_id" not in st.session_state:
16
+ st.session_state["user_id"] = str(uuid.uuid4())[:8] # Ej: "f6a9b3e2"
17
+
18
+ def limpiar_input():
19
+ st.session_state["entrada"] = ""
20
+
21
+
22
+ def guardar_interaccion_dual(pregunta, respuesta, tipo, user_id):
23
+ timestamp = datetime.now().isoformat()
24
+
25
+ # 📁 Carpeta local (dentro del Space)
26
+ stats_dir = Path("Statistics")
27
+ stats_dir.mkdir(parents=True, exist_ok=True)
28
+
29
+ # 📄 CSV
30
+ archivo_csv = stats_dir / "conversaciones_log.csv"
31
+ existe_csv = archivo_csv.exists()
32
+
33
+ with open(archivo_csv, mode="a", encoding="utf-8", newline="") as f_csv:
34
+ writer = csv.writer(f_csv)
35
+ if not existe_csv:
36
+ writer.writerow(["timestamp", "user_id", "tipo", "pregunta", "respuesta"])
37
+ writer.writerow([timestamp, user_id, tipo, pregunta, respuesta])
38
+
39
+ # 📄 JSONL
40
+ archivo_jsonl = stats_dir / "conversaciones_log.jsonl"
41
+ with open(archivo_jsonl, mode="a", encoding="utf-8") as f_jsonl:
42
+ registro = {
43
+ "timestamp": timestamp,
44
+ "user_id": user_id,
45
+ "tipo": tipo,
46
+ "pregunta": pregunta,
47
+ "respuesta": respuesta
48
+ }
49
+ f_jsonl.write(json.dumps(registro, ensure_ascii=False) + "\n")
50
+
51
+ # ✅ Corrige la ruta correctamente desde Scripts hacia Models
52
+ def get_model_path(folder_name):
53
+ return Path("Models") / folder_name
54
+
55
+ # Función para cargar modelos
56
+ @st.cache_resource
57
+ def load_model(path_str):
58
+ path = Path(path_str).resolve()
59
+ tokenizer = AutoTokenizer.from_pretrained(path, local_files_only=True)
60
+ model = AutoModelForSeq2SeqLM.from_pretrained(path, local_files_only=True)
61
+ return model, tokenizer
62
+
63
+ def detectar_intencion(texto_usuario):
64
+ texto = unidecode(texto_usuario.lower())
65
+
66
+ social_keywords = [
67
+ "hola", "chiste", "como estas", "gracias", "que pex", "broma", "saludos", "eres", "estudiante", "preguntar algo",
68
+ "estas ahi", "que amable", "haces", "kiubo", "bro", "ey", "todo bien", "te puedo", "animo", "hasta luego", "me ayudas",
69
+ "motiva", "no entiendo", "te gusta", "futbol", "quien eres", "sentimientos", "canelo", "america", "chivas", "background",
70
+ "cuantos años", "proposito", "quien me habla", "te puedo preguntar", "ey bro", "quien te hizo", "que haces", "bonito",
71
+ "piropo", "pex", "pasion", "hambre", "camara", "cansado", "adios"
72
+ ]
73
+
74
+ tecnico_keywords = [
75
+ "modelo", "entrenamiento", "algoritmo", "regresion", "clasificacion", "overfitting", "datos", "que es",
76
+ "define", "explicas", "pca", "cnn", "rnn", "clustering", "precision", "recall", "supervisado", "aprendizaje"
77
+ ]
78
+
79
+ if any(p in texto for p in social_keywords):
80
+ return "Social"
81
+ elif any(p in texto for p in tecnico_keywords):
82
+ return "Técnica"
83
+ else:
84
+ return "Técnica"
85
+
86
+
87
+ def responder_social(texto_usuario, social_model, social_tokenizer):
88
+ device = next(social_model.parameters()).device
89
+
90
+ inputs = social_tokenizer(
91
+ texto_usuario, # ✅ sin agregar eos_token
92
+ return_tensors="pt",
93
+ padding=True,
94
+ truncation=True,
95
+ max_length=128 # ✅ especificado para evitar warning
96
+ ).to(device)
97
+
98
+ output_ids = social_model.generate(
99
+ input_ids=inputs["input_ids"],
100
+ attention_mask=inputs["attention_mask"], # ✅ FIX agregado
101
+ max_length=50,
102
+ pad_token_id=social_tokenizer.eos_token_id,
103
+ do_sample=True,
104
+ top_p=0.95,
105
+ top_k=50
106
+ )
107
+
108
+ respuesta = social_tokenizer.decode(output_ids[0], skip_special_tokens=True)
109
+ return respuesta.strip()
110
+
111
+ def responder_tecnico(texto_usuario, technical_model, technical_tokenizer):
112
+ entrada = "pregunta: " + texto_usuario
113
+ device = next(technical_model.parameters()).device
114
+
115
+ inputs = technical_tokenizer(
116
+ entrada,
117
+ return_tensors="pt",
118
+ padding=True,
119
+ truncation=True,
120
+ max_length=128 # ✅ truncación explícita
121
+ ).to(device)
122
+
123
+ output = technical_model.generate(
124
+ input_ids=inputs["input_ids"],
125
+ attention_mask=inputs["attention_mask"], # ✅ FIX agregado
126
+ max_length=64
127
+ )
128
+
129
+ respuesta = technical_tokenizer.decode(output[0], skip_special_tokens=True)
130
+ return respuesta.strip()
131
+
132
+
133
+ def responder_mori(texto_usuario):
134
+ intencion = detectar_intencion(texto_usuario)
135
+ #print("a ver: ", texto_usuario)
136
+ if intencion == "Social":
137
+ return responder_social(texto_usuario)
138
+ elif intencion == "Técnica":
139
+ return responder_tecnico(texto_usuario)
140
+ else:
141
+ return responder_tecnico(texto_usuario) #"🤔 No entendí bien... ¿quieres hablar de ciencia de datos o echar el chisme?"
142
+
143
+
144
+
145
+ if "historial" not in st.session_state:
146
+ st.session_state.historial = []
147
+
148
+
149
+ # Modelo Técnico
150
+ tokenizer_tecnico = AutoTokenizer.from_pretrained("tecuhtli/mori-tecnico-model")
151
+ model_tecnico = AutoModelForSeq2SeqLM.from_pretrained("tecuhtli/mori-tecnico-model")
152
+
153
+ # Modelo Social
154
+ tokenizer_social = AutoTokenizer.from_pretrained("tecuhtli/mori-social-model")
155
+ model_social = AutoModelForSeq2SeqLM.from_pretrained("tecuhtli/mori-social-model")
156
+
157
+ # Dispositivo
158
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
159
+ modelo_social = modelo_social.to(device)
160
+ modelo_tecnico = modelo_tecnico.to(device)
161
+
162
+ st.title("🤖 Mori - Tu Asistente Personal")
163
+ st.header("Experto en Procesamiento de Datos 🐈‍")
164
+
165
+ #entrada_usuario = st.text_area("📝 Escribe tu pregunta aquí")
166
+
167
+ with st.form("formulario_mori"):
168
+ entrada_usuario = st.text_area("📝 Escribe tu pregunta aquí", key="entrada", height=100)
169
+ submitted = st.form_submit_button("Responder")
170
+
171
+ if submitted:
172
+ #if st.button("Responder") and entrada_usuario:
173
+ opcion = detectar_intencion(entrada_usuario)
174
+ if opcion == "Técnica":
175
+ respuesta = "🧠 [Mori Técnico] " + responder_tecnico(entrada_usuario, modelo_tecnico, tokenizer_tecnico)
176
+ st.success(respuesta)
177
+ else:
178
+ respuesta = "🤝 [Mori Social] " + responder_social(entrada_usuario, modelo_social, tokenizer_social)
179
+ st.success(respuesta)
180
+
181
+ # Guarda en historial
182
+ st.session_state.historial.append(("Mori", respuesta))
183
+ st.session_state.historial.append(("Tú", entrada_usuario))
184
+
185
+ # 💾 Guarda en archivo para stats/dataset
186
+ guardar_interaccion_dual(entrada_usuario, respuesta, opcion, st.session_state["user_id"])
187
+
188
+
189
+
190
+
191
+
192
+ # 🔁 Muestra historial
193
+ if st.session_state.historial:
194
+ st.markdown("---")
195
+ for autor, texto in reversed(st.session_state.historial):
196
+ if autor == "Tú":
197
+ st.markdown(f"🧍‍♂️ **{autor}**: {texto}")
198
+ else:
199
+ st.markdown(f"🤖 **{autor}**: {texto}")
200
+
201
+
202
+ if st.session_state.historial:
203
+ texto_chat = ""
204
+ for autor, texto in st.session_state.historial:
205
+ texto_chat += f"{autor}: {texto}\n\n"
206
+
207
+ st.download_button(
208
+ label="💾 Descargar conversación como .txt",
209
+ data=texto_chat,
210
+ file_name="conversacion_mori.txt",
211
+ mime="text/plain"
212
+ )