yabramuvdi commited on
Commit
93b45b6
verified
1 Parent(s): aa9146c

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +152 -0
app.py ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import numpy as np
3
+ import matplotlib.pyplot as plt
4
+ import random
5
+
6
+ # Oraci贸n de ejemplo y palabras posibles con sus probabilidades originales
7
+ oracion_incompleta = "El astronauta mir贸 hacia las estrellas y sinti贸 una profunda"
8
+ palabras_posibles = ["emoci贸n", "nostalgia", "curiosidad", "admiraci贸n", "soledad"]
9
+ probabilidades_originales = np.array([0.35, 0.25, 0.20, 0.15, 0.05]) # Suma = 1
10
+
11
+ def aplicar_temperatura(probs, temperatura):
12
+ """Aplica la transformaci贸n de temperatura a las probabilidades."""
13
+ if temperatura == 0:
14
+ # Cuando la temperatura es 0, simplemente devuelve una distribuci贸n one-hot
15
+ # para la palabra m谩s probable
16
+ resultado = np.zeros_like(probs)
17
+ resultado[np.argmax(probs)] = 1.0
18
+ return resultado
19
+
20
+ # Aplicar la f贸rmula de temperatura: p_i = exp(log(p_i)/T) / suma(exp(log(p_j)/T))
21
+ log_probs = np.log(probs)
22
+ exp_probs = np.exp(log_probs / temperatura)
23
+ return exp_probs / np.sum(exp_probs)
24
+
25
+ def crear_grafico(temperatura):
26
+ """Crea un gr谩fico de barras con las probabilidades ajustadas por temperatura."""
27
+ # Aplicar temperatura a las probabilidades
28
+ probs_ajustadas = aplicar_temperatura(probabilidades_originales, temperatura)
29
+
30
+ # Crear figura
31
+ fig, ax = plt.subplots(figsize=(10, 6))
32
+
33
+ # Colores para las barras
34
+ colores = ['#FF6B6B', '#4ECDC4', '#FFD166', '#6B5B95', '#88D8B0']
35
+
36
+ # Crear gr谩fico de barras
37
+ barras = ax.bar(palabras_posibles, probs_ajustadas, color=colores)
38
+
39
+ # A帽adir valores en la parte superior de cada barra
40
+ for barra in barras:
41
+ altura = barra.get_height()
42
+ ax.annotate(f'{altura:.3f}',
43
+ xy=(barra.get_x() + barra.get_width() / 2, altura),
44
+ xytext=(0, 3), # 3 puntos de desplazamiento vertical
45
+ textcoords="offset points",
46
+ ha='center', va='bottom')
47
+
48
+ # Configurar el gr谩fico
49
+ ax.set_title(f'Probabilidades con temperatura = {temperatura:.2f}', fontsize=15)
50
+ ax.set_ylabel('Probabilidad', fontsize=12)
51
+ ax.set_ylim(0, 1.0)
52
+ ax.grid(axis='y', linestyle='--', alpha=0.7)
53
+
54
+ # Rotar etiquetas del eje x para mejor legibilidad
55
+ plt.xticks(rotation=15)
56
+
57
+ return fig
58
+
59
+ def muestrear_palabra(probs):
60
+ """Muestrea una palabra basada en sus probabilidades."""
61
+ return np.random.choice(palabras_posibles, p=probs)
62
+
63
+ def actualizar_interfaz(temperatura):
64
+ """Actualiza la interfaz con el nuevo valor de temperatura."""
65
+ # Crear gr谩fico actualizado
66
+ grafico = crear_grafico(temperatura)
67
+
68
+ # Actualizar probabilidades
69
+ probs_ajustadas = aplicar_temperatura(probabilidades_originales, temperatura)
70
+
71
+ return grafico, probs_ajustadas
72
+
73
+ def completar_oracion(probs):
74
+ """Completa la oraci贸n muestreando una palabra seg煤n las probabilidades."""
75
+ palabra_seleccionada = muestrear_palabra(probs)
76
+
77
+ # Crear texto HTML para colorear la palabra seleccionada
78
+ oracion_completa = f"{oracion_incompleta} <span style='color:#FF4500; font-weight:bold;'>{palabra_seleccionada}</span>."
79
+
80
+ return oracion_completa
81
+
82
+ # Funci贸n principal que maneja la interacci贸n en la interfaz
83
+ def interfaz_temperatura(temperatura=1.0):
84
+ grafico, probs = actualizar_interfaz(temperatura)
85
+ return grafico, probs
86
+
87
+ # Funci贸n para manejar el bot贸n de muestreo
88
+ def muestrear_boton(probs):
89
+ return completar_oracion(probs)
90
+
91
+ # Crear la interfaz Gradio
92
+ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue")) as demo:
93
+ gr.Markdown("# 馃敟 Demostraci贸n de Temperatura en LLMs")
94
+ gr.Markdown("""
95
+ Esta aplicaci贸n demuestra c贸mo la temperatura afecta a las probabilidades de selecci贸n en los modelos de lenguaje.
96
+
97
+ **Temperatura baja** (cercana a 0): El modelo se vuelve m谩s determinista, eligiendo la palabra m谩s probable.
98
+
99
+ **Temperatura alta** (mayor que 1): El modelo se vuelve m谩s aleatorio, dando m谩s oportunidad a palabras menos probables.
100
+ """)
101
+
102
+ # Mostrar la oraci贸n incompleta
103
+ gr.Markdown(f"## Oraci贸n: *{oracion_incompleta}...*")
104
+
105
+ # Variables de estado ocultas
106
+ probs_state = gr.State([])
107
+
108
+ with gr.Row():
109
+ with gr.Column(scale=2):
110
+ # Gr谩fico de probabilidades
111
+ output_plot = gr.Plot(label="Distribuci贸n de Probabilidades")
112
+
113
+ # Control deslizante para la temperatura
114
+ temp_slider = gr.Slider(
115
+ minimum=0.1,
116
+ maximum=2.0,
117
+ value=1.0,
118
+ step=0.1,
119
+ label="Temperatura",
120
+ info="Desliza para ajustar la temperatura"
121
+ )
122
+
123
+ with gr.Column(scale=1):
124
+ # Bot贸n para muestrear
125
+ sample_button = gr.Button("Muestrear Palabra", variant="primary")
126
+
127
+ # Mostrar oraci贸n completa
128
+ output_text = gr.HTML(label="Oraci贸n Completada")
129
+
130
+ # Configurar eventos y funciones
131
+ temp_slider.change(
132
+ fn=interfaz_temperatura,
133
+ inputs=[temp_slider],
134
+ outputs=[output_plot, probs_state]
135
+ )
136
+
137
+ sample_button.click(
138
+ fn=muestrear_boton,
139
+ inputs=[probs_state],
140
+ outputs=[output_text]
141
+ )
142
+
143
+ # Inicializar la interfaz
144
+ demo.load(
145
+ fn=interfaz_temperatura,
146
+ inputs=[temp_slider],
147
+ outputs=[output_plot, probs_state]
148
+ )
149
+
150
+ # Lanzar la aplicaci贸n
151
+ if __name__ == "__main__":
152
+ demo.launch()