Spaces:
Sleeping
Sleeping
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() |