2 puntos por GN⁺ 2024-05-09 | 1 comentarios | Compartir por WhatsApp
  • Al generar respuestas largas, la decodificación autorregresiva (AR), que produce tokens uno por uno, es el principal cuello de botella de latencia; CLLM es un enfoque que busca reducirlo mediante decodificación paralela en bloques de n tokens
  • Consistency Large Language Models (CLLMs) ajustan finamente un LLM preentrenado para aprender a mapear rápidamente cualquier estado de n tokens a un punto fijo equivalente al resultado de AR greedy
  • Jacobi decoding converge teóricamente al mismo resultado que la generación AR greedy, pero en los LLM existentes solo ofrecía una mejora limitada de velocidad, de alrededor de 1.05 veces en promedio, por lo que era poco práctico
  • En experimentos con Spider, Human-Eval, GSM8k y MT-bench, CLLM mostró mejoras de velocidad de generación de 2.4 a 3.4 veces, y fue evaluado como comparable o superior a técnicas de inferencia rápida como Medusa2 y Eagle
  • Durante la inferencia no requiere componentes auxiliares del modelo ni cambios en la arquitectura del modelo objetivo, por lo que permite buscar mejoras de velocidad junto con eficiencia de memoria

El cuello de botella de decodificación al que apunta CLLM

  • Los LLM se usan en diversos ámbitos, como programación, derecho y consejos de salud, pero en la etapa de inferencia normalmente generan tokens uno por uno mediante decodificación autorregresiva (AR)
  • A medida que la respuesta se alarga, la generación token por token aumenta la latencia y extiende el tiempo de espera percibido por el usuario
  • Los métodos existentes de inferencia rápida suelen requerir modificaciones de arquitectura, componentes auxiliares o un modelo borrador para generar varios tokens a la vez

Cómo funciona Jacobi decoding y sus limitaciones

  • Jacobi decoding parte de iteraciones de punto fijo de Jacobi y Gauss-Seidel, y se demostró que en decodificación greedy es equivalente a la generación AR
  • Convierte la generación secuencial en un sistema de n variables y n ecuaciones no lineales, lo que permite calcularlo en paralelo mediante iteraciones de Jacobi
  • El flujo concreto es el siguiente
    • A partir del prompt de entrada, se adivinan aleatoriamente los siguientes n tokens
    • Se ingresan el prompt y la secuencia de n tokens al LLM para actualizarlos iterativamente
    • Cuando la secuencia deja de cambiar, se alcanza un punto fijo (fixed point)
    • La secuencia final de n tokens converge a la salida que habría generado la decodificación AR bajo la estrategia greedy
  • La ruta desde la conjetura aleatoria inicial hasta el resultado final de generación AR se denomina trayectoria de Jacobi (Jacobi trajectory)
  • El Jacobi decoding básico, en LLM reales, solo muestra una mejora limitada de velocidad de alrededor de 1.05 veces en promedio frente a la decodificación AR
    • A los LLM entrenados de forma AR les cuesta predecir correctamente los tokens posteriores si hay errores en los tokens anteriores
    • La mayoría de las iteraciones de Jacobi corrigen solo un token dentro de la secuencia de n tokens, lo que alarga la trayectoria
  • Lookahead decoding y speculative decoding buscan reducir la ineficiencia de Jacobi decoding y de la decodificación AR tradicional, pero generan costos adicionales de memoria durante la inferencia

Objetivo de entrenamiento de Consistency LLM

  • CLLM adapta un LLM preentrenado para que, desde cualquier punto de una trayectoria de Jacobi, avance de forma consistente hacia un punto fijo
  • Este objetivo es similar al de consistency models, una técnica de aceleración para modelos de difusión
  • Usando trayectorias de Jacobi recolectadas del modelo objetivo, entrena el modelo con una pérdida que fomenta la convergencia en un solo paso durante las iteraciones de Jacobi
  • El entrenamiento para convertir cada modelo objetivo en un CLLM consta de dos partes
    • Preparación de trayectorias de Jacobi
      • Para cada prompt, se ejecuta Jacobi decoding secuencialmente en cada segmento cortado en bloques de n tokens
      • La secuencia de respuesta completa queda formada por la concatenación de puntos fijos consecutivos
      • Cada secuencia generada dentro de la trayectoria se calcula como un elemento de datos de entrenamiento
      • Se usan cortes de n tokens para evitar la desaceleración de evaluar entradas largas completas en respuestas extensas
    • Optimización conjunta de consistency loss y AR loss
      • La consistency loss induce al modelo a predecir varios tokens a la vez
      • La AR loss evita que CLLM se aleje de la distribución del LLM objetivo y ayuda a mantener la calidad de generación

Composición de la función de pérdida

  • Se define el LLM objetivo como p y el CLLM como ; se inicializa con los parámetros de p
  • La pérdida de consistencia global (GC loss) induce a CLLM a emitir el punto fijo y* cuando se le da como entrada un estado arbitrario y de la trayectoria de Jacobi
  • La pérdida de consistencia local (LC loss) alinea estados adyacentes y(j) y y(j+1) de la trayectoria de Jacobi para que produzcan la misma salida
  • La distancia entre distribuciones D(·||·) sigue las opciones discutidas en el método GKD, y en estos experimentos se usa principalmente forward KL
  • La AR loss aplica una pérdida autorregresiva tradicional basada en el resultado de generación l del LLM objetivo p, para evitar que el modelo se aleje de la distribución del LLM objetivo
  • La pérdida total de entrenamiento se compone de la suma de la consistency loss y la AR loss ponderada por un peso w

Configuración experimental y resultados

  • Los experimentos incluyen tres tareas de dominios especializados y un benchmark de diálogo de dominio abierto
    • Spider: text-to-SQL
    • Human-Eval: completado de código Python
    • GSM8k: matemáticas
    • MT-bench: diálogo de dominio abierto
  • Según la tarea, se usaron como modelos objetivo un coder LLM fine-tuned, Deepseek-coder-7B-instruct, LLaMA-2-7B y ABEL-7B-001
  • Tanto el entrenamiento como la evaluación se realizaron en servidores NVIDIA A100 40GB
  • En los dominios especializados, CLLM mostró la mayor mejora de velocidad frente a líneas base como el modelo objetivo original, Medusa2 y speculative decoding
  • En MT-bench, un CLLM entrenado sobre LLaMA2-7B con el dataset ShareGPT logró, al combinarse con lookahead decoding, una mejora de velocidad similar a Medusa2
    • La puntuación de MT-bench también fue comparable
    • CLLM no requiere modificar la arquitectura original del modelo objetivo
    • Al no tener componentes auxiliares, ofrece mayor eficiencia de memoria

Costo de entrenamiento

  • El costo de ajuste fino de CLLM se presenta como de nivel intermedio
  • LLaMA-7B logró una mejora de velocidad de 3.4 veces en el dataset Spider tras procesar solo alrededor de 1 millón de tokens
  • En datasets grandes como CodeSearchNet-Python, se usó solo el 10% del dataset para generar trayectorias de Jacobi y se obtuvo una mejora de velocidad de alrededor de 2.5 veces
  • El número total de tokens se estima con la siguiente fórmula
    • Número promedio de trayectorias por prompt × longitud promedio de trayectoria × número de prompts
  • Los costos de entrenamiento estimados por dataset son los siguientes
    • Spider: 2 millones de tokens, < 0.01% del costo de preentrenamiento
    • CodeSearchNet-Python: 100 millones de tokens, ~0.1% del costo de preentrenamiento
    • GSM8K: 10 millones de tokens, ~0.01% del costo de preentrenamiento
    • ShareGPT: 200 millones de tokens, ~0.2% del costo de preentrenamiento

Avance rápido y tokens estacionarios

  • El LLM objetivo normalmente genera solo un token correcto en una iteración de Jacobi
  • En CLLM aparece el fenómeno de avance rápido (fast forwarding), donde se predicen correctamente varios tokens consecutivos en una sola iteración de Jacobi
  • En el LLM objetivo, incluso tokens generados correctamente antes pueden cambiar a tokens incorrectos en iteraciones posteriores
  • CLLM muestra la capacidad de predecir por adelantado tokens correctos aunque haya errores en tokens anteriores, y de mantener esos tokens después
    • A estos tokens se les llama tokens estacionarios (stationary tokens)
  • El avance rápido y los tokens estacionarios hacen que el Jacobi decoding de CLLM converja más rápido y contribuyen a mejorar la velocidad de generación

Aprendizaje de patrones lingüísticos

  • Se observó que CLLM adquiere mediante el entrenamiento el concepto lingüístico de colocaciones (collocations)
  • Las colocaciones son secuencias de palabras o términos que aparecen juntos con más frecuencia de la que cabría esperar por azar
  • Hay ejemplos de colocaciones tanto en lenguaje natural como en código
    • Lenguaje natural: talk to, remind … of …
    • Estructura verbo+sustantivo: make a decision, catch a cold
    • Estructuras gramaticales por dominio: SELECT … FROM …, if … else
  • El objetivo de consistency generation alienta a CLLM a inferir estas estructuras desde cualquier punto de la trayectoria de Jacobi y a predecir varias palabras simultáneamente para reducir los pasos de iteración

Materiales y código

1 comentarios

 
GN⁺ 2024-05-09
Opiniones de Hacker News
  • Se parece a mi experiencia cuando tomé una clase de "dibujo libre" (sin clases teóricas)
    Desde chico me decían que dibujaba bien, pero en realidad recuerdo que repetía dibujos detallados parecidos a otros que ya había hecho, o que me tomaba muchísimo tiempo hacerlos. Creo que, con suficiente tiempo y paciencia, cualquiera puede dibujar una escena de forma bastante convincente
    En la clase no había reglas ni lecciones; cada quien llevaba los materiales que quería. Algunos llevaban tinta, otros lápices, yo llevé carboncillo, y lo único fijo era el tiempo entre las poses del modelo. Las primeras poses eran muy cortas, de más o menos 1 minuto, y luego se iban alargando hasta poses de 5 minutos; en cualquier momento podías romper el dibujo y volver a dibujar la misma pose
    Los calentamientos cortos en realidad te obligaban a acertar proporciones y contornos al primer intento y, contrario a la idea común de que apurarse arruina todo, parece que al aprender o pulir una habilidad la prisa funciona como un factor de estrés que induce atención y aprendizaje
    Antes de la clase probablemente podía hacer dibujos de calidad similar, pero estoy seguro de que me habrían tomado 5 a 10 veces más. Funcionó el hecho de que te obligaran a no darle vueltas y a sentir el costo de los errores por apurarte
    Dicho eso, me da pena que llamen a esta técnica Consistency. El nombre encaja con mejoras de rendimiento, pero me parece menos adecuado para una mejora en la velocidad de inferencia; entiendo que significa "consistencia con el resultado que eventualmente habría salido si se generara un token a la vez". Preferiría llamarlo Proficiency LLM, esperando la misma salida pero sin la inhibición de llegar a tientas a la misma conclusión

    • Como autor de CLLM, gracias por compartir tu experiencia y tus ideas. El proceso de pulir la habilidad para dibujar se parece al proceso de entrenamiento de CLLM, aunque el factor de estrés del entrenamiento actual de CLLM no es algo que se vuelva cada vez más exigente
      En dibujo puedes fijar un tiempo permitido para cada intento e ir acortándolo. En CLLM, quizá podríamos hacer más difícil el proceso de entrenamiento haciendo que estados cada vez más lejanos en la trayectoria de Jacobi se mapeen al estado final
      El término "consistency" viene de la similitud entre los consistency models de generación de imágenes por difusión y consistency LLM, y de que sus procesos de entrenamiento son parecidos
    • Tuve una experiencia interesante un verano en una clase de laboratorio de zoología de invertebrados
      Los estudiantes entrábamos al laboratorio, recibíamos un espécimen, y la única instrucción era: "dibujen esto en 30 minutos. Empiecen"
      No había cosas como "así se dibuja" ni "haz esto y no hagas aquello"; en la práctica era más bien: "no importa si te da ansiedad o si crees que no sabes dibujar. No pongas excusas, solo dibuja. Ahora"
      Todos dibujamos y, durante todo el verano, a medida que llegaban más animales y repetíamos el mismo entrenamiento, todos mejoramos muchísimo
      Lo que esa clase me enseñó es que cualquiera, realmente cualquiera, puede dibujar. La actitud colectiva cambió de "no sé si esto sea posible" a "claro que se puede. Es fácil, cotidiano y no es nada del otro mundo"
      Es un enfoque que recomendaría mucho, y fue una de las clases más liberadoras y sorprendentes que tomé en la universidad
    • Los sistemas normalmente se vuelven más eficientes cuando están bajo estrés. Al mismo tiempo, también pueden quedar empujados hacia óptimos locales, así que todo tiene pros y contras
  • Los autores dicen que la decodificación Jacobi es equivalente a la decodificación autorregresiva voraz, pero en la práctica muchas veces uno quiere que la temperatura de muestreo sea mayor que 0 para evitar repeticiones y respuestas demasiado genéricas, ¿no?
    No conozco nada de esta estrategia de decodificación, así que quizá me estoy perdiendo una forma simple de incorporar esto

    • Buena pregunta. Estamos trabajando activamente para soportar también otras estrategias de muestreo que no sean el muestreo voraz
      En el contexto del entrenamiento de CLLM, en vez de mapear como objetivo de entrenamiento un punto fijo estático obtenido con decodificación Jacobi, lo llamamos punto fijo dinámico. Pueden seguir el repositorio de GitHub para ver los avances
    • Estoy de acuerdo. Es fácil comprobar si un token fue la opción de máximo valor, pero parece difícil comprobar si un token apareció con la probabilidad deseada
      Un paso de fine-tuning que entrene la trayectoria para acercarse a una completación de n tokens con las estadísticas deseadas todavía podría ser posible, pero no tengo claro cómo se podría reemplazar el paso de verificación de punto fijo. Tal vez podría ser algo como "comprobar si estaba por encima de este umbral fijo de verosimilitud"
  • Se siente como una optimización bastante riesgosa para hacer antes de entender realmente qué ocurre dentro de un LLM. Por ejemplo, quienes creen en una interpretación geométrica tendrían algo que decir, y en casos donde se usen tokens de "relleno" también podría ser perjudicial
    Además, la suposición de que "uno arma una oración completa en la mente y luego la dice palabra por palabra" no es un hecho universal, sino solo una suposición, y me parece que simplifica demasiado la actividad que ocurre en nuestra mente. ¿De verdad tenemos un plan completo antes de hablar o escribir? Como budista, lo veo más cercano a una ilusión. Más aún, ¿qué pasa con los pensamientos simultáneos? ¿Pensamos linealmente a nivel de oraciones?
    En cualquier caso, las matemáticas están bastante geniales

    • Esta optimización no afecta el resultado del LLM y se garantiza que produce un resultado equivalente al de la decodificación directa
      No tratemos a los LLM como algo mágico parecido a nuestra mente. Son simplemente otro programa que genera oraciones con sentido
    • Esa suposición podría ser útil en este contexto, pero parece bastante claro que no es cierta
      Si le pides a alguien que explique un evento complejo del pasado con varias ramificaciones, la gente inserta rápidamente fragmentos, aclaraciones y ramales a mitad de una oración para abarcar todo el evento. No creo haber visto la hipótesis de granularidad a nivel de oración en un contexto científico serio
    • No puedo decir que aplique a todo el mundo, pero al menos yo no formo una oración completa en mi cabeza antes de hablar
      A veces, a mitad de una oración, termino en un callejón sin salida gramatical y tengo que cerrar la idea con una palabra o frase incómoda, o simplemente me detengo y vuelvo a decirlo desde el principio
    • Aunque las palabras pueden dividirse en unidades más pequeñas que tienen significado en varios idiomas, no parece que construyamos las palabras secuencialmente a partir de esos componentes inferiores
      Tampoco parece haber una razón clara por la que este fenómeno se rompa de repente a nivel de oración
    • Me da curiosidad qué es la interpretación geométrica
  • Sorprende que no esté recibiendo más atención. Esto parece una ganancia clara en rendimiento de inferencia
    El costo de este fine-tuning es razonable, alrededor del 0.01% del costo original de preentrenamiento. Las ganancias de rendimiento también parecen bastante consistentes

    • Parece un resultado muy importante para el rendimiento de los LLM
      No conozco bien otro paper que haya sugerido que se puede mejorar tanto el rendimiento de inferencia de los LLM. ¿Hubo alguno antes?
      Más aún bajo las condiciones de mantener al menos la calidad de salida, mejorar no solo la latencia de las consultas sino también el throughput total, no requerir cómputo adicional y tener una implementación relativamente práctica que no agregue mucha complejidad
      Como se construye sobre el trabajo hecho en decodificación paralela/Jacobi, la intuición en sí podría verse como incremental. Los resultados anteriores también fueron necesarios e importantes, pero este resultado podría ser el que extrajo valor real de las posibilidades de la decodificación paralela
    • Ganancias de inferencia similares o mayores ya se obtienen con la decodificación especulativa, que se usa ampliamente
      Así que este trabajo es realmente interesante y, hasta donde sé, ya se había intentado antes con menos éxito, pero todavía no está claro cuánto impacto real tendrá
    • Gracias por interesarte en nuestro trabajo. Incluso entrenando solo una parte del dataset con consistency loss + AR loss, obtuvimos una mejora considerable de velocidad, y el costo fue de alrededor del 0.01% del preentrenamiento
      Si se entrena con más datos, la velocidad aumenta aún más. Esto se debe a que el modelo puede aprender de colocaciones y frases que aparecen con más frecuencia
      Para más detalles, se puede ver el paper, y también se confirma que la mejora de velocidad se satura a medida que crece el tamaño de los datos de entrenamiento
  • Al principio pensé que era un paper tipo Medusa, que usa más unembed heads para adivinar tokens posteriores, pero no tenía nada que ver
    Es realmente impresionante. No usa parámetros adicionales, solo agrega una pérdida auxiliar de entrenamiento

    • Lo único que Medusa y CLLM tienen en común es que ambos entrenan/adaptan un LLM para una inferencia rápida
      Las técnicas de entrenamiento y de decodificación son completamente distintas y, como señalas, CLLM no necesita parámetros adicionales ni configurar máscaras de atención para verificación basada en árboles
  • Creo que pronto nos daremos cuenta de que no necesariamente hay que entrenar modelos
    Lo que se necesita es buena indexación y muestreo
    En esencia, en cierto nivel todos los LLM pueden verse como una base de datos del dataset, con una excelente interfaz de lenguaje natural encima
    Ambos son simplemente distintas formas de explorar datos almacenados

    • Los LLM pueden crear fácilmente datos que no están en el dataset de entrenamiento
      Los LLM no exploran datos almacenados. Un LLM no es una base de datos de los datos de entrenamiento
    • Pero la indexación también es entrenamiento. Solo que no usa descenso por gradiente de extremo a extremo
    • Como el modelo es varios órdenes de magnitud más pequeño que una versión comprimida de los datos de entrenamiento, no puede ser equivalente a esa base de datos
    • Entonces quizá te guste el paper de Infinigram. Se discutió recientemente
      https://news.ycombinator.com/item?id=40266791
  • ¿Hay algún lugar donde alguien que no sabe mucho, como yo, pueda "preguntarle a un experto en IA"?
    Por ejemplo, me gustaría preguntar por qué un LLM no responde de la misma forma determinista aunque reciba el mismo prompt
    Quiero aprender esto, y tal vez debería seguir algún video de YouTube tipo "crear un LLM en 1 hora"

    • En el software hay literalmente un generador de números aleatorios que elige una de las siguientes opciones de token ponderadas que produce el modelo
      El proceso de selección puede tener varias perillas para manipular la respuesta. Si quieres hacerlo determinista y tienes acceso directo al software, según el software que uses, configurarlo como top-k = 1 o temperature = 0.0 lo vuelve determinista
      Normalmente la configuración por defecto no es determinista, porque si lo haces completamente determinista, la calidad de los resultados tiende a no ser muy buena
    • Para esa respuesta, conviene ver los videos de 3blue1brown
      Un modelo LLM produce un vector de probabilidades sobre tokens, y el usuario del LLM usa números aleatorios para elegir un token de la lista de opciones más probables
    • Porque un LLM es, en esencia, una matriz probabilística
      Cuando ingresas un prompt, calcula la probabilidad de la siguiente palabra y repite ese proceso hasta terminar formando una oración. Las probabilidades aprendidas se basan en los datos de entrenamiento
      Debido a este modelo probabilístico de base, no es 100% determinista. Además, modelos como ChatGPT agregan deliberadamente aleatoriedad a todo el proceso mediante un parámetro temperature
      Si quieres leer más, esta respuesta se basó en el siguiente paper: The Matrix: A Bayesian learning model for LLMs, https://arxiv.org/abs/2402.03175
    • En la mayoría de los sistemas esto se puede controlar con un parámetro de configuración de inferencia llamado temperature
      Pero si ajustas la temperatura lo más bajo posible, la calidad de las respuestas tiende a caer mucho. El sistema queda atrapado en algún óptimo local y empieza a repetirse. Esas respuestas pueden ser "deterministas", pero no son buenas
    • Este artículo fue un buen punto de partida: explica de forma bastante sistemática sin perder de vista el panorama general
      https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-...
  • No hay almuerzo gratis, así que, a mi modo de ver, aquí también hay alguna pérdida de rutas
    Por ejemplo, algunas trayectorias de Jacobi, por definición, excluyen rutas de mayor temperatura. Desde el punto de vista de recuperación de datos, esto podría incluso ser positivo, pero si quieres maximizar la creatividad, podría ser negativo

    • Hay mejores algoritmos y peores algoritmos
      No sé si "no hay almuerzo gratis" siempre se aplica de una manera especialmente significativa. Algunas cosas no están en la frontera de Pareto
  • Me gustaría ver una explicación más detallada sobre la parte de que “los métodos de decodificación especulativa tienen un costo adicional de memoria durante la inferencia”.
    En la decodificación especulativa, un modelo más pequeño genera “ramas” que pueden ser rápidas pero imprecisas, y luego un modelo grande verifica esas ramas. Pero la decodificación especulativa solo requiere la memoria correspondiente a un único token, y los tokens de las otras ramas simplemente se enmascaran durante la inferencia. Si tienes un tamaño de contexto de 1000 y unas 30 ramas de 5 tokens, el overhead de memoria es de 3%, algo despreciable. Si el tamaño del contexto es mucho menor que la cantidad de ramas, me pregunto si a un usuario de un LLM generativo con una ventana de contexto de apenas 50 tokens realmente le importará la velocidad de generación.
    Además, la técnica de decodificación especulativa no está limitada al muestreo codicioso. Debe comportarse exactamente igual que el modelo original y muestrear según la probabilidad esperada. La mayor parte de la literatura sobre decodificación especulativa ya reporta mejoras de velocidad de 2.6 a 3.5 veces. Esta publicación del blog reporta una velocidad de generación 2.4 a 3.4 veces mayor, así que no sé si sea una mejora tan grande.
    Arriba mencioné la decodificación especulativa, y las técnicas que comparó el autor parecen ser Medusa2 y Eagle, pero el problema central sigue siendo el mismo. Sea cual sea el método que se use para predecir tokens por adelantado, hay ciertos puntos en los que se necesita absolutamente el token anterior antes de predecir el siguiente. Esto no es un problema del modelo o de la técnica, sino de qué es matemáticamente posible. Si la distribución de probabilidad del quinto token siguiente depende en gran medida de los cuatro tokens anteriores, ¿cómo se pueden predecir 5 tokens de una sola vez? Da igual si es decodificación especulativa, decodificación de Jacobi o decodificación paralela de múltiples tokens.
    Si este método solo soporta muestreo codicioso, me pregunto cuál es su ventaja. Más aún considerando que otras técnicas ya están logrando las mejoras de velocidad esperadas. Comparar la aceleración del muestreo codicioso con la aceleración del muestreo aleatorio es comparar peras con manzanas, y dudo que, incluso después de adaptar este método al muestreo aleatorio, se mantenga la misma mejora de velocidad debido al problema central mencionado arriba.

    • La parte de que “se necesita absolutamente el token anterior antes de predecir el siguiente token” quizá sea la contribución central de este paper.
      Puede que con consistency training hayan mostrado que, aunque haya predicciones erróneas en los tokens anteriores, el LLM puede predecir los siguientes n tokens.
      Por otro lado, matemáticamente es cierto que p(x_t|x_1,...,x_t-1) depende de todos los elementos desde x_1 hasta x_t-1, pero en la práctica quizá para predecir x_t solo se necesiten x_1 hasta x_t-2, y la atención sobre x_t-1 sea mínima. Por eso se podría predecir x_t usando x_1 hasta x_t-2 y un x_t-1 impreciso.
    • La decodificación especulativa requiere cargar en memoria un modelo más pequeño y ejecutar inferencia con ese modelo.
  • Es un contenido interesante. Es una idea que mucha gente probablemente habría pensado, pero el artículo y la presentación estaban bien organizados.

    • Sí. Mi compañero de cuarto y yo hablamos de algo así hace un año. También se podría hacer algo parecido con el steering de LLM.