Specialized AI assistant for DSPy development with deep knowledge of predictors, optimizers, adapters, and GEPA integration...
Specialized AI assistant for building LLM applications with DSPy
Activate dspy-code for:
Use dspy-code for ALL DSPy-related development
DSPy is fundamentally different from traditional prompt engineering:
10 Predictor Types:
Predict - Basic predictorChainOfThought - CoT reasoningChainOfThoughtWithHint - CoT with hintsProgramOfThought - Code execution for mathReAct - Reasoning + Acting for agentsMultiChainComparison - Compare multiple chainsRetrieve - Document retrievalTypedPredictor - Type-constrained outputsEnsemble - Multiple predictor votingmajority - Majority voting aggregation11 Optimizer Types:
BootstrapFewShot - Example-based (10-50 examples, โกโกโก fast)BootstrapFewShotWithRandomSearch - Hyperparameter tuning (50+, โกโก)BootstrapFewShotWithOptuna - Optuna integration (50+, โกโก)COPRO - Prompt optimization (50+, โกโก, โญโญโญโญ)MIPRO - Multi-stage instruction (100+, โก, โญโญโญโญโญ)MIPROv2 - Enhanced MIPRO (200+, โก, โญโญโญโญโญ)BetterTogether - Collaborative optimization (100+, โกโก)Ensemble - Ensemble methods (100+, โก, โญโญโญโญ)KNNFewShot - KNN-based selection (100+, โกโก, โญโญโญโญ)LabeledFewShot - Labeled examples (50+, โกโกโก)SignatureOptimizer - Signature tuning (100+, โกโก)4 Adapter Types:
ChatAdapter - Chat model integrationJSONAdapter - JSON output formattingFunctionAdapter - Function callingImageAdapter - Image input handlingBuilt-in Metrics:
Genetic-Evolutionary Prompt Architecture for automatic prompt optimization:
from dspy.gepa import GEPA
gepa = GEPA(
metric=accuracy,
population_size=10,
generations=20,
mutation_rate=0.3,
crossover_rate=0.7
)
result = gepa.optimize(
seed_prompt="question -> answer",
training_examples=trainset,
budget=100 # Max LLM calls
)
GEPA Workflow:
When to use GEPA:
Track development across multiple sessions:
session = {
'id': 'session_123',
'workspace': '/path/to/project',
'created_at': '2024-01-15T10:30:00Z',
'modules': [...],
'optimizers': [...],
'datasets': [...],
'metrics': [...]
}
Session features:
Index existing DSPy codebases for contextual assistance:
interface CodebaseIndex {
workspace: string;
indexed_at: string;
modules: Array<{
path: string;
name: string;
signature?: string;
type: string;
}>;
signatures: Array<{
path: string;
definition: string;
}>;
metrics: Array<{
path: string;
name: string;
type: MetricType;
}>;
}
Indexing enables:
Goal: Build working DSPy modules
โโโโโโโโโโโโโโโโ
โ /init โ Initialize project structure
โโโโโโโโฌโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโ
โ Design โ Define signatures and modules
โโโโโโโโฌโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโ
โ Implement โ Write forward() methods
โโโโโโโโฌโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโ
โ /validate โ Check correctness
โโโโโโโโโโโโโโโโ
Commands:
/init <project_name> - Create new DSPy project/connect - Connect to existing workspace/demo <template> - Generate demo from 12 templates/validate <file> - Validate module structure and signaturesDevelopment checklist:
Goal: Optimize modules for production
โโโโโโโโโโโโโโโโ
โ Data โ Prepare training/dev/test sets
โโโโโโโโฌโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโ
โ Metric โ Define evaluation function
โโโโโโโโฌโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโ
โ /optimize โ Compile with optimizer
โโโโโโโโฌโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโ
โ Evaluate โ Test on dev/test sets
โโโโโโโโฌโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโ
โ /export โ Save optimized program
โโโโโโโโโโโโโโโโ
Commands:
/optimize <module> - Run full optimization workflow/evaluate <module> - Evaluate on dev/test sets/export <format> - Export to Python/JSON/YAMLOptimization checklist:
/init <project_name>Initialize new DSPy project with structure:
project_name/
โโโ modules/ # DSPy modules
โโโ data/ # Training/dev/test datasets
โโโ metrics/ # Custom metrics
โโโ optimized/ # Saved optimized programs
โโโ tests/ # Unit tests
โโโ config.py # Configuration
Options:
--template <name> - Use template (qa, rag, multi-hop, agent)--lm <model> - Set language model (gpt-3.5-turbo, gpt-4, claude-3, etc.)--retrieval - Include retrieval setup/connectConnect to existing DSPy workspace:
/demo <template>Generate demo from 12 templates:
simple-qa - Basic question answeringrag - Retrieval-augmented generationmulti-hop - Multi-step reasoningtyped-output - Structured data extractionclassification - Multi-class classificationagent - ReAct agent with toolsensemble - Multiple predictor votingself-refining - Iterative refinementhinted-qa - Guided reasoningprogram-of-thought - Code generationchatbot - Multi-turn conversationdata-pipeline - ETL workflowOptions:
--with-optimization - Include optimization example--with-tests - Include unit tests--output <path> - Custom output path/optimize <module>Run complete optimization workflow:
Steps:
Options:
--optimizer <type> - Force optimizer (bootstrap, mipro, copro, etc.)--budget <N> - Max optimization budget--metric <name> - Use specific metric--no-save - Don't save optimized program--use-gepa - Enable GEPA optimization/validate <file>Validate DSPy code for correctness:
Checks:
Returns:
{
valid: boolean;
errors: string[]; // Critical issues
warnings: string[]; // Non-critical issues
suggestions: string[]; // Improvement suggestions
}
/export <format>Export module to target format:
Formats:
python - Python code with commentsjson - JSON configurationyaml - YAML configurationmarkdown - DocumentationOptions:
--include-examples - Include usage examples--include-tests - Include test code--minify - Remove comments and whitespaceFull feature support:
Legacy support:
Migration guide:
# DSPy 2.4 (old)
optimizer = dspy.BootstrapFewShot(
metric=metric,
max_bootstrapped_demos=4
)
# DSPy 2.5+ (new)
optimizer = dspy.BootstrapFewShot(
metric=metric,
max_bootstrapped_demos=4,
max_labeled_demos=8 # New parameter
)
Basic support:
User: Create a question-answering module with chain-of-thought reasoning
Assistant (using dspy-code):
import dspy
class QAModule(dspy.Module):
"""Question answering with chain of thought."""
def __init__(self):
super().__init__()
self.qa = dspy.ChainOfThought("question -> answer")
def forward(self, question):
return self.qa(question=question)
# Usage
lm = dspy.OpenAI(model="gpt-3.5-turbo")
dspy.settings.configure(lm=lm)
qa = QAModule()
result = qa(question="What is DSPy?")
print(result.answer)
Next steps: Use /validate to check, then /optimize with training data.
User: I have a RAG module and 100 training examples. How do I optimize it?
Assistant (using dspy-code):
# 1. Define metric
def accuracy(example, prediction, trace=None):
return example.answer.lower() in prediction.answer.lower()
# 2. Prepare data
trainset = [
dspy.Example(question="...", answer="...").with_inputs("question")
for ... in data
]
# 3. Choose optimizer (MIPRO for 100+ examples)
optimizer = dspy.MIPRO(
metric=accuracy,
prompt_model=dspy.OpenAI("gpt-4"),
task_model=dspy.OpenAI("gpt-3.5-turbo"),
num_trials=20,
minibatch_size=50
)
# 4. Compile
optimized_rag = optimizer.compile(rag_module, trainset=trainset)
# 5. Evaluate
from dspy.evaluate import Evaluate
evaluator = Evaluate(devset=devset, metric=accuracy)
score = evaluator(optimized_rag)
print(f"Accuracy: {score:.2%}")
# 6. Save
optimized_rag.save('rag_optimized.json')
Expected improvement: +30-50% accuracy with 100 examples and MIPRO.
User: I want to automatically find the best prompt for my task
Assistant (using dspy-code):
from dspy.gepa import GEPA
# 1. Define task
seed_prompt = "question -> answer"
training_examples = trainset[:50]
# 2. Configure GEPA
gepa = GEPA(
metric=accuracy,
population_size=10,
generations=20,
mutation_rate=0.3,
crossover_rate=0.7
)
# 3. Optimize
result = gepa.optimize(
seed_prompt=seed_prompt,
training_examples=training_examples,
budget=100 # Max 100 LLM calls
)
# 4. Use optimized prompt
print(f"Best prompt: {result.best_prompt}")
print(f"Score: {result.best_score:.2%}")
# 5. Create module with optimized prompt
class OptimizedQA(dspy.Module):
def __init__(self):
super().__init__()
self.qa = dspy.ChainOfThought(result.best_prompt)
def forward(self, question):
return self.qa(question=question)
GEPA benefits: Explores prompt space automatically, no manual engineering needed.
Begin with basic signatures and predictors:
# Good: Start simple
self.qa = dspy.ChainOfThought("question -> answer")
# Bad: Overengineering
self.qa = dspy.Ensemble([
dspy.ChainOfThought(...),
dspy.ProgramOfThought(...),
dspy.ReAct(...)
]) # Too complex for iteration
Run optimization on small datasets before scaling:
# Iterate quickly with 10 examples
quick_optimizer = dspy.BootstrapFewShot(metric=accuracy)
quick_test = quick_optimizer.compile(module, trainset=trainset[:10])
# Then scale to full dataset
full_optimizer = dspy.MIPRO(metric=accuracy)
production = full_optimizer.compile(module, trainset=full_trainset)
Track metrics throughout development:
# Log all predictions
def predict_with_logging(module, input):
prediction = module(input=input)
log_prediction(input, prediction, timestamp=datetime.now())
return prediction
Save and track optimized programs:
# Save with version
version = "v1.2.3"
optimized.save(f'models/qa_{version}.json')
# Track performance
performance_log = {
'version': version,
'dev_score': dev_score,
'test_score': test_score,
'optimizer': 'MIPRO',
'timestamp': datetime.now().isoformat()
}
save_performance_log(performance_log)
Keep modules focused and composable:
# Good: Single responsibility
class Retriever(dspy.Module):
def forward(self, query):
return self.retrieve(query)
class Generator(dspy.Module):
def forward(self, context, question):
return self.generate(context=context, question=question)
class RAG(dspy.Module):
def __init__(self):
self.retriever = Retriever()
self.generator = Generator()
def forward(self, question):
context = self.retriever(query=question)
return self.generator(context=context, question=question)
Unit test modules before optimization:
import unittest
class TestQAModule(unittest.TestCase):
def setUp(self):
self.qa = QAModule()
def test_basic_question(self):
result = self.qa(question="What is 2+2?")
self.assertIsNotNone(result.answer)
def test_complex_question(self):
result = self.qa(question="Explain quantum computing")
self.assertTrue(len(result.answer) > 50)
Solutions:
max_bootstrapped_demos)Solutions:
num_trials or budgetnum_threads=4)Solutions:
"input1, input2 -> output1, output2"def forward(self, input: str) -> dspy.Predictionclass MyModule(dspy.Module)__init__()Solutions:
population_size (try 15-20)generations (try 30-50)This skill provides:
When to use in conversation:
/Users/mikhail/Downloads/architect/dspy-code-codebaseSkill Version: 1.0.0 Last Updated: 2025-12-02 Compatible with: DSPy 2.4+