DSPy
DSPy est un framework open source qui construit des pipelines de LLM à partir de signatures typées et de modules, puis optimise leurs prompts en fonction d’une métrique.
DSPy est un framework Python open source permettant de créer des applications sur des grands modèles de langage (LLM) sous forme de code, plutôt qu’à l’aide d’invites rédigées à la main. Le développeur déclare les entrées et les sorties de chaque étape, compose ces étapes en un programme et laisse un optimiseur DSPy rédiger et ajuster les invites ou les poids du modèle afin de maximiser une métrique sur un ensemble d’exemples. Le nom signifie Declarative Self-improving Python, et le projet se présente comme un framework permettant de programmer les modèles de langage plutôt que de les solliciter par des invites. Omar Khattab et ses collègues de Stanford l’ont présenté dans l’article d’octobre 2023 DSPy : compiler des appels déclaratifs à des modèles de langage en pipelines auto-améliorables. En quelques minutes de compilation, quelques lignes de DSPy ont permis à GPT-3.5 et Llama-2-13B-chat de créer des pipelines qui dépassaient de plus de 25 % et 65 % respectivement le prompting standard few-shot, et jusqu’à 46 % et 40 % les pipelines utilisant des exemples rédigés par des experts.
Signatures, modules et optimiseurs#
- Signatures : déclarations typées des entrées et sorties d’une étape, écrites en ligne sous la forme
"question -> answer"ou dans une classe dont la docstring décrit la tâche. Elles indiquent le rôle de l’étape et laissent DSPy définir la formulation de l’invite. - Modules : stratégies d’exécution d’une signature.
dspy.Predictappelle le modèle une fois,dspy.ChainOfThoughtajoute un champ de raisonnement avant la réponse, comme dans le prompting par chaîne de raisonnement, etdspy.ReActexécute une boucle utilisant des outils, à la manière du prompting ReAct. Les modules se composent comme des couches PyTorch pour former des programmes en plusieurs étapes, par exemple un pipeline de génération augmentée par récupération (RAG) qui rédige une requête de recherche, récupère des passages et formule une réponse à partir de ceux-ci. - Adaptateurs : convertissent une signature en messages de chat pour le modèle et analysent sa réponse pour la convertir en champs typés.
- Optimiseurs : algorithmes qui améliorent un programme en fonction d’une métrique.
BootstrapFewShotexécute le programme sur des exemples d’entraînement et conserve comme démonstrations les traces qui satisfont la métrique ;MIPROv2explore les instructions proposées et les ensembles de démonstrations ;BootstrapFinetunedistille un programme dans les poids du modèle par ajustement fin.
La boucle d’optimisation reprend celle de l’entraînement d’un modèle, les invites jouant le rôle de paramètres :
L’optimiseur GEPA de 2025, disponible sous la forme dspy.GEPA, analyse les traces d’exécution du programme et les retours textuels, demande à un LLM de réfléchir aux erreurs, puis fait évoluer les instructions. Sur six tâches, il a dépassé de 6 % en moyenne et jusqu’à 20 % la méthode d’apprentissage par renforcement GRPO, tout en utilisant jusqu’à 35 fois moins de déroulements, et a dépassé MIPROv2 de plus de 10 %.
De la signature à l’invite#
DSPy génère l’invite à partir de la signature ; un même programme peut donc être réoptimisé pour un nouveau modèle plutôt que réécrit. Ici, l’entrée est un résumé des détections d’Ultralytics YOLO26 : Results.verbose() renvoie un résultat en mode predict sous forme de chaîne courte contenant le nombre de détections par classe. Une signature peut prendre ce résultat comme texte, afin qu’un optimiseur règle l’étape de raisonnement à partir de vraies sorties de détection d’objets. La mise en forme des messages ne nécessite ni modèle ni clé API :
import dspy
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
class SceneQA(dspy.Signature):
"""Answer a question about a photo from the objects a detector found in it."""
detections: str = dspy.InputField()
question: str = dspy.InputField()
answer: str = dspy.OutputField()
# The adapter turns the signature and inputs into the chat messages the model will receive
inputs = {"detections": results[0].verbose(), "question": "How many people are in the photo?"}
messages = dspy.ChatAdapter().format(SceneQA, demos=[], inputs=inputs)
for message in messages:
print(f"--- {message['role']} ---\n{message['content']}")Le message système énumère les champs d’entrée et de sortie, les marqueurs [[ ## field ## ]] utilisés par DSPy pour analyser la réponse, ainsi que l’objectif indiqué dans la docstring ; le message utilisateur contient le décompte du détecteur. Un optimiseur améliore ce programme en reformulant cet objectif et en ajoutant des démonstrations aux messages, sans modifier le code Python.
DSPy et les termes apparentés#
- Ingénierie des invites : rédaction et révision manuelles des invites. DSPy transforme ce travail en problème d’optimisation défini par une métrique et des exemples.
- LangChain : framework d’intégrations, d’outils et de boucles d’agents permettant de composer des applications LLM, dont les invites sont gérées par le développeur.
- Réglage des hyperparamètres : recherche des paramètres d’entraînement en fonction d’une métrique de validation ; c’est l’analogie la plus proche de la recherche d’invites par DSPy.
- Systèmes d’IA composés : applications composées de plusieurs appels de modèle, systèmes de recherche d’information et outils. DSPy a été conçu pour optimiser ces pipelines de bout en bout, en réglant l’invite de chaque étape en fonction de la métrique finale.










