From dspy-skills
Optimizes DSPy programs using MIPROv2 with Bayesian optimization for joint instruction and few-shot demonstration tuning. Requires 200+ training examples.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dspy-skills:dspy-miprov2-optimizerThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Jointly optimize instructions and few-shot demonstrations using Bayesian Optimization for maximum performance.
Jointly optimize instructions and few-shot demonstrations using Bayesian Optimization for maximum performance.
| Input | Type | Description |
|---|---|---|
program | dspy.Module | Program to optimize |
trainset | list[dspy.Example] | 200+ training examples |
metric | callable | Evaluation function |
auto | str | "light", "medium", or "heavy" |
num_trials | int | Optimization trials (40+) |
| Output | Type | Description |
|---|---|---|
compiled_program | dspy.Module | Fully optimized program |
Install the optional Optuna dependency before using MIPROv2:
pip install -U "dspy[optuna]>=3.2.1,<3.3"
import dspy
from dspy.teleprompt import MIPROv2
lm = dspy.LM('openai/gpt-4o-mini')
dspy.configure(lm=lm)
class RAGAgent(dspy.Module):
def __init__(self):
self.retrieve = dspy.Retrieve(k=3)
self.generate = dspy.ChainOfThought("context, question -> answer")
def forward(self, question):
context = self.retrieve(question).passages
return self.generate(context=context, question=question)
from dspy.teleprompt import MIPROv2
optimizer = MIPROv2(
metric=dspy.evaluate.answer_exact_match,
auto="medium", # Balanced optimization
num_threads=24
)
compiled = optimizer.compile(RAGAgent(), trainset=trainset)
| Preset | Trials | Use Case |
|---|---|---|
"light" | ~10 | Quick iteration |
"medium" | ~40 | Production optimization |
"heavy" | ~100+ | Maximum performance |
import dspy
from dspy.teleprompt import MIPROv2
from dspy.evaluate import Evaluate
import json
import logging
logger = logging.getLogger(__name__)
class ReActAgent(dspy.Module):
def __init__(self, tools):
self.react = dspy.ReAct("question -> answer", tools=tools)
def forward(self, question):
return self.react(question=question)
def search_tool(query: str) -> list[str]:
"""Search knowledge base."""
results = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')(query, k=3)
return [r['long_text'] for r in results]
def optimize_agent(trainset, devset):
"""Full MIPROv2 optimization pipeline."""
agent = ReActAgent(tools=[search_tool])
# Baseline evaluation
evaluator = Evaluate(
devset=devset,
metric=dspy.evaluate.answer_exact_match,
num_threads=8
)
baseline = evaluator(agent)
logger.info(f"Baseline: {baseline:.2%}")
# MIPROv2 optimization
optimizer = MIPROv2(
metric=dspy.evaluate.answer_exact_match,
auto="medium",
num_threads=24,
# Custom settings
num_candidates=15,
max_bootstrapped_demos=4,
max_labeled_demos=8
)
compiled = optimizer.compile(agent, trainset=trainset)
optimized = evaluator(compiled)
logger.info(f"Optimized: {optimized:.2%}")
# Save with metadata
compiled.save("agent_mipro.json")
metadata = {
"baseline_score": baseline,
"optimized_score": optimized,
"improvement": optimized - baseline,
"num_train": len(trainset),
"num_dev": len(devset)
}
with open("optimization_metadata.json", "w") as f:
json.dump(metadata, f, indent=2)
return compiled, metadata
from dspy.teleprompt import MIPROv2
# Disable demos for pure instruction optimization
optimizer = MIPROv2(
metric=metric,
auto="medium",
max_bootstrapped_demos=0,
max_labeled_demos=0
)
num_threads=24 or higher if availablenpx claudepluginhub omidzamani/dspy-skills --plugin dspy-skillsSelects the appropriate DSPy optimizer (e.g., LabeledFewShot, MIPROv2, GEPA) based on data size, budget, and artifact type. Guides from baseline to cost-aware optimization plans.
Optimizes DSPy programs using the dspy.GEPA reflective/evolutionary optimizer for complex tasks with rich-feedback metrics. Requires a DSPy module, metric returning dspy.Prediction, trainset, and reflection LM.