Actualizo base FAISS y metadatos para Mori
Browse files- Mori_Chatbot_SpanishCorrections.py +148 -0
- Mori_TechnicalPrompts.py +272 -0
- Mori_Technical_RAGwithFAISS.py +109 -0
- Prompts/prompts_social.json +0 -56
- Prompts/prompts_technical.json +0 -56
- Statistics/conversaciones_log.csv +24 -40
- Statistics/conversaciones_log.jsonl +13 -39
Mori_Chatbot_SpanishCorrections.py
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
|
| 3 |
+
|
| 4 |
+
import os, sys, warnings, json, joblib, random, re, unicodedata
|
| 5 |
+
import numpy as np
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
#-------------------------------------------------------------------------
|
| 9 |
+
# Function to correct Spanish sentences' punctuation and missing characters
|
| 10 |
+
#-------------------------------------------------------------------------
|
| 11 |
+
|
| 12 |
+
def polish_spanish(s: str) -> str:
|
| 13 |
+
"""Corrects and normalizes Spanish sentences for Mori outputs."""
|
| 14 |
+
|
| 15 |
+
# Normalización NFC para acentos y ñ
|
| 16 |
+
s = unicodedata.normalize("NFC", s).strip()
|
| 17 |
+
|
| 18 |
+
# Remover nombres del modelo filtrados
|
| 19 |
+
s = re.sub(
|
| 20 |
+
r'\s*[\[\(]\s*Mori\s+(?:Social|T[eé]nico|T[eé]cnico)\s*[\]\)]\s*',
|
| 21 |
+
'',
|
| 22 |
+
s,
|
| 23 |
+
flags=re.I
|
| 24 |
+
)
|
| 25 |
+
|
| 26 |
+
# Correcciones de palabras comunes
|
| 27 |
+
fixes = [
|
| 28 |
+
(r'(?i)(^|\W)T\s+puedes(?P<p>[^\w]|$)', r'\1Tú puedes\g<p>'),
|
| 29 |
+
(r'(?i)(^|\W)T\s+(ya|eres|estas|estás|tienes|puedes)\b', r'\1Tú \2'),
|
| 30 |
+
(r'(?i)\bclaro que s(?:i|í)?\b(?P<p>[,.\!?…])?', r'Claro que sí\g<p>'),
|
| 31 |
+
(r'(?i)(^|\s)si,', r'\1Sí,'),
|
| 32 |
+
(r'(?i)(\beso\s+)s(\s+est[áa]\b)', r'\1sí\2'),
|
| 33 |
+
(r'(?i)(^|[\s,;:])s(\s+es\b)', r'\1sí\2'),
|
| 34 |
+
(r'(?i)\btiles\b', 'útiles'),
|
| 35 |
+
(r'(?i)\butiles\b', 'útiles'),
|
| 36 |
+
(r'(?i)\butil\b', 'útil'),
|
| 37 |
+
(r'(?i)\btil\b', 'útil'),
|
| 38 |
+
(r'(?i)\bcategoras\b', 'categorías'),
|
| 39 |
+
(r'(?i)\bcategora\b', 'categoría'),
|
| 40 |
+
(r'(?i)\batpico\b', 'atípico'),
|
| 41 |
+
(r'(?i)\batpicos\b', 'atípico'),
|
| 42 |
+
(r'(?i)\bdesempeo\b', 'desempeño'),
|
| 43 |
+
(r'(?i)\baqui\b', 'aquí'),
|
| 44 |
+
(r'(?i)\balgn\b', 'algún'),
|
| 45 |
+
(r'(?i)\banomala\b', 'anomalía'),
|
| 46 |
+
(r'(?i)\banomalas\b', 'anomalías'),
|
| 47 |
+
(r'(?i)\balgun\b', 'algún'),
|
| 48 |
+
(r'(?i)\bAnimo\b', 'Ánimo'),
|
| 49 |
+
(r'(?i)\bcario\b', 'cariño'),
|
| 50 |
+
(r'(?i)\baprendisaje\b', 'aprendizaje'),
|
| 51 |
+
(r'(?i)\bmanana\b', 'mañana'),
|
| 52 |
+
(r'(?i)\bmaana\b', 'mañana'),
|
| 53 |
+
(r'(?i)\benergia\b', 'energía'),
|
| 54 |
+
(r'(?i)\benerga\b', 'energía'),
|
| 55 |
+
(r'(?i)\bextrano\b', 'extraño'),
|
| 56 |
+
(r'(?i)\bextrana\b', 'extraña'),
|
| 57 |
+
(r'(?i)\bextranar\b', 'extrañar'),
|
| 58 |
+
(r'(?i)\bextranarte\b', 'extrañarte'),
|
| 59 |
+
(r'(?i)\bextranas\b', 'extrañas'),
|
| 60 |
+
(r'(?i)\bextranos\b', 'extraños'),
|
| 61 |
+
(r'(?i)\baqu\b', 'aquí'),
|
| 62 |
+
(r'(?i)\bestare\b', 'estaré'),
|
| 63 |
+
(r'(?i)\bclarn\b', 'clarín'),
|
| 64 |
+
(r'(?i)\bclarin\b', 'clarín'),
|
| 65 |
+
(r'(?i)\bclar[íi]n\s+cornetas\b', 'clarín cornetas'),
|
| 66 |
+
(r'(?i)(^|\s)s([,.;:!?])', r'\1Sí\2'),
|
| 67 |
+
(r'(?i)\bfutbol\b', 'fútbol'),
|
| 68 |
+
(r'(?i)(^|\s)as(\s+se\b)', r'\1Así\2'),
|
| 69 |
+
(r'(?i)(^|\s)s(\s+orientarte\b)', r'\1sí\2'),
|
| 70 |
+
(r'(?i)\bbuen dia\b', 'buen día'),
|
| 71 |
+
(r'(?i)\bgran dia\b', 'gran día'),
|
| 72 |
+
(r'(?i)\bdias\b', 'días'),
|
| 73 |
+
(r'(?i)\bdia\b', 'día'),
|
| 74 |
+
(r'(?i)\bgran da\b', 'gran día'),
|
| 75 |
+
(r'(?i)\bacompa?a(r|rte|do|da|dos|das)?\b', r'acompaña\1'),
|
| 76 |
+
(r'(?i)(^|\s)as([,.;:!?]|\s|$)', r'\1así\2'),
|
| 77 |
+
(r'(?i)(^|\s)S lo se\b', r'\1Sí lo sé'),
|
| 78 |
+
(r'(?i)(^|\s)S lo sé\b', r'\1Sí lo sé'),
|
| 79 |
+
(r'(?i)\bcuidate\b', 'cuídate'),
|
| 80 |
+
(r'(?i)\bcuidese\b', 'cuídese'),
|
| 81 |
+
(r'(?i)\bcuidense\b', 'cuídense'),
|
| 82 |
+
(r'(?i)\bpequeo\b', 'pequeño'),
|
| 83 |
+
(r'(?i)\bpequea\b', 'pequeña'),
|
| 84 |
+
(r'(?i)\bpequeos\b', 'pequeños'),
|
| 85 |
+
(r'(?i)\bpequeas\b', 'pequeñas'),
|
| 86 |
+
(r'(?i)\bunico\b', 'único'),
|
| 87 |
+
(r'(?i)\bunica\b', 'única'),
|
| 88 |
+
(r'(?i)\bunicos\b', 'únicos'),
|
| 89 |
+
(r'(?i)\bunicas\b', 'únicas'),
|
| 90 |
+
(r'(?i)\bnico\b', 'único'),
|
| 91 |
+
(r'(?i)\bnica\b', 'única'),
|
| 92 |
+
(r'(?i)\bnicos\b', 'únicos'),
|
| 93 |
+
(r'(?i)\bnicas\b', 'únicas'),
|
| 94 |
+
(r'(?i)\bestadstico\b', 'estadístico'),
|
| 95 |
+
(r'(?i)\bestadstica\b', 'estadística'),
|
| 96 |
+
(r'(?i)\bestadsticos\b', 'estadísticos'),
|
| 97 |
+
(r'(?i)\bestadsticas\b', 'estadísticas'),
|
| 98 |
+
(r'(?i)\bgracias por confiar en m\b', 'gracias por confiar en mí'),
|
| 99 |
+
(r'(?i)\bcada dia\b', 'cada día'),
|
| 100 |
+
(r'(?i)\bcada da\b', 'cada día'),
|
| 101 |
+
(r'(?i)\bsegun\b', 'según'),
|
| 102 |
+
(r'(?i)\bcaracteristica(s)?\b', r'característica\1'),
|
| 103 |
+
(r'(?i)\bcaracterstica(s)?\b', r'característica\1'),
|
| 104 |
+
(r'(?i)\b([a-záéíóúñ]+)cion\b', r'\1ción'),
|
| 105 |
+
(r'(?i)\bdeterminacio\b', 'determinación'),
|
| 106 |
+
]
|
| 107 |
+
|
| 108 |
+
for pat, rep in fixes:
|
| 109 |
+
s = re.sub(pat, rep, s)
|
| 110 |
+
|
| 111 |
+
# Corregir "Eso es todo!"
|
| 112 |
+
s = re.sub(
|
| 113 |
+
r'(?i)^eso es todo!(?P<r>(\s|$).*)',
|
| 114 |
+
r'¡Eso es todo!\g<r>',
|
| 115 |
+
s
|
| 116 |
+
)
|
| 117 |
+
|
| 118 |
+
# Añadir signo de apertura de pregunta (¿)
|
| 119 |
+
def add_opening_q(m):
|
| 120 |
+
cuerpo = m.group('qbody')
|
| 121 |
+
if '¿' in cuerpo:
|
| 122 |
+
return m.group(0)
|
| 123 |
+
return f"{m.group('pre')}¿{cuerpo}"
|
| 124 |
+
|
| 125 |
+
s = re.sub(
|
| 126 |
+
r'(?P<pre>(^|[.!…]\s+))(?P<qbody>[^?]*\?)',
|
| 127 |
+
add_opening_q,
|
| 128 |
+
s
|
| 129 |
+
)
|
| 130 |
+
|
| 131 |
+
# Añadir signo de apertura para exclamaciones comunes
|
| 132 |
+
def _open_exclam(m):
|
| 133 |
+
palabra = m.group('w')
|
| 134 |
+
resto = m.group('r') or ''
|
| 135 |
+
return f'¡{palabra}!{resto}'
|
| 136 |
+
|
| 137 |
+
s = re.sub(
|
| 138 |
+
r'(?i)^\s*(?P<w>(hola|gracias|genial|perfecto|claro|por supuesto|con gusto|listo|vaya|wow|tu puedes|tú puedes|clarín|clarin|clarín cornetas))!(?P<r>(\s|$).*)',
|
| 139 |
+
_open_exclam,
|
| 140 |
+
s
|
| 141 |
+
)
|
| 142 |
+
|
| 143 |
+
# Limpieza final
|
| 144 |
+
s = re.sub(r'\s+', ' ', s).strip()
|
| 145 |
+
if s and s[-1] not in ".!?…":
|
| 146 |
+
s += "."
|
| 147 |
+
|
| 148 |
+
return s
|
Mori_TechnicalPrompts.py
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""Script to create prompt to interact with LLMs for text generation"""
|
| 3 |
+
#=====================================================================================
|
| 4 |
+
# Importing Libraries ===============================================================
|
| 5 |
+
#=====================================================================================
|
| 6 |
+
import unicodedata
|
| 7 |
+
import re
|
| 8 |
+
from Mori_Chatbot_SpanishCorrections import polish_spanish
|
| 9 |
+
from Mori_Technical_RAGwithFAISS import retrieve_docs
|
| 10 |
+
import os
|
| 11 |
+
import warnings
|
| 12 |
+
# ************************************************************************
|
| 13 |
+
# Defining default paths for the model to work
|
| 14 |
+
# ************************************************************************
|
| 15 |
+
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
|
| 16 |
+
warnings.filterwarnings("ignore", category=UserWarning)
|
| 17 |
+
warnings.filterwarnings("ignore", category=FutureWarning)
|
| 18 |
+
|
| 19 |
+
#=====================================================================================
|
| 20 |
+
# Functions =========================================================================
|
| 21 |
+
#=====================================================================================
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
def normalize_text(text: str) -> str:
|
| 25 |
+
|
| 26 |
+
"""Normalize text for correct and similar processing"""
|
| 27 |
+
t = text.lower().strip()
|
| 28 |
+
t = unicodedata.normalize("NFD", t)
|
| 29 |
+
t = "".join(ch for ch in t if unicodedata.category(ch) != "Mn")
|
| 30 |
+
t = t.replace("¿", "").replace("?", "")
|
| 31 |
+
t = re.sub(r"\s+", " ", t)
|
| 32 |
+
return t
|
| 33 |
+
|
| 34 |
+
def classify_question_type_from_text(text: str) -> str:
|
| 35 |
+
|
| 36 |
+
"""Determine the type of question"""
|
| 37 |
+
|
| 38 |
+
t = normalize_text(text)
|
| 39 |
+
|
| 40 |
+
if "para que sirve" in t or "para que se usa" in t:
|
| 41 |
+
return "funcionalidad"
|
| 42 |
+
if t.startswith("como ") or "pasos para" in t or "como puedo" in t:
|
| 43 |
+
return "procedimiento"
|
| 44 |
+
if t.startswith("que es ") or "definicion de" in t:
|
| 45 |
+
return "definicion"
|
| 46 |
+
return "definicion"
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
def build_prompt(qtype: str, question: str) -> str:
|
| 50 |
+
"""Generates a base prompt"""
|
| 51 |
+
return (
|
| 52 |
+
f"Tipo: {qtype}\n"
|
| 53 |
+
f"Pregunta: {question}\n"
|
| 54 |
+
"Respuesta:"
|
| 55 |
+
)
|
| 56 |
+
|
| 57 |
+
def build_prompt_inference(question: str):
|
| 58 |
+
"""Generates an inference prompt"""
|
| 59 |
+
qtype = classify_question_type_from_text(question)
|
| 60 |
+
return build_prompt(qtype, question)
|
| 61 |
+
|
| 62 |
+
def build_prompt_training(row):
|
| 63 |
+
"""Generates a prompt for training"""
|
| 64 |
+
qtype = row["question_type"] # definicion / procedimiento / funcionalidad
|
| 65 |
+
question = row["input"]
|
| 66 |
+
return build_prompt(qtype, question)
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def build_prompt_for_mori(user_question: str, question_type: str, top_doc: dict) -> str:
|
| 70 |
+
"""
|
| 71 |
+
Prompt one-shot for RAG Mori, relying on question_type (definicion, procedimiento, funcionalidad).
|
| 72 |
+
"""
|
| 73 |
+
ejemplo_q = (top_doc.get("input") or "").strip()
|
| 74 |
+
ejemplo_a = (top_doc.get("output") or "").strip()
|
| 75 |
+
contexto = (top_doc.get("context") or "").strip()
|
| 76 |
+
term = (top_doc.get("canonical_term") or "").strip()
|
| 77 |
+
|
| 78 |
+
prompt = (
|
| 79 |
+
"Eres un asistente técnico llamado Mori. Respondes en español, de forma clara y concisa.\n\n"
|
| 80 |
+
f"Contexto del concepto:\n"
|
| 81 |
+
f"- Término: {term}\n"
|
| 82 |
+
f"- Área: {contexto}\n"
|
| 83 |
+
f"- Tipo de pregunta: {question_type}\n\n"
|
| 84 |
+
f"A continuación tienes un ejemplo de pregunta y respuesta del mismo tipo \"{question_type}\":\n"
|
| 85 |
+
f"Pregunta de ejemplo:\n{ejemplo_q}\n\n"
|
| 86 |
+
f"Respuesta de ejemplo:\n{ejemplo_a}\n\n"
|
| 87 |
+
"Usa este estilo y nivel de detalle como guía.\n\n"
|
| 88 |
+
f"Ahora responde la siguiente pregunta del usuario manteniendo el tipo \"{question_type}\" "
|
| 89 |
+
"(sin inventar información que no aparezca en el contexto recuperado, o que contradiga el ejemplo):\n\n"
|
| 90 |
+
f"Pregunta del usuario:\n{user_question}\n\n"
|
| 91 |
+
"Respuesta:"
|
| 92 |
+
)
|
| 93 |
+
|
| 94 |
+
return prompt
|
| 95 |
+
|
| 96 |
+
|
| 97 |
+
def answer_with_mori_rag(tokenizer, model, question: str, modo: str = "exacto", k: int = 5, score_threshold: float = 0.88, verbose=True) -> str:
|
| 98 |
+
"""
|
| 99 |
+
Mori RAG answer:
|
| 100 |
+
- Detects question_type
|
| 101 |
+
- Rcover docs
|
| 102 |
+
- Filter by question_type
|
| 103 |
+
- Use threshold to determine the answer to return
|
| 104 |
+
- If threshold is surpass → asnwer from FAISS
|
| 105 |
+
- Otherwise → Generative answer from fine tuned Mori
|
| 106 |
+
- Use polish_spanish to return the best possible gramatically corrected asnwer
|
| 107 |
+
"""
|
| 108 |
+
|
| 109 |
+
# 1) Detectar tipo de pregunta
|
| 110 |
+
qtype = classify_question_type_from_text(question)
|
| 111 |
+
print(f"[Tipo detectado] {qtype}")
|
| 112 |
+
|
| 113 |
+
# 2) Recuperar documentos desde FAISS
|
| 114 |
+
docs = retrieve_docs(question, k=k, verbose=False)
|
| 115 |
+
|
| 116 |
+
if not docs:
|
| 117 |
+
print("[RAG] No se encontraron documentos, usando prompt simple.")
|
| 118 |
+
prompt = build_prompt_inference(question)
|
| 119 |
+
else:
|
| 120 |
+
# 3) Filtrar por question_type primero
|
| 121 |
+
same_type = [d for d in docs if d.get("question_type") == qtype]
|
| 122 |
+
|
| 123 |
+
if same_type:
|
| 124 |
+
top_doc = same_type[0]
|
| 125 |
+
else:
|
| 126 |
+
print("[RAG] No hay docs del mismo question_type, usando top-1 general.")
|
| 127 |
+
top_doc = docs[0]
|
| 128 |
+
|
| 129 |
+
if verbose:
|
| 130 |
+
# Debug bonito
|
| 131 |
+
print("\n[RAG] Documento usado como ejemplo:")
|
| 132 |
+
print(" score:", top_doc["score"])
|
| 133 |
+
print(" term :", top_doc.get("canonical_term", ""))
|
| 134 |
+
print(" ctx :", top_doc.get("context", ""))
|
| 135 |
+
print(" qtype:", top_doc.get("question_type", ""))
|
| 136 |
+
print(" Qej :", top_doc.get("input", ""))
|
| 137 |
+
print(" Aej :", top_doc.get("output", ""))
|
| 138 |
+
|
| 139 |
+
# 4) Threshold SOLO sobre ese top_doc (idealmente del mismo tipo)
|
| 140 |
+
if top_doc.get("question_type") == qtype and top_doc["score"] >= score_threshold:
|
| 141 |
+
if verbose:
|
| 142 |
+
print(f"[RAG] Coincidencia fuerte (>={score_threshold}) para tipo '{qtype}'. "
|
| 143 |
+
"Usando output directo del dataset.")
|
| 144 |
+
return polish_spanish(top_doc["output"]), build_prompt_for_mori(question, qtype, top_doc)
|
| 145 |
+
|
| 146 |
+
# 5) Si no pasa el threshold → usamos prompt generativo con RAG
|
| 147 |
+
prompt = build_prompt_for_mori(question, qtype, top_doc)
|
| 148 |
+
|
| 149 |
+
# 6) Generar con Mori usando el prompt
|
| 150 |
+
inputs = tokenizer(
|
| 151 |
+
prompt,
|
| 152 |
+
return_tensors="pt",
|
| 153 |
+
truncation=True,
|
| 154 |
+
max_length=256,
|
| 155 |
+
).to(model.device)
|
| 156 |
+
|
| 157 |
+
gen_kwargs = get_gen_kwargs(modo)
|
| 158 |
+
|
| 159 |
+
output_ids = model.generate(
|
| 160 |
+
**inputs,
|
| 161 |
+
**gen_kwargs
|
| 162 |
+
)
|
| 163 |
+
raw_answer = tokenizer.decode(output_ids[0], skip_special_tokens=True)
|
| 164 |
+
|
| 165 |
+
# 7) Pulir la salida
|
| 166 |
+
|
| 167 |
+
return polish_spanish(raw_answer), prompt
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
|
| 171 |
+
def answer_with_mori_plain(tokenizer, model, question: str, modo: str = "exacto") -> str:
|
| 172 |
+
"""
|
| 173 |
+
Mori answer without RAG: jsut suing inference prompt with fine tuned model
|
| 174 |
+
- Use polish_spanish to return the best possible gramatically corrected asnwer
|
| 175 |
+
"""
|
| 176 |
+
|
| 177 |
+
|
| 178 |
+
|
| 179 |
+
prompt = build_prompt_inference(question)
|
| 180 |
+
|
| 181 |
+
inputs = tokenizer(
|
| 182 |
+
prompt,
|
| 183 |
+
return_tensors="pt",
|
| 184 |
+
truncation=True,
|
| 185 |
+
max_length=64
|
| 186 |
+
).to(model.device)
|
| 187 |
+
|
| 188 |
+
gen_kwargs = get_gen_kwargs(modo)
|
| 189 |
+
|
| 190 |
+
output_ids = model.generate(
|
| 191 |
+
**inputs,
|
| 192 |
+
**gen_kwargs
|
| 193 |
+
)
|
| 194 |
+
|
| 195 |
+
raw_answer = tokenizer.decode(output_ids[0], skip_special_tokens=True)
|
| 196 |
+
return polish_spanish(raw_answer), prompt
|
| 197 |
+
|
| 198 |
+
|
| 199 |
+
def get_gen_kwargs(modo="exacto"):
|
| 200 |
+
|
| 201 |
+
"""Selecting the Mori personaliuty by using different hyperparameters settigns"""
|
| 202 |
+
|
| 203 |
+
modo = modo.lower().strip()
|
| 204 |
+
|
| 205 |
+
presets = {
|
| 206 |
+
"exacto": dict(
|
| 207 |
+
max_new_tokens=64,
|
| 208 |
+
num_beams=4,
|
| 209 |
+
do_sample=False,
|
| 210 |
+
no_repeat_ngram_size=3,
|
| 211 |
+
repetition_penalty=1.05,
|
| 212 |
+
early_stopping=True,
|
| 213 |
+
),
|
| 214 |
+
|
| 215 |
+
"superexacto": dict( # más estricto, menor creatividad
|
| 216 |
+
max_new_tokens=48,
|
| 217 |
+
num_beams=6,
|
| 218 |
+
do_sample=False,
|
| 219 |
+
no_repeat_ngram_size=4,
|
| 220 |
+
repetition_penalty=1.2,
|
| 221 |
+
early_stopping=True,
|
| 222 |
+
),
|
| 223 |
+
|
| 224 |
+
"creativo": dict(
|
| 225 |
+
max_new_tokens=64,
|
| 226 |
+
num_beams=1,
|
| 227 |
+
do_sample=True,
|
| 228 |
+
temperature=0.4,
|
| 229 |
+
top_p=0.9,
|
| 230 |
+
no_repeat_ngram_size=3,
|
| 231 |
+
repetition_penalty=1.05,
|
| 232 |
+
early_stopping=True,
|
| 233 |
+
),
|
| 234 |
+
|
| 235 |
+
"suave": dict( # sampling más libre
|
| 236 |
+
max_new_tokens=80,
|
| 237 |
+
num_beams=1,
|
| 238 |
+
do_sample=True,
|
| 239 |
+
temperature=0.7,
|
| 240 |
+
top_p=0.95,
|
| 241 |
+
no_repeat_ngram_size=2,
|
| 242 |
+
repetition_penalty=1.0,
|
| 243 |
+
early_stopping=True,
|
| 244 |
+
),
|
| 245 |
+
|
| 246 |
+
"agresivo": dict( # máximo sampling creativo
|
| 247 |
+
max_new_tokens=120,
|
| 248 |
+
num_beams=1,
|
| 249 |
+
do_sample=True,
|
| 250 |
+
temperature=1.1,
|
| 251 |
+
top_p=0.95,
|
| 252 |
+
no_repeat_ngram_size=1,
|
| 253 |
+
repetition_penalty=0.9,
|
| 254 |
+
early_stopping=False,
|
| 255 |
+
),
|
| 256 |
+
|
| 257 |
+
"beams_altos": dict( # modo generativo más estable
|
| 258 |
+
max_new_tokens=80,
|
| 259 |
+
num_beams=8,
|
| 260 |
+
do_sample=False,
|
| 261 |
+
no_repeat_ngram_size=4,
|
| 262 |
+
repetition_penalty=1.1,
|
| 263 |
+
early_stopping=True,
|
| 264 |
+
),
|
| 265 |
+
}
|
| 266 |
+
|
| 267 |
+
return presets.get(modo, presets["exacto"])
|
| 268 |
+
|
| 269 |
+
|
| 270 |
+
#=====================================================================================
|
| 271 |
+
# FIN ===============================================================================
|
| 272 |
+
#=====================================================================================
|
Mori_Technical_RAGwithFAISS.py
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""
|
| 3 |
+
Inferencia RAG para Mori usando FAISS + E5 (multilingual).
|
| 4 |
+
|
| 5 |
+
Este módulo asume que:
|
| 6 |
+
- Ya existe un índice FAISS guardado (mori.faiss)
|
| 7 |
+
- Ya existe un archivo de metadatos (mori_metas.json)
|
| 8 |
+
|
| 9 |
+
Solo expone la función:
|
| 10 |
+
retrieve_docs(query: str, k: int = 3) -> list[dict]
|
| 11 |
+
"""
|
| 12 |
+
|
| 13 |
+
import json
|
| 14 |
+
from pathlib import Path
|
| 15 |
+
|
| 16 |
+
import faiss
|
| 17 |
+
import numpy as np
|
| 18 |
+
import torch
|
| 19 |
+
from sentence_transformers import SentenceTransformer
|
| 20 |
+
|
| 21 |
+
# ************************************************************************
|
| 22 |
+
# Configuración básica
|
| 23 |
+
# ************************************************************************
|
| 24 |
+
output_dir = Path("Vec_DataBase") # mismo directorio que usaste al construir
|
| 25 |
+
model_name = "intfloat/multilingual-e5-base"
|
| 26 |
+
index_basename = "mori"
|
| 27 |
+
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
|
| 28 |
+
|
| 29 |
+
RAG_BASE_DIR = output_dir
|
| 30 |
+
RAG_INDEX_PATH = RAG_BASE_DIR / f"{index_basename}.faiss"
|
| 31 |
+
RAG_METAS_PATH = RAG_BASE_DIR / f"{index_basename}_metas.json"
|
| 32 |
+
|
| 33 |
+
# Lazy loading (solo en la primera llamada a retrieve_docs)
|
| 34 |
+
_rag_model = None
|
| 35 |
+
_rag_index = None
|
| 36 |
+
_rag_metas = None
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
def _ensure_rag_loaded(verbose: bool = False):
|
| 40 |
+
"""
|
| 41 |
+
Carga perezosa (lazy) del modelo de embeddings, índice FAISS y metadatos.
|
| 42 |
+
Solo se ejecuta la primera vez.
|
| 43 |
+
"""
|
| 44 |
+
global _rag_model, _rag_index, _rag_metas
|
| 45 |
+
|
| 46 |
+
if _rag_model is None:
|
| 47 |
+
if verbose:
|
| 48 |
+
print(f"[*] Cargando modelo RAG ({model_name}) en {DEVICE}…")
|
| 49 |
+
_rag_model = SentenceTransformer(model_name, device=DEVICE)
|
| 50 |
+
|
| 51 |
+
if _rag_index is None:
|
| 52 |
+
if verbose:
|
| 53 |
+
print(f"[*] Cargando índice FAISS desde {RAG_INDEX_PATH}…")
|
| 54 |
+
assert RAG_INDEX_PATH.exists(), f"No se encontró el índice FAISS: {RAG_INDEX_PATH}"
|
| 55 |
+
_rag_index = faiss.read_index(str(RAG_INDEX_PATH))
|
| 56 |
+
|
| 57 |
+
if _rag_metas is None:
|
| 58 |
+
if verbose:
|
| 59 |
+
print(f"[*] Cargando metadatos desde {RAG_METAS_PATH}…")
|
| 60 |
+
assert RAG_METAS_PATH.exists(), f"No se encontró el archivo de metadatos: {RAG_METAS_PATH}"
|
| 61 |
+
with open(RAG_METAS_PATH, "r", encoding="utf-8") as f:
|
| 62 |
+
_rag_metas = json.load(f)
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
def retrieve_docs(query: str, k: int = 3, verbose: bool = False):
|
| 66 |
+
"""
|
| 67 |
+
Recupera los k documentos más cercanos para una query dada.
|
| 68 |
+
|
| 69 |
+
Devuelve una lista de dicts con:
|
| 70 |
+
- score
|
| 71 |
+
- id
|
| 72 |
+
- canonical_term
|
| 73 |
+
- context
|
| 74 |
+
- input
|
| 75 |
+
- output
|
| 76 |
+
- question_type
|
| 77 |
+
- version
|
| 78 |
+
- encoder
|
| 79 |
+
"""
|
| 80 |
+
_ensure_rag_loaded(verbose)
|
| 81 |
+
|
| 82 |
+
# E5 usa el prefijo "query: " para consultas
|
| 83 |
+
qtext = f"query: {query}"
|
| 84 |
+
q_emb = _rag_model.encode(
|
| 85 |
+
[qtext],
|
| 86 |
+
normalize_embeddings=True,
|
| 87 |
+
convert_to_numpy=True
|
| 88 |
+
).astype("float32")
|
| 89 |
+
|
| 90 |
+
scores, idxs = _rag_index.search(q_emb, k)
|
| 91 |
+
|
| 92 |
+
results = []
|
| 93 |
+
for s, i in zip(scores[0], idxs[0]):
|
| 94 |
+
if i == -1:
|
| 95 |
+
continue
|
| 96 |
+
m = _rag_metas[i]
|
| 97 |
+
results.append({
|
| 98 |
+
"score": float(s),
|
| 99 |
+
**m
|
| 100 |
+
})
|
| 101 |
+
return results
|
| 102 |
+
|
| 103 |
+
|
| 104 |
+
if __name__ == "__main__":
|
| 105 |
+
# Pequeña prueba manual
|
| 106 |
+
qs = "¿Para qué sirve un isolation forest?"
|
| 107 |
+
docs = retrieve_docs(qs, k=3, verbose=True)
|
| 108 |
+
for d in docs:
|
| 109 |
+
print(f"[score={d['score']:.3f}] {d['input']} -> {d['output']}")
|
Prompts/prompts_social.json
DELETED
|
@@ -1,56 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"meta": {
|
| 3 |
-
"task": "social_response",
|
| 4 |
-
"version": "1.0"
|
| 5 |
-
},
|
| 6 |
-
"modes": {
|
| 7 |
-
"zero_shot": {
|
| 8 |
-
"instruction": "Responder de forma amigable y cercana al usuario.",
|
| 9 |
-
"rules": [
|
| 10 |
-
"Responde de forma natural y amistosa, con un toque reflexivo; agrega ejemplos sencillos o analogías cortas. ",
|
| 11 |
-
"Evita sonar formal y permite algo de color humano."
|
| 12 |
-
],
|
| 13 |
-
"output_format": "1–2 oraciones relajadas y naturales.",
|
| 14 |
-
"tone": "Amigable y entusiasta.",
|
| 15 |
-
"examples": []
|
| 16 |
-
},
|
| 17 |
-
"one_shot": {
|
| 18 |
-
"instruction": "Responder de forma amigable y cercana al usuario.",
|
| 19 |
-
"rules": [
|
| 20 |
-
"Responde de forma natural y amistosa, con un toque reflexivo; agrega ejemplos sencillos o analogías cortas. ",
|
| 21 |
-
"Evita sonar formal y permite algo de color humano."
|
| 22 |
-
],
|
| 23 |
-
"output_format": "1–2 oraciones relajadas y naturales.",
|
| 24 |
-
"tone": "Amigable y entusiasta.",
|
| 25 |
-
"examples": [
|
| 26 |
-
{
|
| 27 |
-
"input": "¿Puedo hacerte una pregunta?",
|
| 28 |
-
"output": "¡Claro! Dime cuál es tu duda y lo resolvemos juntos."
|
| 29 |
-
}
|
| 30 |
-
]
|
| 31 |
-
},
|
| 32 |
-
"few_shot_3": {
|
| 33 |
-
"instruction": "Responder de forma amigable y cercana al usuario.",
|
| 34 |
-
"rules": [
|
| 35 |
-
"Responde de forma natural y amistosa, con un toque reflexivo; agrega ejemplos sencillos o analogías cortas. ",
|
| 36 |
-
"Evita sonar formal y permite algo de color humano."
|
| 37 |
-
],
|
| 38 |
-
"output_format": "1–2 oraciones relajadas y naturales.",
|
| 39 |
-
"tone": "Amigable y entusiasta.",
|
| 40 |
-
"examples": [
|
| 41 |
-
{
|
| 42 |
-
"input": "¿Cuál es el significado de la vida?",
|
| 43 |
-
"output": "Pregunta enorme; por ahora enfoquémonos en tus metas de hoy. ¿Qué te gustaría avanzar?"
|
| 44 |
-
},
|
| 45 |
-
{
|
| 46 |
-
"input": "No entiendo nada 😩",
|
| 47 |
-
"output": "Tranquilo/a, aprender toma tiempo. Dime qué parte se atoró y la vemos paso a paso."
|
| 48 |
-
},
|
| 49 |
-
{
|
| 50 |
-
"input": "¿Qué opinas del clima?",
|
| 51 |
-
"output": "No tengo sensores, pero si el clima ayuda, nos aventamos otro tema 😄."
|
| 52 |
-
}
|
| 53 |
-
]
|
| 54 |
-
}
|
| 55 |
-
}
|
| 56 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Prompts/prompts_technical.json
DELETED
|
@@ -1,56 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"meta": {
|
| 3 |
-
"task": "technical_definition",
|
| 4 |
-
"version": "1.0"
|
| 5 |
-
},
|
| 6 |
-
"modes": {
|
| 7 |
-
"zero_shot": {
|
| 8 |
-
"instruction": "Define con precisión.",
|
| 9 |
-
"rules": [
|
| 10 |
-
"Identifica correctamente el concepto principal mencionado en la pregunta.",
|
| 11 |
-
"Proporciona una definición canónica, exacta y concisa del concepto."
|
| 12 |
-
],
|
| 13 |
-
"output_format": "Respuesta corta y concisa.",
|
| 14 |
-
"tone": "Directo, técnico y formal.",
|
| 15 |
-
"examples": []
|
| 16 |
-
},
|
| 17 |
-
"one_shot": {
|
| 18 |
-
"instruction": "Define con precisión.",
|
| 19 |
-
"rules": [
|
| 20 |
-
"Identifica correctamente el concepto principal mencionado en la pregunta.",
|
| 21 |
-
"Proporciona una definición canónica, exacta y concisa del concepto."
|
| 22 |
-
],
|
| 23 |
-
"output_format": "Respuesta corta y concisa.",
|
| 24 |
-
"tone": "Directo, técnico y formal.",
|
| 25 |
-
"examples": [
|
| 26 |
-
{
|
| 27 |
-
"input": "¿Que es la tecnologia?",
|
| 28 |
-
"output": "Conjunto de teorías y de técnicas que permiten el aprovechamiento práctico del conocimiento científico."
|
| 29 |
-
}
|
| 30 |
-
]
|
| 31 |
-
},
|
| 32 |
-
"few_shot_3": {
|
| 33 |
-
"instruction": "Define con precisión.",
|
| 34 |
-
"rules": [
|
| 35 |
-
"Identifica correctamente el concepto principal mencionado en la pregunta.",
|
| 36 |
-
"Proporciona una definición canónica, exacta y concisa del concepto."
|
| 37 |
-
],
|
| 38 |
-
"output_format": "Respuesta corta y concisa.",
|
| 39 |
-
"tone": "Directo, técnico y formal.",
|
| 40 |
-
"examples": [
|
| 41 |
-
{
|
| 42 |
-
"input": "¿Qué es un algoritmo?",
|
| 43 |
-
"output": "Conjunto ordenado de pasos o instrucciones que permiten resolver un problema o realizar una tarea de forma sistemática."
|
| 44 |
-
},
|
| 45 |
-
{
|
| 46 |
-
"input": "¿Cómo se define la inteligencia artificial?",
|
| 47 |
-
"output": "Campo de la informática que busca crear sistemas capaces de realizar tareas que requieren inteligencia humana, como razonar, aprender o reconocer patrones."
|
| 48 |
-
},
|
| 49 |
-
{
|
| 50 |
-
"input": "Define el término base de datos.",
|
| 51 |
-
"output": "Conjunto organizado de información que se almacena y gestiona electrónicamente para facilitar su acceso, consulta y actualización."
|
| 52 |
-
}
|
| 53 |
-
]
|
| 54 |
-
}
|
| 55 |
-
}
|
| 56 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Statistics/conversaciones_log.csv
CHANGED
|
@@ -1,40 +1,24 @@
|
|
| 1 |
-
timestamp,user_id,
|
| 2 |
-
2025-
|
| 3 |
-
|
| 4 |
-
2025-
|
| 5 |
-
|
| 6 |
-
2025-
|
| 7 |
-
|
| 8 |
-
2025-
|
| 9 |
-
|
| 10 |
-
2025-
|
| 11 |
-
|
| 12 |
-
2025-
|
| 13 |
-
|
| 14 |
-
2025-
|
| 15 |
-
|
| 16 |
-
2025-
|
| 17 |
-
|
| 18 |
-
2025-
|
| 19 |
-
|
| 20 |
-
2025-
|
| 21 |
-
|
| 22 |
-
2025-
|
| 23 |
-
2025-
|
| 24 |
-
2025-
|
| 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.
|
|
|
|
| 1 |
+
timestamp,user_id,pregunta,respuesta,rag,personality
|
| 2 |
+
2025-11-23T21:14:45.856296,a34683e1,"Que es machine learning?
|
| 3 |
+
",Es una rama de la inteligencia artificial que permite a los sistemas aprender de datos y mejorar su desempeño de forma automática a través de modelos estadísticos.,Con RAG,Mori Exacto
|
| 4 |
+
2025-11-23T21:14:53.551138,a34683e1,"Como limpiar datos?
|
| 5 |
+
","Se puede hacer mediante: identificar valores nulos, corregir datos inconsistentes, eliminar duplicados, detectar atípicos y estandarizar formatos.",Con RAG,Mori Exacto
|
| 6 |
+
2025-11-23T21:15:07.449649,a34683e1,"Para que sirve un autoencoder?
|
| 7 |
+
","Sirve para aprender representaciones comprimidas de los datos y reconstruirlos, útil para reducción de dimensionalidad y detección de anomalías.",Con RAG,Mori Exacto
|
| 8 |
+
2025-11-23T21:15:16.998515,a34683e1,"Para que sirve un autoencoder?
|
| 9 |
+
","Sirve para aprender representaciones comprimidas de los datos y reconstruirlos, útil para reducción de dimensionalidad y detección de anomalías.",Sin RAG,Mori Exacto
|
| 10 |
+
2025-11-23T21:15:25.730844,a34683e1,"Para que sirve un autoencoder?
|
| 11 |
+
","Sirve para aprender representaciones comprimidas de los datos y reconstruirlos, útil para reducción de dimensionalidad y detección de anomalías.",Sin RAG,creativo
|
| 12 |
+
2025-11-23T21:15:37.784763,a34683e1,"Que es machine learning?
|
| 13 |
+
",Es una rama de la inteligencia artificial que permite a los sistemas aprender de datos y mejorar su desempeño de forma automática a través de modelos estadísticos.,Sin RAG,creativo
|
| 14 |
+
2025-11-23T21:15:44.419135,a34683e1,"Que es machine learning?
|
| 15 |
+
",Es una rama de la inteligencia artificial que permite a los sistemas aprender de datos y mejorar su desempeño de forma automática a través de modelos estadísticos.,Sin RAG,exacto
|
| 16 |
+
2025-11-23T21:15:55.738209,a34683e1,"Que es CNN?
|
| 17 |
+
",Es un modelo de aprendizaje automático que imita la forma en que se ejecuta por conexiones de datos.,Sin RAG,exacto
|
| 18 |
+
2025-11-23T21:16:01.193517,a34683e1,"Que es CNN?
|
| 19 |
+
",Es un modelo de aprendizaje automático que imita la forma en que se ejecuta por conexiones de datos.,Sin RAG,creativo
|
| 20 |
+
2025-11-23T21:16:05.149295,a34683e1,"Que es CNN?
|
| 21 |
+
",Una red neuronal en la que al menos una capa es una capa convolucional.,Con RAG,creativo
|
| 22 |
+
2025-11-23T21:16:22.504877,a34683e1,Para que sirve big data?,"Sirve para procesar, almacenar y analizar grandes volúmenes de datos imposibles de manejar con herramientas tradicionales.",Con RAG,creativo
|
| 23 |
+
2025-11-23T21:16:27.914520,a34683e1,Para que sirve big data?,"Sirve para descubrir patrones, tendencias y relaciones que apoyan la toma de decisiones grandes.",Sin RAG,creativo
|
| 24 |
+
2025-11-23T21:16:35.944643,a34683e1,Para que sirve big data?,"Sirve para almacenar, procesar y analizar grandes volmenes de datos con el fin de descubrir patrones, tendencias y relaciones que apoyan la toma de decisiones.",Sin RAG,exacto
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Statistics/conversaciones_log.jsonl
CHANGED
|
@@ -1,39 +1,13 @@
|
|
| 1 |
-
{"timestamp": "2025-
|
| 2 |
-
{"timestamp": "2025-
|
| 3 |
-
{"timestamp": "2025-
|
| 4 |
-
{"timestamp": "2025-
|
| 5 |
-
{"timestamp": "2025-
|
| 6 |
-
{"timestamp": "2025-
|
| 7 |
-
{"timestamp": "2025-
|
| 8 |
-
{"timestamp": "2025-
|
| 9 |
-
{"timestamp": "2025-
|
| 10 |
-
{"timestamp": "2025-
|
| 11 |
-
{"timestamp": "2025-
|
| 12 |
-
{"timestamp": "2025-
|
| 13 |
-
{"timestamp": "2025-
|
| 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."}
|
|
|
|
| 1 |
+
{"timestamp": "2025-11-23T21:14:45.856296", "user_id": "a34683e1", "pregunta": "Que es machine learning?\n", "respuesta": "Es una rama de la inteligencia artificial que permite a los sistemas aprender de datos y mejorar su desempeño de forma automática a través de modelos estadísticos.", "uso_rag": "Con RAG", "personality": "Mori Exacto"}
|
| 2 |
+
{"timestamp": "2025-11-23T21:14:53.551138", "user_id": "a34683e1", "pregunta": "Como limpiar datos?\n", "respuesta": "Se puede hacer mediante: identificar valores nulos, corregir datos inconsistentes, eliminar duplicados, detectar atípicos y estandarizar formatos.", "uso_rag": "Con RAG", "personality": "Mori Exacto"}
|
| 3 |
+
{"timestamp": "2025-11-23T21:15:07.449649", "user_id": "a34683e1", "pregunta": "Para que sirve un autoencoder?\n", "respuesta": "Sirve para aprender representaciones comprimidas de los datos y reconstruirlos, útil para reducción de dimensionalidad y detección de anomalías.", "uso_rag": "Con RAG", "personality": "Mori Exacto"}
|
| 4 |
+
{"timestamp": "2025-11-23T21:15:16.998515", "user_id": "a34683e1", "pregunta": "Para que sirve un autoencoder?\n", "respuesta": "Sirve para aprender representaciones comprimidas de los datos y reconstruirlos, útil para reducción de dimensionalidad y detección de anomalías.", "uso_rag": "Sin RAG", "personality": "Mori Exacto"}
|
| 5 |
+
{"timestamp": "2025-11-23T21:15:25.730844", "user_id": "a34683e1", "pregunta": "Para que sirve un autoencoder?\n", "respuesta": "Sirve para aprender representaciones comprimidas de los datos y reconstruirlos, útil para reducción de dimensionalidad y detección de anomalías.", "uso_rag": "Sin RAG", "personality": "creativo"}
|
| 6 |
+
{"timestamp": "2025-11-23T21:15:37.784763", "user_id": "a34683e1", "pregunta": "Que es machine learning?\n", "respuesta": "Es una rama de la inteligencia artificial que permite a los sistemas aprender de datos y mejorar su desempeño de forma automática a través de modelos estadísticos.", "uso_rag": "Sin RAG", "personality": "creativo"}
|
| 7 |
+
{"timestamp": "2025-11-23T21:15:44.419135", "user_id": "a34683e1", "pregunta": "Que es machine learning?\n", "respuesta": "Es una rama de la inteligencia artificial que permite a los sistemas aprender de datos y mejorar su desempeño de forma automática a través de modelos estadísticos.", "uso_rag": "Sin RAG", "personality": "exacto"}
|
| 8 |
+
{"timestamp": "2025-11-23T21:15:55.738209", "user_id": "a34683e1", "pregunta": "Que es CNN?\n", "respuesta": "Es un modelo de aprendizaje automático que imita la forma en que se ejecuta por conexiones de datos.", "uso_rag": "Sin RAG", "personality": "exacto"}
|
| 9 |
+
{"timestamp": "2025-11-23T21:16:01.193517", "user_id": "a34683e1", "pregunta": "Que es CNN?\n", "respuesta": "Es un modelo de aprendizaje automático que imita la forma en que se ejecuta por conexiones de datos.", "uso_rag": "Sin RAG", "personality": "creativo"}
|
| 10 |
+
{"timestamp": "2025-11-23T21:16:05.149295", "user_id": "a34683e1", "pregunta": "Que es CNN?\n", "respuesta": "Una red neuronal en la que al menos una capa es una capa convolucional.", "uso_rag": "Con RAG", "personality": "creativo"}
|
| 11 |
+
{"timestamp": "2025-11-23T21:16:22.504877", "user_id": "a34683e1", "pregunta": "Para que sirve big data?", "respuesta": "Sirve para procesar, almacenar y analizar grandes volúmenes de datos imposibles de manejar con herramientas tradicionales.", "uso_rag": "Con RAG", "personality": "creativo"}
|
| 12 |
+
{"timestamp": "2025-11-23T21:16:27.914520", "user_id": "a34683e1", "pregunta": "Para que sirve big data?", "respuesta": "Sirve para descubrir patrones, tendencias y relaciones que apoyan la toma de decisiones grandes.", "uso_rag": "Sin RAG", "personality": "creativo"}
|
| 13 |
+
{"timestamp": "2025-11-23T21:16:35.944643", "user_id": "a34683e1", "pregunta": "Para que sirve big data?", "respuesta": "Sirve para almacenar, procesar y analizar grandes volmenes de datos con el fin de descubrir patrones, tendencias y relaciones que apoyan la toma de decisiones.", "uso_rag": "Sin RAG", "personality": "exacto"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|