Dentro de DSPy El nuevo marco de programación del modelo de lenguaje que necesitas conocer
DSPy el nuevo marco de programación del modelo de lenguaje que debes conocer
Creado por investigadores de Stanford, el marco proporciona una alternativa interesante a LangChain o LlamaIndex.

Recientemente comencé un boletín educativo centrado en IA, que ya cuenta con más de 160,000 suscriptores. TheSequence es un boletín orientado a ML (aprendizaje automático) que no tiene tonterías (es decir, sin exageraciones, sin noticias, etc.) y se puede leer en 5 minutos. El objetivo es mantenerte actualizado sobre proyectos de aprendizaje automático, documentos de investigación y conceptos. Por favor, pruébalo suscribiéndote a continuación:
TheSequence | Jesus Rodriguez | Substack
La mejor fuente para mantenerse actualizado con los avances en aprendizaje automático, inteligencia artificial y datos…
thesequence.substack.com
El universo de los marcos de programación de modelos de lenguaje (LMP) ha estado expandiéndose rápidamente en los últimos meses. Marcos como LangChain o LlamaIndex han logrado niveles relevantes de adopción dentro de la comunidad de LLM y el Kernel Semántico de Microsoft está impulsando un impresionante conjunto de capacidades. Recientemente, una nueva alternativa conocida como DSPy ha entrado en escena con un enfoque único para LMP.
DSPy fue creado por investigadores de la Universidad de Stanford con el objetivo de proporcionar abstracciones mejoradas para diferentes tareas de LMP. DSPy prioriza la programación sobre la generación de comandos en un intento de permitir la creación de aplicaciones de LMP más sofisticadas. Parte de las limitaciones actuales de los LLM es que no son muy efectivos en tareas como la lógica de control, como bucles o declaraciones condicionales, y también requieren constructos fundamentalmente diferentes para tareas como el ajuste fino o la ampliación del conocimiento. DSPy intenta abordar estos problemas con un enfoque centrado en la programación.
La experiencia y los principios de DSPy se asemejan a PyTorch en el espacio de aprendizaje profundo. Al construir aplicaciones de aprendizaje profundo utilizando PyTorch, los científicos de datos modelan una red neuronal dada y utilizan capas declarativas u optimizadores para incorporar una lógica deseada. De manera similar, DSPy incluye bloques de construcción como ChainOfThought o Retrieve y compila el programa, optimizando los comandos basados en métricas específicas. Si bien esto puede parecer un enfoque nuevo en LMP, el enfoque es bastante tradicional.
- WavJourney Un viaje al mundo de la generación de historias de audio
- Investigadores de Amazon presentan el método ‘HandsOff’...
- Construyendo una matriz de correlación con valores de p en Python
DSPy
DSPy prioriza la programación sobre las tareas de generación de comandos, unificando estrategias tanto para generar comandos como para ajustar modelos de lenguaje (LMs). El marco mejora estas técnicas con razonamiento y mejora de herramientas/búsqueda, todo ello transmitido a través de una colección concisa de operaciones Pythonic que son componibles y capaces de aprender.
Dentro del marco de DSPy, existen módulos componibles y declarativos diseñados para guiar a los LLMs, siguiendo una estructura familiar de Python. Especialmente, DSPy introduce un compilador automático que educa a los LLMs sobre cómo ejecutar etapas declarativas dentro de un programa. Este compilador rastrea internamente la ejecución del programa y posteriormente diseña comandos de alta calidad adecuados para LMs a gran escala, o incluso entrena el ajuste fino automático para LMs más pequeños, transmitiendo el conocimiento de las complejidades de la tarea.
DSPy funciona como una solución integral para tareas complejas que involucran modelos de lenguaje (LMs) y modelos de recuperación (RMs). DSPy armoniza enfoques tanto para generar comandos como para ajustar LMs, al tiempo que también ofrece métodos para razonamiento y mejora de herramientas/búsqueda. A través de DSPy, estas metodologías están encapsuladas en un conjunto compacto de módulos Pythonic, que facilitan la composición y el aprendizaje.
El marco de DSPy se habilita mediante la provisión de módulos componibles y declarativos, estructurados de manera familiar para los usuarios de Python. Este avance eleva las “técnicas de generación de comandos” como chain-of-thought y autorreflexión, desde tácticas manuales de manipulación de cadenas hasta procedimientos modulares versátiles capaces de adaptarse a diversas tareas.
Es importante destacar que el compilador de DSPy funciona sin necesidad de etiquetas manuales para pasos intermedios dentro de un programa. Esto contrasta con la práctica convencional de “ingeniería de comandos”, que se basa en técnicas ad hoc de manipulación de cadenas. En cambio, DSPy abre la puerta a explorar un ámbito estructurado de componentes modulares y entrenables, proporcionando un enfoque sistemático que reemplaza los procesos manuales frágiles.
La experiencia de programación de DSPy se basa en dos construcciones fundamentales: Firmas y Teleprompters.
I. Firmas: Creando el Comportamiento de LLM
Dentro del ámbito de DSPy, cuando se asignan tareas a LMs, la especificidad en el comportamiento se expresa a través de Firmas. Una Firma encapsula una representación declarativa de un patrón de comportamiento de entrada/salida asociado con un módulo DSPy.
A diferencia de invertir esfuerzo en guiar a un LLM a través de sub-tareas, las Firmas permiten a los usuarios de DSPy elucidar la naturaleza de la sub-tarea. Posteriormente, el compilador de DSPy asume la responsabilidad de idear sugerencias intrincadas adaptadas para un LLM grande o ajustar finamente un LLM más pequeño, todo de acuerdo con la Firma especificada, los datos proporcionados y la canalización existente.
Una Firma consta de tres componentes fundamentales:
1) Una delimitación concisa de la sub-tarea abordada por el LM.
2) Elaboración sobre uno o más campos de entrada (por ejemplo, pregunta de entrada) que servirán como entradas para el LM.
3) Explicación de uno o más campos de salida (por ejemplo, respuesta de la pregunta) que se espera que genere el LM.
El siguiente código ilustra una firma basada en el módulo ChainOfThought con bastantes controles:
class GenerateSearchQuery(dspy.Signature): """Escribe una consulta de búsqueda simple que ayudará a responder una pregunta compleja.""" context = dspy.InputField(desc="puede contener datos relevantes") question = dspy.InputField() query = dspy.OutputField()### dentro de la función __init__ de tu programa self.generate_answer = dspy.ChainOfThought(GenerateSearchQuery)
II. Habilitando la Optimización del Programa a través de dspy.teleprompt.
La compilación está en el centro de la experiencia de DSPy.
La compilación se basa en tres factores cruciales: un conjunto de datos de entrenamiento potencialmente compacto, una métrica de validación y la selección de un teleprompter del repertorio de DSPy. Estos teleprompters, incrustados en DSPy, son optimizadores potentes capaces de dominar el arte de formular sugerencias impactantes adaptadas a los módulos de cualquier programa. (El prefijo “tele-” en “teleprompter” implica “a distancia”, en referencia a la naturaleza automática del enunciado.)
Notablemente, las demandas de DSPy en cuanto a etiquetado son notablemente modestas. Considera un ejemplo de pipeline de generación aumentada con recuperación (RAG): incluso un puñado de instancias que contengan preguntas y sus respuestas anotadas por humanos podrían ser suficientes. Incluso cuando abarca múltiples etapas intrincadas, como se ejemplifica en el modelo básico de RAG que comprende la recuperación de contexto, una cadena de pensamiento y la respuesta final, solo se requieren etiquetas para la consulta inicial y la respuesta final. DSPy ingeniosamente extrapola etiquetas intermedias necesarias para respaldar todo el pipeline. Si se realizan modificaciones en la estructura del pipeline, los datos de inicio se adaptarán dinámicamente para alinearse con la configuración alterada.
Una instancia del conjunto de entrenamiento de RAG podría estructurarse de la siguiente manera:
my_rag_trainset = [ dspy.Example( question="¿Qué premio recibió el primer libro de Gary Zukav?", answer="National Book Award" ), ...]
A continuación, es imperativo articular criterios de validación. Esta lógica impone restricciones en el comportamiento del programa o el rendimiento del módulo. Por ejemplo, una función de validación para RAG podría incluir una verificación como se muestra a continuación:
def validate_context_and_answer(example, pred, trace=None):answer_match = example.answer.lower() == pred.answer.lower()context_match = any((pred.answer.lower() in c) for c in pred.context)return answer_match and context_match
Las diferentes opciones de teleprompter tienen diferentes compensaciones relacionadas con la optimización de costos frente a la mejora de la calidad. En el contexto de RAG, una opción podría ser el teleprompter BootstrapFewShot directo. Esto implica inicializar el teleprompter mismo con una función de validación personalizada (como my_rag_validation_logic) y posteriormente realizar la compilación contra un conjunto de entrenamiento designado (my_rag_trainset).
from dspy.teleprompt import BootstrapFewShotteleprompter = BootstrapFewShot(metric=my_rag_validation_logic)compiled_rag = teleprompter.compile(RAG(), trainset=my_rag_trainset)
Cuando se utiliza la instancia compilada de RAG, se inicia una fase de invocación del LM con sugerencias intrincadas. Estas sugerencias incorporan demostraciones concisas de recuperación de cadena de pensamiento y respuesta a preguntas, adaptadas todas al conjunto de datos único en uso.
DSPy todavía está en las primeras etapas, pero ya destaca varias ideas prometedoras. Un modelo de programación simple y consistente que se asemeja a la experiencia de PyTorch y una experiencia modular permiten a los desarrolladores de LMP construir experiencias bastante sofisticadas. Espero que DSPy evolucione desde esta etapa inicial a una pila que pueda competir con LangChain y LlamaIndex porque muchas de las ideas del marco definitivamente son necesarias en el espacio de LMP.