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