File size: 5,494 Bytes
93b45b6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import numpy as np
import matplotlib.pyplot as plt
import random

# Oraci贸n de ejemplo y palabras posibles con sus probabilidades originales
oracion_incompleta = "El astronauta mir贸 hacia las estrellas y sinti贸 una profunda"
palabras_posibles = ["emoci贸n", "nostalgia", "curiosidad", "admiraci贸n", "soledad"]
probabilidades_originales = np.array([0.35, 0.25, 0.20, 0.15, 0.05])  # Suma = 1

def aplicar_temperatura(probs, temperatura):
    """Aplica la transformaci贸n de temperatura a las probabilidades."""
    if temperatura == 0:
        # Cuando la temperatura es 0, simplemente devuelve una distribuci贸n one-hot
        # para la palabra m谩s probable
        resultado = np.zeros_like(probs)
        resultado[np.argmax(probs)] = 1.0
        return resultado
    
    # Aplicar la f贸rmula de temperatura: p_i = exp(log(p_i)/T) / suma(exp(log(p_j)/T))
    log_probs = np.log(probs)
    exp_probs = np.exp(log_probs / temperatura)
    return exp_probs / np.sum(exp_probs)

def crear_grafico(temperatura):
    """Crea un gr谩fico de barras con las probabilidades ajustadas por temperatura."""
    # Aplicar temperatura a las probabilidades
    probs_ajustadas = aplicar_temperatura(probabilidades_originales, temperatura)
    
    # Crear figura
    fig, ax = plt.subplots(figsize=(10, 6))
    
    # Colores para las barras
    colores = ['#FF6B6B', '#4ECDC4', '#FFD166', '#6B5B95', '#88D8B0']
    
    # Crear gr谩fico de barras
    barras = ax.bar(palabras_posibles, probs_ajustadas, color=colores)
    
    # A帽adir valores en la parte superior de cada barra
    for barra in barras:
        altura = barra.get_height()
        ax.annotate(f'{altura:.3f}',
                    xy=(barra.get_x() + barra.get_width() / 2, altura),
                    xytext=(0, 3),  # 3 puntos de desplazamiento vertical
                    textcoords="offset points",
                    ha='center', va='bottom')
    
    # Configurar el gr谩fico
    ax.set_title(f'Probabilidades con temperatura = {temperatura:.2f}', fontsize=15)
    ax.set_ylabel('Probabilidad', fontsize=12)
    ax.set_ylim(0, 1.0)
    ax.grid(axis='y', linestyle='--', alpha=0.7)
    
    # Rotar etiquetas del eje x para mejor legibilidad
    plt.xticks(rotation=15)
    
    return fig

def muestrear_palabra(probs):
    """Muestrea una palabra basada en sus probabilidades."""
    return np.random.choice(palabras_posibles, p=probs)

def actualizar_interfaz(temperatura):
    """Actualiza la interfaz con el nuevo valor de temperatura."""
    # Crear gr谩fico actualizado
    grafico = crear_grafico(temperatura)
    
    # Actualizar probabilidades
    probs_ajustadas = aplicar_temperatura(probabilidades_originales, temperatura)
    
    return grafico, probs_ajustadas

def completar_oracion(probs):
    """Completa la oraci贸n muestreando una palabra seg煤n las probabilidades."""
    palabra_seleccionada = muestrear_palabra(probs)
    
    # Crear texto HTML para colorear la palabra seleccionada
    oracion_completa = f"{oracion_incompleta} <span style='color:#FF4500; font-weight:bold;'>{palabra_seleccionada}</span>."
    
    return oracion_completa

# Funci贸n principal que maneja la interacci贸n en la interfaz
def interfaz_temperatura(temperatura=1.0):
    grafico, probs = actualizar_interfaz(temperatura)
    return grafico, probs

# Funci贸n para manejar el bot贸n de muestreo
def muestrear_boton(probs):
    return completar_oracion(probs)

# Crear la interfaz Gradio
with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue")) as demo:
    gr.Markdown("# 馃敟 Demostraci贸n de Temperatura en LLMs")
    gr.Markdown("""
    Esta aplicaci贸n demuestra c贸mo la temperatura afecta a las probabilidades de selecci贸n en los modelos de lenguaje.
    
    **Temperatura baja** (cercana a 0): El modelo se vuelve m谩s determinista, eligiendo la palabra m谩s probable.
    
    **Temperatura alta** (mayor que 1): El modelo se vuelve m谩s aleatorio, dando m谩s oportunidad a palabras menos probables.
    """)
    
    # Mostrar la oraci贸n incompleta
    gr.Markdown(f"## Oraci贸n: *{oracion_incompleta}...*")
    
    # Variables de estado ocultas
    probs_state = gr.State([])
    
    with gr.Row():
        with gr.Column(scale=2):
            # Gr谩fico de probabilidades
            output_plot = gr.Plot(label="Distribuci贸n de Probabilidades")
            
            # Control deslizante para la temperatura
            temp_slider = gr.Slider(
                minimum=0.1, 
                maximum=2.0, 
                value=1.0, 
                step=0.1, 
                label="Temperatura",
                info="Desliza para ajustar la temperatura"
            )
        
        with gr.Column(scale=1):
            # Bot贸n para muestrear
            sample_button = gr.Button("Muestrear Palabra", variant="primary")
            
            # Mostrar oraci贸n completa
            output_text = gr.HTML(label="Oraci贸n Completada")
    
    # Configurar eventos y funciones
    temp_slider.change(
        fn=interfaz_temperatura, 
        inputs=[temp_slider], 
        outputs=[output_plot, probs_state]
    )
    
    sample_button.click(
        fn=muestrear_boton,
        inputs=[probs_state],
        outputs=[output_text]
    )
    
    # Inicializar la interfaz
    demo.load(
        fn=interfaz_temperatura,
        inputs=[temp_slider],
        outputs=[output_plot, probs_state]
    )

# Lanzar la aplicaci贸n
if __name__ == "__main__":
    demo.launch()