File size: 6,904 Bytes
8c33d3d
b97637a
14bdb7b
b98df22
9c7049a
8c33d3d
b97637a
74a8958
b97637a
8c33d3d
39ea17a
 
14bdb7b
9d13f0d
b98df22
81f1877
 
b97637a
 
81f1877
8c33d3d
b97637a
 
 
 
81f1877
8c33d3d
 
b97637a
81f1877
8c33d3d
b97637a
 
 
8c33d3d
9d13f0d
 
ee8e544
b98df22
ff74457
43b0329
7c8ecc7
ff74457
 
7c8ecc7
 
 
ff74457
 
 
7c8ecc7
 
ff74457
 
7c8ecc7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ff74457
 
7c8ecc7
 
 
ff74457
 
8b4eecf
ff74457
 
7c8ecc7
 
 
 
 
 
 
 
 
 
 
 
 
ff74457
7c8ecc7
 
 
 
 
378e2c2
ff74457
ee8e544
ff74457
 
 
ee8e544
ff74457
ee8e544
ff74457
b97637a
ff74457
ee8e544
 
 
 
ff74457
 
 
 
 
8c33d3d
ee8e544
f0127ed
 
78d44cd
f0127ed
 
ee8e544
d5d6180
78d44cd
b98df22
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
import gradio as gr
import torch
import os
from spaces import GPU
from transformers import AutoModelForCausalLM, AutoTokenizer

# Configuración del modelo
model_id = "somosnlp-hackathon-2025/leia_preference_model_social_norms"
device = "cuda" if torch.cuda.is_available() else "cpu"

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id).to(device)


@GPU
def respond(message, history, system_message, max_tokens, temperature, top_p):
    prompt = system_message + "\n"
    for user, assistant in history:
        prompt += f"Usuario: {user}\nAsistente: {assistant}\n"
    prompt += f"Usuario: {message}\nAsistente:"

    inputs = tokenizer(prompt, return_tensors="pt").to(device)

    output = model.generate(
        **inputs,
        max_new_tokens=max_tokens,
        temperature=temperature,
        top_p=top_p,
        pad_token_id=tokenizer.eos_token_id,
    )

    decoded = tokenizer.decode(output[0], skip_special_tokens=True)
    respuesta = decoded[len(prompt):].strip()
    return respuesta





# Descripción del proyecto
descripcion = """

# 💬 LeIA GO: Explorando las variedades del español con NLP

El proyecto **LeIA GO** surge con la visión de impulsar una inteligencia artificial que refleje la riqueza y diversidad del idioma español en todas sus formas. Aunque el español es una de las lenguas más habladas a nivel global, sus múltiples variantes regionales y culturales no siempre están bien representadas en los modelos de lenguaje actuales, que tienden a centrarse en el inglés o en una versión estándar del español.

Buscamos crear una herramienta accesible y práctica que permita explorar y entender las diferentes variedades dialectales del español, desde expresiones coloquiales hasta estructuras gramaticales específicas de distintas regiones. Así, pretendemos democratizar el acceso a recursos lingüísticos avanzados, fomentando el conocimiento, la educación y la preservación cultural en las comunidades hispanohablantes.


### 🚀 Motivación
El proyecto nace con el propósito de analizar y representar las diferencias lingüísticas y culturales entre las distintas variedades del español. Al entender mejor estas variaciones, aspiramos a desarrollar modelos de lenguaje natural que sean más precisos, inclusivos y adaptados a las necesidades reales de los hablantes de español en todas sus formas.


### 🌍 Impacto
En la actualidad, gran parte del desarrollo en procesamiento del lenguaje natural está dominado por el inglés, dejando al español y sus múltiples variantes con recursos limitados. **LeIA GO** busca contribuir a cerrar esta brecha, mejorando la calidad y diversidad de los datos disponibles en español. Esto facilitará la creación de tecnologías lingüísticas más justas, inclusivas y efectivas, beneficiando a millones de usuarios en todo el mundo y apoyando la diversidad cultural y lingüística del idioma.


## 🧠 Proceso de entrenamiento y pruebas

Para el desarrollo de LeIA GO, utilizamos el modelo preentrenado **BSC-LT/salamandra-7b-instruct**, una arquitectura de lenguaje causal basada en 7 mil millones de parámetros especializada en español.

El entrenamiento y ajuste fino se realizaron usando técnicas de LoRA (Low-Rank Adaptation) mediante la librería `peft`, configurando un `LoraConfig` para adaptar el modelo sin necesidad de reentrenarlo completamente. La librería `transformers` se usó para cargar el modelo y el tokenizador, mientras que `datasets` sirvió para gestionar los datos de entrenamiento.

Los datos consistieron en **prompts creados manualmente por nuestro equipo**, diseñados para capturar diversidad lingüística y estructural del español.

El proceso de entrenamiento se ejecutó con `DPOTrainer` y configuración `DPOConfig` de la librería `trl`, optimizando el modelo para mejor desempeño en tareas instructivas. Además, se implementó optimización con `BitsAndBytesConfig` para manejo eficiente de memoria y velocidad.

Como herramientas de soporte utilizamos `transformers`, `datasets`, `gradio` para la interfaz, y `jupyterlab` para el desarrollo y experimentación.


### 🧪 Funcionalidades actuales
- Evaluación y corrección de textos  
- Análisis lingüístico con enfoque cultural  
- Adaptación del lenguaje a regiones  
- Demo interactiva con Gradio

### 🎯 Objetivo de desarrollo sostenible (ODS)
Este proyecto contribuye al ODS 4: Educación de Calidad, promoviendo el acceso a recursos lingüísticos diversos que favorezcan la educación y la inclusión cultural a través del lenguaje.

## 📜 Licencia

Este proyecto está licenciado bajo la Licencia Apache 2.0, que permite el uso, modificación y distribución libres, garantizando al mismo tiempo protección legal y reconocimiento a los autores. Puedes consultar el texto completo de la licencia en el archivo [LICENSE](./LICENSE).

## ⚖️ Evaluación de sesgos del modelo

En **LeIA GO**, somos conscientes de que los modelos de lenguaje pueden reflejar sesgos presentes en los datos de entrenamiento. Para minimizar estos riesgos:

- Los datos de entrenamiento consistieron en prompts creados manualmente por nuestro equipo, intentando cubrir diversidad lingüística y cultural dentro del español, para evitar la predominancia de un solo dialecto o registro.
- Reconocemos que, pese a estas precauciones, el modelo puede reflejar sesgos por la naturaleza limitada y selectiva del dataset.
- Estamos abiertos a retroalimentación para identificar y corregir posibles sesgos en futuras iteraciones.
- Próximamente planeamos implementar análisis cuantitativos más formales para evaluar sesgos específicos en el modelo.

### 👥 Equipo
- Susana Zhou (Español peninsular)  
- Constanza Jeldres (Español de Chile)  

### 💻 Datasets y modelos utilizados  
- Dataset: [https://huggingface.co/datasets/somosnlp-hackathon-2025/dataset-preferencias-v0] 
"""

# Interfaz con Gradio
with gr.Blocks() as demo:
    with gr.Tab("Descripción del Proyecto"):
        gr.Markdown(descripcion)

    with gr.Tab("Chatbot LeIA GO"):
        gr.Markdown("### 👋 Bienvenida a LeIA GO\nChatea con una IA especializada en normas sociales y variantes del español.")
        gr.ChatInterface(
            respond,
            additional_inputs=[
                gr.Textbox(
                    value="Eres una asistente lingüística especializada en español regional.",
                    label="Mensaje del sistema"
                ),
                gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
                gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
                gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p (nucleus sampling)"),
            ],
        )

# Lanzamiento
demo.launch(
    show_api=False,
    share=False
)