Главная/Блог/Аналитика/DSPy для оптимизации SQL-промптов…
Аналитика4 мин чтения · 2 июля 2026 г.

DSPy для оптимизации SQL-промптов Datasette Agent

Как использовать фреймворк DSPy для автоматической оценки и улучшения системных промптов Datasette Agent, устраняя ошибки генерации SQL-запросов.

DSPy для оптимизации SQL-промптов Datasette Agent

В эпоху, когда LLM становятся основой для агентов, работающих с данными, качество системного промпта критично. Simon Willison продемонстрировал практический подход к оптимизации SQL-генерации в Datasette Agent с помощью фреймворка DSPy. Вместо ручной итерации над текстом промпта, автор использовал автоматизированную оценку (evals) и генерацию датасетов для поиска узких мест в логике модели.

Ключевая проблема, выявленная в ходе исследования: базовый промпт предоставлял только имена таблиц, но не имена столбцов. Это заставляло модель угадывать названия колонок (например, page_count, o.order_id), что приводило к ошибкам и бесконечным циклам повторных попыток (retry loops). DSPy позволил количественно оценить этот эффект и предложить конкретные улучшения.

01Архитектура тестового стенда

Для оценки использовалась связка из живого экземпляра Datasette, инструмента Datasette Agent и агентов DSPy. DSPy-агенты вызывали реальные реализации инструментов Datasette Agent, передавая им запросы пользователя. Оценка производилась на основе «золотого стандарта» — автоматически сгенерированного датасета корректных SQL-запросов.

Тестирование проводилось на моделях GPT-4.1 mini и nano, что важно для понимания поведения легких моделей, часто используемых в production-средах для снижения затрат.

💡
Важно для практиков. Использование DSPy позволяет не просто менять текст промпта, а измерять влияние каждого изменения на метрики точности (accuracy) и стоимости (cost per query). Это превращает настройку промптов из искусства в инженерную дисциплину.

02Ключевые инсайты по оптимизации

Анализ трейсов (traces) выявил конкретную причину сбоев: инструкция "don't call describe_table if you already have the information" (не вызывайте describe_table, если информация уже есть) в сочетании с отсутствием имен колонок в схеме приводила к галлюцинациям. Модель пыталась угадать структуру, ошибалась и попадала в цикл исправления ошибок.

Решение оказалось простым, но эффективным: включение имен столбцов в системный промпт или смягчение запрета на вызов describe_table. Это устранило необходимость угадывания и снизило количество ошибок.

03Инструментарий и установка

Для воспроизведения эксперимента требуется актуальная версия Datasette (alpha), плагин datasette-agent и библиотека DSPy. Ниже приведена команда для настройки окружения:

terminalbash
pip install datasette datasette-agent dspy

После установки необходимо инициализировать DSPy-контекст и подключить провайдер LLM (в примере использовался OpenAI, но DSPy поддерживает и другие, включая локальные модели через Ollama или LM Studio, что актуально для работы из РФ).

terminalpython
import dspy

# Инициализация DSPy с использованием OpenAI
# Для локальных моделей можно использовать LMStudio или Ollama
dspy.settings.configure(lm=dspy.OpenAI(model='gpt-4.1-mini'))
⚠️
Предупреждение по безопасности. Datasette Agent по умолчанию работает в режиме только для чтения (read-only). При оптимизации промптов убедитесь, что вы не добавляете инструкции, позволяющие модели выполнять write-операции или DROP-запросы, если это не требуется для вашей задачи.

04Метрики оценки

DSPy позволяет создавать кастомные метрики. В данном случае оценивались:

  • SQL Validity: Проходит ли сгенерированный запрос валидацию SQLite?
  • Result Match: Совпадают ли результаты запроса модели с эталонным результатом?
  • Token Efficiency: Сколько токенов потрачено на исправление ошибок?

Автоматическая генерация датасета (auto-generated dataset) сыграла ключевую роль. Ручное создание сотен пар «вопрос-SQL» заняло бы дни, тогда как автоматизация позволила быстро протестировать множество вариантов промптов.

05Пример улучшенного промпта

На основе выводов DSPy, базовый промпт был модифицирован. Вместо того чтобы прятать детали схемы, мы явно включаем имена колонок в контекст.

terminaltext
SYSTEM_PROMPT = """
You are an assistant that answers questions about a database using SQL.

Database Schema:
- Table: users
  Columns: id, name, email, created_at
- Table: orders
  Columns: id, user_id, total, status, order_date

Rules:
1. Use only SELECT queries.
2. If you need column names, you can use the schema above.
3. Do not guess column names. If unsure, use the schema provided.
"""

Такой подход исключает необходимость вызова describe_table в большинстве случаев, экономя токены и время, а также предотвращая ошибки угадывания.

06Кому подойдёт / что запустится

Этот подход идеален для:

  • Разработчиков Data Tools: Кто строит интерфейсы для запросов к базам данных (Chat-to-SQL).
  • Инженеров по LLM: Кто хочет автоматизировать A/B тестирование промптов без ручного труда.
  • Компаний с ограниченным бюджетом: Оптимизация промптов снижает количество токенов и ошибок, что критично при использовании дорогих моделей (GPT-4o, Claude Opus). Для бюджетных проектов (GPT-4.1 nano, Llama 3.1 8B) точность промпта становится еще важнее.

Для запуска в условиях РФ рекомендуется использовать локальные модели через Ollama (например, llama3.1:8b или mistral-nemo) в связке с DSPy, так как DSPy поддерживает прокси и локальные эндпоинты. Это позволит проводить оптимизацию без зависимости от зарубежных API.

Источник: Simon Willison ↗