097_sammo_testing_and_optimization - IUGO-Studio/tech-ia GitHub Wiki
Resumen general:
El video continúa explorando la biblioteca SAMMO de Microsoft, centrándose ahora en la optimización de prompts. Se demuestran dos enfoques: 1) pruebas A/B (comparando dos variaciones de un prompt) y 2) optimización automática utilizando el operador EnumerativeSearch
y BeamSearch
de SAMMO. El ejemplo práctico sigue siendo la clasificación de transacciones bancarias. Se enfatiza la importancia de tener un buen sistema de evaluación antes de intentar optimizar los prompts.
Conceptos clave:
- SAMMO: Una biblioteca de Microsoft para la creación, prueba y optimización de prompts.
-
Runner: En SAMMO, un objeto que se utiliza para ejecutar un modelo de lenguaje (ej:
OpenAIChat
para la API de OpenAI). -
Component: En SAMMO, un bloque de construcción básico para crear prompts y procesar respuestas (ej:
GenerateText
,Output
,DataTable
,ExtractRegex
,MetaPrompt
,EmbeddingFewShotExamples
). - DataTable: Un componente de SAMMO que permite ejecutar un prompt en paralelo sobre un conjunto de datos.
- MetaPrompt: Un componente de SAMMO que simplifica la creación de prompts complejos, permitiendo definir secciones como instrucciones, ejemplos, etiquetas de salida, etc.
- Evaluación (Evaluation): El proceso de medir la calidad de las respuestas generadas por un modelo.
- EvaluationScore: Un componente de SAMMO que representa una puntuación de evaluación.
- Pruebas A/B (A/B Testing): Comparar dos o más variaciones de un prompt para determinar cuál produce mejores resultados.
- EnumerativeSearch: Un operador de SAMMO que prueba todas las combinaciones posibles de un conjunto de opciones (en este caso, dos variaciones de las instrucciones del prompt).
-
BeamSearch: Un operador de SAMMO que explora iterativamente diferentes variaciones de un prompt, utilizando una estrategia de búsqueda en haz ("beam search") para encontrar las mejores opciones. Es más sofisticado que
EnumerativeSearch
. - Prompt Engineering: El arte de diseñar prompts.
- LLM: Modelo de lenguaje extenso.
- Minibatching: Ejecutar en simultaneo un conjunto de prompts.
Ejemplos prácticos:
-
Pruebas A/B:
- Se definen dos variaciones de las instrucciones del prompt: una versión original y una versión modificada con la frase "This is very important to my career".
- Se utiliza el operador
OneOf
de SAMMO para crear un "espacio de prompts" ("prompt space") que contiene las dos variaciones. - Se utiliza el operador
EnumerativeSearch
para ejecutar el prompt con cada variación y evaluar su precisión utilizando la función de evaluaciónaccuracy
. - Se comparan los resultados para determinar qué variación produce una mayor precisión.
-
Optimización automática con
BeamSearch
:- Se utiliza una estructura de prompt basada en
Paragraph
(en lugar deSection
como en los ejemplos anteriores) yQuestionAnswerFormatter
. - Se definen "operadores de mutación" (
mutation operators
) que especifican cómo el optimizador puede modificar el prompt (en este caso, solo se permite la reescritura de las instrucciones). - Se utiliza el operador
BeamSearch
para explorar iterativamente diferentes variaciones del prompt, utilizando una estrategia de búsqueda en haz. - Se muestra el informe de la búsqueda, que incluye las diferentes variaciones del prompt probadas y sus puntuaciones de evaluación.
- Se imprime el mejor prompt encontrado.
- Se utiliza una estructura de prompt basada en
Consejos y buenas prácticas:
- Establece un buen sistema de evaluación antes de optimizar: Es fundamental tener una forma confiable de medir el rendimiento de tus prompts antes de intentar mejorarlos.
- Comienza con pruebas A/B simples: Compara variaciones pequeñas y específicas de tus prompts para entender qué cambios tienen un impacto positivo.
-
Utiliza
EnumerativeSearch
para pruebas A/B exhaustivas: Este operador te permite probar todas las combinaciones posibles de un conjunto de opciones. -
Considera
BeamSearch
para una optimización más avanzada: Este operador puede explorar un espacio de prompts más amplio y encontrar mejores soluciones, pero puede ser más lento y costoso. - Experimenta con diferentes parámetros y configuraciones: Ajusta los parámetros de los operadores de búsqueda y las opciones de los componentes de SAMMO para encontrar lo que funciona mejor para tu tarea.
- Inspecciona los prompts generados por los optimizadores: Esto te ayudará a entender cómo funcionan y a identificar posibles áreas de mejora.
- Ten en cuenta el costo y la latencia: La optimización automática de prompts puede implicar muchas llamadas a la API del LLM, lo que puede ser costoso y lento.
- SAMMO vs. DSPY: El presentador menciona que prefiere DSPY para la optimización, pero reconoce que SAMMO tiene algunas ventajas, como una sintaxis más limpia para las pruebas A/B.
-
OneOf
: Es un componente que permite definir un conjunto de opciones para una parte del prompt. El optimizador (en este caso,EnumerativeSearch
) probará todas las combinaciones posibles. - "Prompt space" (espacio de prompts): Se refiere al conjunto de todos los posibles prompts que se pueden generar a partir de las opciones y variaciones definidas.
-
fit_transform()
: Es un método del optimizador (searcher
en el código) que realiza la búsqueda y optimización del prompt. Toma como entrada el conjunto de datos y aplica las transformaciones (mutaciones, en el caso deBeamSearch
) para encontrar el mejor prompt.
Dudas o preguntas:
-
¿Cómo se puede adaptar esta técnica para optimizar prompts para otras tareas, además de la clasificación de transacciones bancarias? Investigación: Se pueden seguir los mismos pasos generales, pero adaptando las plantillas de prompt, los operadores de mutación (si se utiliza
BeamSearch
), y la función de evaluación a la tarea específica. -
¿Cómo se puede integrar la optimización de prompts con SAMMO en un flujo de trabajo de desarrollo de software más amplio? Investigación: Se puede integrar SAMMO en un pipeline de CI/CD (Integración Continua/Entrega Continua) para automatizar las pruebas y la optimización de prompts cada vez que se realizan cambios en el código o en los datos.
-
¿Cuáles son las ventajas y desventajas de utilizar
EnumerativeSearch
frente aBeamSearch
?-
EnumerativeSearch
:- Ventajas: Exhaustivo (prueba todas las combinaciones posibles).
- Desventajas: Puede ser muy lento y costoso si el espacio de búsqueda es grande.
-
BeamSearch
:-
Ventajas: Más eficiente que
EnumerativeSearch
, puede encontrar buenas soluciones en espacios de búsqueda más grandes. - Desventajas: No garantiza encontrar la solución óptima, puede ser más complejo de configurar.
-
Ventajas: Más eficiente que
-
-
¿Qué significa mutation operators? En el contexto de la optimización de prompts con SAMMO (y en general, en algoritmos de optimización), los mutation operators (operadores de mutación) definen cómo se pueden modificar los prompts durante el proceso de búsqueda. Son reglas o transformaciones que se aplican al prompt para generar variaciones.
En el ejemplo del video, se usa un
MutationOperators
con una sola regla:prompt_rewrite
. Esto significa que el optimizador (BeamSearch
) puede reescribir las instrucciones del prompt.mutation_operators = MutationOperators( prompt_rewrite=[ "Please rewrite and paraphrase the following prompt:", "Improve the given prompt. Paraphrase, improve the clarity and make sure it works as a prompt:", "Rewrite the following prompt, making it more concise and effective:" ])
Se proporcionan tres posibles formas de reescribir las instrucciones. El LLM elegirá una de ellas al azar cada vez que realice una mutación.
Otros posibles operadores de mutación (que no se usan en el video, pero que podrían ser relevantes) incluirían:
- Agregar ejemplos: Agregar nuevos ejemplos al prompt (similar a lo que hace DSPY).
- Eliminar ejemplos: Eliminar ejemplos existentes del prompt.
- Reordenar ejemplos: Cambiar el orden de los ejemplos.
- Modificar variables: Cambiar los nombres o valores de las variables en el prompt.
- Agregar/eliminar restricciones: Agregar o eliminar condiciones o limitaciones en el prompt.
- Combinar prompts: Combinar partes de diferentes prompts.
La elección de los operadores de mutación depende de la tarea y de la estructura del prompt. Un conjunto de operadores de mutación bien definido es crucial para que el optimizador pueda explorar el espacio de prompts de forma efectiva y encontrar buenas soluciones.