in →out

DSPy: программирование LLM сигнатурами

DSPy заменяет ручные промпты на компилируемые программы. Вы описываете сигнатуру, DSPy оптимизирует.

📊 Продвинутый ⏱ 12 мин

# 1. УСТАНОВКА И НАСТРОЙКА LM

pip install dspy-ai
# DSPy компилирует ваши сигнатуры в оптимальные промпты под любую модель

import dspy

# Конфигурация LM — можно OpenAI, Anthropic, локальные модели
lm = dspy.LM("openai/gpt-4o", api_key="sk-...")
dspy.configure(lm=lm)

# 2. СИГНАТУРЫ — декларативное описание вход/выход (вместо ручных промптов)

class TranslateToRussian(dspy.Signature):
    """Переведи английский текст на литературный русский язык."""
    english_text = dspy.InputField(desc="текст на английском")
    russian_text = dspy.OutputField(desc="перевод на русском")

# Простой вызов: DSPy сам построит промпт из сигнатуры
translator = dspy.Predict(TranslateToRussian)
result = translator(english_text="The future belongs to those who believe in the beauty of their dreams.")
print(result.russian_text)

# 3. ЦЕПОЧКА РАССУЖДЕНИЙ — ChainOfThought (CoT) из коробки

class FactChecker(dspy.Signature):
    """Проверь утверждение. Разбери по шагам. Вынеси вердикт."""
    statement = dspy.InputField()
    verdict = dspy.OutputField(desc="TRUE/FALSE/UNKNOWN")
    reasoning = dspy.OutputField(desc="пошаговое рассуждение")

# ChainOfThought автоматически добавляет "Let's think step by step"
checker = dspy.ChainOfThought(FactChecker)
result = checker(statement="Python был создан позже, чем JavaScript.")
print(f"Вердикт: {result.verdict}")
print(f"Рассуждение: {result.reasoning}")

# 4. DSPY МОДУЛИ — compile-time композиция сигнатур

class RAGModule(dspy.Module):
    """RAG-пайплайн как DSPy модуль: retrieve → generate answer."""
    def __init__(self, k=3):
        super().__init__()
        self.retrieve = dspy.Retrieve(k=k)
        self.generate = dspy.ChainOfThought("context, question -> answer")

    def forward(self, question):
        context = self.retrieve(question).passages
        return self.generate(context=context, question=question)

# 5. ОПТИМИЗАЦИЯ — BootstrapFewShot автоматически подбирает few-shot примеры

from dspy.teleprompt import BootstrapFewShot

# Оценочная метрика — что значит "хороший ответ"
def answer_quality(example, pred, trace=None) -> bool:
    """Метрика: ответ не пустой и содержит хотя бы 20 символов."""
    return pred.answer is not None and len(pred.answer) > 20

# Тренировочный датасет — минимальный, DSPy дополнит сам
trainset = [
    dspy.Example(question="Что такое квантовая запутанность?", answer="...").with_inputs("question"),
    dspy.Example(question="Объясни нейросети ребёнку", answer="...").with_inputs("question"),
]

# Компиляция: BootstrapFewShot подбирает лучшие примеры в промпт
optimizer = BootstrapFewShot(metric=answer_quality, max_bootstrapped_demos=4)
compiled_rag = optimizer.compile(RAGModule(), trainset=trainset)

# Готово! compiled_rag теперь использует оптимизированные few-shot промпты
final = compiled_rag(question="Как работает attention в трансформерах?")
print(final.answer)

🔗 Полезные ссылки

📖 DSPy Docs⭐ GitHub🎓 Stanford NLP