Як використовувати Claude для автоматизації написання та оптимізації промптів за допомогою DSPy

Як автоматизувати створення та оптимізацію промптів для Claude за допомогою фреймворку DSPy

Ручне написання промптів — це справжній біль: ти витрачаєш години на підбір формулювань, а результат все одно непередбачуваний. 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-дайджест

Найкращі статті про ШІ та автоматизацію — без спаму, лише суть

Без спаму · Відписатись будь-коли

Telegram