¿Qué es DSPy?

Autor(es):

Joshua Noble

Data Scientist

¿Qué es DSPy?

Los modelos de lenguaje de gran tamaño (LLM), los flujos de trabajo agénticos y los almacenes de vectores se han vuelto cada vez más potentes y los marcos para agilizar el desarrollo de aplicaciones de IA han ganado popularidad. DSPy es un kit de herramientas que proporciona módulos de propósito general que reemplazan el prompt engineering y la entrada directa del lenguaje natural con la configuración mediante Python. 

En general, trabajar con LLM o modelos fundacionales requiere un cuidados prompt engineering, en la que el usuario ajusta las instrucciones para obtener el resultado correcto. Aunque este enfoque puede ser eficaz, requiere mucho tiempo y es propenso a errores, y crea cadenas de herramientas frágiles que deben actualizarse cuando se lanzan nuevas versiones de un modelo. Los marcos populares como los modelos de lenguaje de cadena LangChain para la creación de aplicaciones y LlamaIndex se centran en mejorar las capacidades de búsqueda dentro de los textos. Con estos desarrolladores, aún se necesita experiencia en el fine-tuning de las instrucciones y tiempo para probar cada instrucción para obtener el resultado deseado. DSPy simplifica este proceso de ajuste de instrucciones con un enfoque programático para guiar y delimitar el comportamiento del modelo de lenguaje.

DSPy se centra en automatizar la optimización de la construcción de instrucciones. Para reemplazar el hacking de instrucción y los generadores de datos sintéticos únicos, DSPy proporciona optimizadores generales, que son algoritmos que actualizan los parámetros de su programa. Cada vez que modifique su código, datos, aserciones o métricas, puede compilar su programa de nuevo y DSPy optimizará las instrucciones para crear nuevas instrucciones efectivas que se ajusten a sus cambios.

A veces la gente imagina que la optimización automática de instrucciones significa crear un sistema en el que los LLM critiquen y mejoren las instrucciones generadas por los usuarios. Esta no es la forma más eficaz de utilizar los LLM. DSPy aprovecha el poder de generación de ideas de los LLM para generar sus propias instrucciones. A continuación, prueba esas variaciones utilizando un conjunto de métricas de evaluación para ver si resuelven mejor el problema. Si no funcionan numéricamente mejor en una métrica asignada por el usuario, entonces las instrucciones nuevas se desechan. Es similar a un algoritmo evolutivo en el que las instrucciones se evalúan para determinar su aptitud y se mejoran iterativamente.

Casos de uso de DSPy

DSPy puede ser útil en varios tipos diferentes de flujos de trabajo y escenarios. Algunos de los más utilizados son la generación aumentada por recuperación, la respuesta a preguntas de múltiples saltos y el resumen de documentos.

Cadena de pensamiento

El prompting de cadena de pensamiento (CoT) simulan procesos de razonamiento similares a los humanos al pedir al modelo que descomponga tareas complejas en una secuencia de pasos lógicos hacia una resolución final. Estos pasos de razonamiento se introducen en la ventana contextual del modelo, lo que le proporciona una mayor base en la tarea en cuestión y, a menudo, conduce a mejores respuestas incluso en escenarios complejos. DSPy ayuda haciendo que el modelo de lenguaje genere una cadena de instrucciones y estrategias de pensamiento y probándolos con el modelo de lenguaje para generar las instrucciones de CoT más efectivas para el modelo dado.

Generación aumentada por recuperación

La generación aumentada por recuperación (RAG) es un enfoque que permite a los LLM aprovechar un gran corpus de conocimientos de fuentes y consultar su base de datos para encontrar pasajes o contenidos relevantes y producir una respuesta bien refinada. La RAG garantiza que los LLM puedan utilizar dinámicamente los conocimientos en tiempo real, incluso si no han recibido formación original sobre el tema, y dar respuestas correctas. Esta potencia adicional conduce a una mayor complejidad a la hora de configurar pipelines RAG. DSPy ofrece un enfoque fluido para configurar pipelines de instrucciones y generar instrucciones efectivas (ajuste de instrucciones) o, en el caso de modelos más pequeños, afinar las ponderaciones del modelo.

Los pipelines RAG se pueden optimizar con DSPy de dos maneras: utilizando ejemplos etiquetados o utilizando ejemplos de bootstrapping. Los ejemplos etiquetados son simplemente preexistentes, los ejemplos etiquetados manualmente se utilizan para entrenar directamente el modelo de estudiante. Bootstrapping en el contexto de DSPy significa usar un modo de lenguaje en un paradigma de profesor y alumno. El profesor genera nuevos ejemplos de formación basados en unas pocas instrucciones proporcionadas por el usuario. Estos ejemplos de bootstrapping se utilizan junto con los ejemplos etiquetados manualmente o en lugar de ellos para entrenar el módulo del alumno hasta que proporcione las respuestas correctas. A continuación, las instrucciones que generan las respuestas correctas se actualizan iterativamente a lo largo del pipeline DSPy.

Respuesta a preguntas multisalto

Muchas veces, una sola consulta de búsqueda no es suficiente para una tarea compleja de respuesta a preguntas. El popular conjunto de datos HotPot Question Answering consta de preguntas que requieren múltiples análisis y recuperaciones de preguntas antes de poder responderlas. Por ejemplo: "¿Bill Nelson voló como especialista en carga útil en un transbordador espacial lanzado por primera vez en qué año?" Esta respuesta requiere saber que Bill Nelson voló en el transbordador espacial Columbia y luego poder determinar que el Columbia voló por primera vez en 1981.

El enfoque estándar para este desafío en la literatura aumentada de recuperación es construir un sistema de búsqueda multisalto. Estos sistemas leen los resultados recuperados y luego generan consultas adicionales para recopilar información adicional cuando sea necesario antes de llegar a una respuesta final. Con DSPy puede crear el mismo sistema en unas pocas líneas de código de una manera sólida que le permite actualizar modelos y simplemente volver a ejecutar su pipeline.

Resumen

El resumen condensa un texto más largo en una versión más corta sin dejar de conservar la información clave y las ideas principales. Es una habilidad poderosa para que un LLM lo haga bien, con aplicaciones que van desde la creación de resúmenes de artículos hasta la generación de informes concisos a partir de documentos extensos.

Evaluar la calidad de los resúmenes producidos por los modelos de lenguaje presenta desafíos importantes. A diferencia de las tareas con respuestas claras correctas o incorrectas, la calidad del resumen suele ser subjetiva y depende del contexto. El modelo debe equilibrar la retención de información con la concisión, al mismo tiempo que conserva el tono y la intención del texto original y garantiza la precisión de los hechos sin introducir errores. Adaptarse a diferentes tipos de material de origen y propósitos de resumen supone un desafío adicional. DSPy le permite utilizar datos etiquetados para ajustar sus instrucciones de resumen para obtener las mejores respuestas posibles.

Conceptos en DSPy

DSPy tiene su propio vocabulario y terminología, aprender algunos de esos términos clave ayudará a arrojar algo de luz sobre la arquitectura general.

Compilación: este proceso es la forma en que DSPy traduce un programa basado en Python en instrucciones que un modelo de lenguaje puede entender y ejecutar de manera eficiente. 

Firma: se trata de una clase que define los tipos de entrada y salida de un módulo, lo que garantiza la compatibilidad entre los diferentes módulos de un programa DSPy. Algunos ejemplos de firmas son tareas como introducir una pregunta y generar el razonamiento y la respuesta, o tomar un documento como entrada y generar un resumen.

Optimizador: este componente de DSPy afina el programa compilado para el modelo de lenguaje específico que está utilizando, por ejemplo, GPT3.5-Turbo o GPT-4.0 o Llama 3.1. Los optimizadores garantizan que maximice el rendimiento y la precisión de su programa. En versiones anteriores de DSPy, estos se llamaban teleinstrucciones. Los programas DSPy consisten en múltiples llamadas a modelos de lenguaje que se apilan como módulos DSPy. Cada módulo DSPy tiene tres tipos de parámetros internos: las ponderaciones del LM, las instrucciones que se supone que debe seguir y las demostraciones almacenadas del comportamiento de entrada/salida.

Cuando se le proporciona una métrica, DSPy crea instrucciones optimizadas utilizando todos las ponderaciones, instrucciones y comportamiento del modelo con algoritmos de optimización de varias etapas. Pueden combinar el descenso por gradiente (para los pesos del modelo de lenguaje) y la optimización impulsada por modelos de lenguaje discretos, es decir, para elaborar o actualizar instrucciones y para crear o validar demostraciones. Las demostraciones DSPy son similares a los ejemplos de pocas tomas, pero son mucho más potentes. Se pueden crear desde cero, dado su programa, y su creación y selección se pueden optimizar de muchas maneras efectivas.

En muchos casos, la compilación conduce a mejores instrucciones que la escritura humana porque los optimizadores pueden probar más cosas, de forma mucho más sistemática, y ajustar las métricas directamente que un humano.

Pipeline: un "pipeline" es como DSPy se refiere a una secuencia de módulos conectados que trabajan juntos para lograr una tarea compleja. Por ejemplo, un pipeline podría resumir un artículo, traducirlo de un idioma de origen a un idioma de destino y luego generar preguntas sobre él en un idioma de destino.

Métricas: DSPy define varias métricas diferentes para medir el rendimiento de la salida. Por ejemplo, es posible que necesite que el resultado coincida exactamente con su etiqueta. En otros casos, una coincidencia parcial podría ser una buena opción para sus necesidades. Una métrica de uso común proporcionada por DSPy es el Semantic F1. Esta métrica mide cuánta información de la etiqueta está contenida en la respuesta y qué pocos datos superfluos que no están en la respuesta objetivo etiquetada están presentes en la respuesta. Si necesita una forma diferente de medir el rendimiento, también puede proporcionar sus propias métricas personalizadas.

Uso de DSPy

Para empezar a utilizar DSPy, basta con ejecutar pip install dspy-ai. No se requiere hardware especial, ya que la mayoría de los modelos pueden utilizarse en la nube a través de una API o ejecutarse localmente. Se puede ejecutar localmente o en entornos de portátiles alojados como Google Colab o Watson Studio.

Un pipeline DSPy típico para la generación aumentada por recuperación consta de un modelo de lenguaje y un modelo de recuperación. Por ejemplo, para trabajar con OpenAI GPT-3.5 Turbo como modelo de lenguaje y ColBERTV2 retriever como modelo de recuperación, configuraríamos DSPy así:

import dspy
turbo = dspy.OpenAI(model=’gpt-3.5-turbo’)
colbertv2_wiki17_abstracts = dspy.ColBERTv2(url=’http://20.102.90.50:2017/wiki17_abstracts’)
# set the language model and the retrieval model
dspy.settings.configure(lm=turbo, rm=colbertv2_wiki17_abstracts)

 

Creación de firmas

Las firmas son plantillas que le permiten configurar cómo se pueden estructurar los campos de entrada y salida para el modelo de lenguaje y el modelo de recuperación. Por ejemplo, este fragmento de código muestra la sintaxis para dar instrucción al modelo de lenguaje con contexto y el modelo de recuperación con estructura:

class GenerateAnswer(dspy.Signature):
    “””Answer questions with short factoid answers.”””
    context = dspy.InputField(desc=”may contain relevant facts”)
    question = dspy.InputField()
    answer = dspy.OutputField(desc=”often between 1 and 5 words”)

Incluimos pequeñas descripciones para los campos de contexto y respuesta para definir pautas más sólidas sobre lo que el modelo recibirá y debería generar.

Compilación

Una vez que haya definido sus firmas, puede ejecutar su programa y crear instrucciones óptimas para su tarea utilizando un optimizador adecuado para su tarea. En DSPy. este proceso se denomina compilación. La compilación de un programa actualiza los parámetros almacenados en cada módulo. En la mayoría de los escenarios, esto consiste principalmente en recopilar y seleccionar buenas demostraciones para incluirlas en la instrucción.

La compilación requiere:

• Un conjunto de entrenamiento o ejemplos de bootstrapping.

• Una métrica para la validación. En un escenario RAG, esta sería una forma de medir lo precisa que es la respuesta predicha y que el contexto recuperado contiene la respuesta.

• Un optimizador específico para generar instrucciones con las que realizar pruebas. Por ejemplo, el optimizador BootstrapFewShot podría utilizarse para generar instrucciones y luego probar esas instrucciones generadas.

Para compilar un programa DSPy, configure qué modelos desea utilizar y páselos al método de compilación del optimizador que haya seleccionado. Por ejemplo, un programa para una aplicación RAG contendría un modelo de lenguaje y un modelo de recuperación. A continuación, se pasarían al método de compilación y el optimizador utilizaría los datos recuperados para establecer el contexto para la generación del lenguaje.

A continuación, defina una métrica para evaluar tanto la recuperación como el modelo de lenguaje. Esa definición de métricas se daría a un optimizador como BootstrapFewShot o LabeledFewShot para que la utilice mientras evalúa las instrucciones generadas por el modelo de lenguaje. Por último, el optimizador compila un módulo personalizado que contiene el método de reenvío que ha definido junto con un conjunto de datos de entrenamiento.

La selección del optimizador que se va a utilizar suele requerir experimentación, pero existen algunas pautas:

• Si tiene muy pocos ejemplos (alrededor de diez), puede empezar con BootstrapFewShot para generar nuevos datos de entrenamiento.

• Si tiene más datos, por ejemplo 50 ejemplos o más, pruebe BootstrapFewShotWithRandomSearch para generar nuevos datos de entrenamiento en partes aleatorias de sus datos de entrenamiento.

• Si necesita un programa muy eficiente, puede afinar un pequeño LLM para su tarea con BootstrapFinetune.

Evaluación e iteración

Una vez que haya compilado su programa y comparado sus métricas, es posible que esté satisfecho con los resultados. También puede encontrar que no le gusta algo sobre el programa final o los resultados de acuerdo con la métrica o métricas elegidas. El desarrollo iterativo es clave. DSPy proporciona herramientas para hacerlo de forma incremental mediante la iteración de sus datos, la actualización de la estructura de su programa, la métrica o métricas que ha elegido y el optimizador que ha elegido.

Más información

DSPy es de código abierto, por lo que puede inspeccionar el código y ver el progreso del desarrollo. Los documentos del sitio de StanfordNLP en Github contienen la documentación y varios tutoriales paso a paso y demostraciones sobre cómo empezar a utilizar DSPy.

Soluciones relacionadas
IBM watsonx.ai

Entrene, valide, ajuste e implemente IA generativa, modelos fundacionales y capacidades de machine learning con IBM watsonx.ai, un estudio empresarial de nueva generación para desarrolladores de IA. Cree aplicaciones de IA en menos tiempo y con menos datos.

Explore watsonx.ai
Soluciones de inteligencia artificial

Ponga la IA al servicio de su negocio con la experiencia líder del sector y el portfolio de soluciones de IA de IBM.

Explore las soluciones de IA
Servicios y consultoría de inteligencia artificial (IA)

Los servicios de IA de IBM Consulting ayudan a reinventar la forma de trabajar de las empresas usando IA para la transformación.

Explore los servicios de IA
Dé el siguiente paso

Gracias a la IA, IBM Concert descubre información crucial sobre sus operaciones y ofrece recomendaciones de mejora personalizadas para cada aplicación. Descubra cómo Concert puede hacer avanzar su negocio.

Explorar el concierto Explore las soluciones de automatización de procesos empresariales