Ручне написання промптів — це справжній біль: ти витрачаєш години на підбір формулювань, а результат все одно непередбачуваний. DSPy вирішує цю проблему, дозволяючи програмно оптимізувати промпти замість того, щоб редагувати їх вручну. У цьому туторіалі ти навчишся підключити Claude як мовну модель до DSPy, написати перший оптимізований пайплайн і автоматично покращити якість промптів на прикладі реальної задачі. Весь процес займе близько 60–90 хвилин, якщо ти вже маєш базові знання Python.
🛠️ Що знадобиться
- Python 3.10+ — основне середовище виконання; встанови через python.org або використовуй pyenv
- DSPy 2.5+ — фреймворк для програмної оптимізації промптів; безкоштовний, open-source (pip install dspy)
- Anthropic API Key — для доступу до Claude 3.5 Sonnet або Claude 3 Haiku; є платний тариф, але нові акаунти отримують $5 кредитів безкоштовно
- Jupyter Notebook або VS Code — для зручної роботи з кодом; обидва безкоштовні
- Бібліотека python-dotenv — для безпечного зберігання API-ключів; безкоштовна (pip install python-dotenv)
📋 Покрокова інструкція
Крок 1: Встановлення залежностей та налаштування середовища
Відкрий термінал і створи новий проєкт: виконай mkdir dspy-claude-demo && cd dspy-claude-demo, потім створи віртуальне середовище командою python -m venv venv і активуй його через source venv/bin/activate (на Windows: venv\Scripts\activate). Тепер встанови всі потрібні бібліотеки однією командою: pip install dspy-ai anthropic python-dotenv datasets. Після встановлення створи файл .env у корені проєкту та додай туди рядок ANTHROPIC_API_KEY=sk-ant-xxxxxxxx зі своїм реальним ключем із консолі Anthropic (console.anthropic.com → API Keys → Create Key). Ніколи не комітуй цей файл у Git — одразу додай .env до .gitignore.

Крок 2: Підключення Claude до DSPy
Створи файл setup_claude.py і встав наступний код для ініціалізації Claude як мовної моделі в DSPy. DSPy 2.5 підтримує Anthropic нативно через клас dspy.LM. Відкрий файл у редакторі та введи:
import dspy
import os
from dotenv import load_dotenv
load_dotenv()
# Підключаємо Claude 3.5 Sonnet як основну модель
lm = dspy.LM(
model="anthropic/claude-3-5-sonnet-20241022",
api_key=os.getenv("ANTHROPIC_API_KEY"),
max_tokens=2048,
temperature=0.7
)
dspy.configure(lm=lm)
# Перевірка підключення
test = dspy.Predict("question -> answer")
result = test(question="Скажи 'DSPy працює' українською")
print(result.answer)
Запусти файл командою python setup_claude.py. Якщо у відповідь отримаєш текст із “DSPy працює” — підключення успішне. Якщо бачиш помилку AuthenticationError — перевір правильність API-ключа у файлі .env.
Крок 3: Створення першого DSPy-модуля з підписом
Головна сила DSPy — це Signatures (підписи), які описують що модель отримує і що повертає, без жодного ручного промпту. Створи файл classifier.py. Ми побудуємо класифікатор тональності відгуків із автоматичним поясненням рішення:
import dspy
class SentimentSignature(dspy.Signature):
"""Аналізуй тональність тексту та надай детальне пояснення."""
text: str = dspy.InputField(desc="Текст відгуку для аналізу")
sentiment: str = dspy.OutputField(desc="Тональність: позитивна, негативна або нейтральна")
confidence: str = dspy.OutputField(desc="Рівень впевненості від 0 до 100%")
reasoning: str = dspy.OutputField(desc="Коротке пояснення чому саме така тональність")
class SentimentClassifier(dspy.Module):
def __init__(self):
self.classify = dspy.ChainOfThought(SentimentSignature)
def forward(self, text):
return self.classify(text=text)
# Тест модуля
classifier = SentimentClassifier()
result = classifier("Продукт повністю розчарував, доставка затрималась на тиждень")
print(f"Тональність: {result.sentiment}")
print(f"Впевненість: {result.confidence}")
print(f"Пояснення: {result.reasoning}")
Запусти python classifier.py. Ти побачиш структурований аналіз від Claude без жодного написаного вручну промпту — DSPy автоматично сформував інструкцію на основі підпису та описів полів.
Крок 4: Оптимізація промптів за допомогою MIPROv2
Тепер найцікавіше — автоматична оптимізація промптів. DSPy використовує оптимізатори, які перебирають варіанти інструкцій і знаходять найкращий. Створи файл optimize.py:
import dspy
from dspy.teleprompt import MIPROv2
from classifier import SentimentClassifier
import os
from dotenv import load_dotenv
load_dotenv()
lm = dspy.LM("anthropic/claude-3-5-sonnet-20241022",
api_key=os.getenv("ANTHROPIC_API_KEY"))
dspy.configure(lm=lm)
# Тренувальний датасет — мінімум 10-20 прикладів для якісної оптимізації
trainset = [
dspy.Example(text="Чудовий товар, рекомендую всім!", sentiment="позитивна").with_inputs("text"),
dspy.Example(text="Повна катастрофа, гроші на вітер", sentiment="негативна").with_inputs("text"),
dspy.Example(text="Товар прийшов вчасно, все як описано", sentiment="нейтральна").with_inputs("text"),
dspy.Example(text="Якість перевершила очікування, куплю ще", sentiment="позитивна").with_inputs("text"),
dspy.Example(text="Бракована річ, служба підтримки не відповідає", sentiment="негативна").with_inputs("text"),
]
# Метрика оцінки — порівнюємо передбачення з еталоном
def sentiment_metric(example, prediction, trace=None):
return example.sentiment.lower() == prediction.sentiment.lower()
# Запускаємо оптимізатор MIPROv2
optimizer = MIPROv2(
metric=sentiment_metric,
auto="light", # light / medium / heavy — впливає на кількість ітерацій
num_threads=4
)
classifier = SentimentClassifier()
optimized_classifier = optimizer.compile(
classifier,
trainset=trainset,
num_trials=10,
minibatch_size=3
)
# Зберігаємо оптимізовану модель
optimized_classifier.save("optimized_sentiment.json")
print("Оптимізацію завершено! Модель збережено у optimized_sentiment.json")
# Дивимось на згенерований промпт
print("\n--- Оптимізований промпт ---")
print(optimized_classifier.classify.extended_signature)
Запусти python optimize.py і чекай 3–7 хвилин — MIPROv2 зробить кілька десятків викликів до Claude, порівняє результати та автоматично згенерує кращу версію промпту. У кінці ти побачиш текст промпту, який Claude сам для себе написав і визнав найефективнішим.
Крок 5: Завантаження та використання оптимізованої моделі в продакшені
Тепер оптимізований промпт збережено і його можна використовувати без повторної оптимізації. Створи фінальний файл production.py:
import dspy
from classifier import SentimentClassifier
import os
from dotenv import load_dotenv
load_dotenv()
lm = dspy.LM("anthropic/claude-3-5-sonnet-20241022",
api_key=os.getenv("ANTHROPIC_API_KEY"))
dspy.configure(lm=lm)
# Завантажуємо оптимізовану модель одним рядком
classifier = SentimentClassifier()
classifier.load("optimized_sentiment.json")
# Батч-обробка реальних відгуків
reviews = [
"Замовив вдруге — знову відмінна якість",
"Розміри не відповідають таблиці, дуже незадоволений",
"Прийшло в строк, упаковка ціла",
]
for review in reviews:
result = classifier(review)
print(f"Текст: {review[:40]}...")
print(f" → {result.sentiment} ({result.confidence})")
print()
Запусти python production.py — ти отримаєш структурований аналіз усіх відгуків із використанням оптимізованого промпту. Саме так виглядає повний цикл: від ідеї до готового, самооптимізованого AI-модуля, де Claude сам написав собі кращий промпт.

⚠️ Типові помилки та як їх уникнути
- Замалий тренувальний датасет — MIPROv2 потребує мінімум 15–20 різноманітних прикладів; якщо прикладів менше, оптимізатор перенавчається і результат гірший за вихідний промпт
- Неправильна метрика оцінки — метрика повинна повертати чітко True або False (або число від 0 до 1); якщо повертаєш рядок або None, оптимізатор мовчки вибере найгірший варіант промпту
- Перевищення rate limit Anthropic — при num_threads більше 4 на безкоштовному тарифі з’являються помилки 429; встанови
num_threads=2і додайdspy.settings.configure(experimental=True)для увімкнення retry-логіки - Забутий виклик .with_inputs() у прикладах датасету — кожен
dspy.Exampleобов’язково потребує.with_inputs("назва_поля")інакше оптимізатор не розуміє що є входом, а що міткою
💡 Поради для кращого результату
По-перше, використовуй Claude 3 Haiku для оптимізації і Claude 3.5 Sonnet для фінального інференсу — це знизить вартість оптимізації у 5–10 разів, бо більшість ітерацій MIPROv2 виконуються на дешевшій моделі. По-друге, додавай конкретні описи до кожного поля у Signature через параметр desc — чим точніший опис, тим кращий стартовий промпт і швидша оптимізація. По-третє, завжди перевіряй якість даних перед оптимізацією: запусти класифікатор вручну на кількох прикладах із датасету та переконайся, що мітки коректні — сміттєві мітки дають сміттєвий оптимізований промпт. По-четверте, використовуй параметр auto=”medium” замість “light” коли маєш 30+ прикладів — це дає суттєво кращий результат ціною ще 5–10 хвилин очікування.
❓ Часті запитання (FAQ)
1. Чим DSPy відрізняється від звичайного написання промптів вручну?
При ручному підході ти редагуєш текст промпту і гадаєш чи стало краще. DSPy замість цього автоматично генерує десятки варіантів промптів, тестує кожен на твоїх даних і вибирає переможця за об’єктивною метрикою. Це як A/B тестування промптів на автопілоті.
2. Скільки коштує запуск оптимізації через Anthropic API?
Легка оптимізація (auto=”light”, 10 trials, 20 прикладів) з Claude 3 Haiku коштує приблизно $0.05–0.15. З Claude 3.5 Sonnet — $0.50–2.00 залежно від довжини прикладів. Починай із Haiku, перемикайся на Sonnet лише для фінального запуску.
3. Чи можна використовувати DSPy для складніших задач, ніж класифікація?
Так, DSPy чудово підходить для RAG-систем, мультикрокових агентів, генерації коду та резюмування. Принцип той самий: описуєш підпис входів і виходів, DSPy сам розбирається як скласти оптимальний ланцюг викликів.
4. Як зберегти та поділитися оптимізованим промптом із командою?
Метод .save("model.json") зберігає всі оптимізовані інструкції у звичайний JSON-файл. Його можна закомітити в Git, передати колезі або завантажити в будь-якому іншому проєкті через .load("model.json") — повторна оптимізація не потрібна.
5. Чи працює DSPy з локальними моделями замість Claude?
Так, DSPy підтримує Ollama, LM Studio та будь-який OpenAI-сумісний ендпоінт. Просто зміни рядок ініціалізації на dspy.LM("ollama_chat/llama3.2", api_base="http://localhost:11434") — решта коду залишається незмінною.
🏁 Підсумок
Ти навчився підключати Claude до DSPy, описувати задачі через Signatures замість ручних промптів, запускати автоматичну оптимізацію за допомогою MIPROv2 і зберігати результат для використання в продакшені. Головний результат — у тебе є повністю автоматизований пайплайн, де AI сам пише і покращує свої промпти на основі твоїх даних.
Почни прямо зараз із кроку 1: встанови бібліотеки та запусти тест підключення до Claude. Коли побачиш перший успішний відгук від моделі — ти вже на 30% до готового рішення. Далі замінюй тренувальний датасет на свої реальні приклади і запускай оптимізацію.
РОЗСИЛКА
📬 Щотижневий AI-дайджест
Найкращі статті про ШІ та автоматизацію — без спаму, лише суть
Без спаму · Відписатись будь-коли

