В эпоху, когда 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-средах для снижения затрат.
02Ключевые инсайты по оптимизации
Анализ трейсов (traces) выявил конкретную причину сбоев: инструкция "don't call describe_table if you already have the information" (не вызывайте describe_table, если информация уже есть) в сочетании с отсутствием имен колонок в схеме приводила к галлюцинациям. Модель пыталась угадать структуру, ошибалась и попадала в цикл исправления ошибок.
Решение оказалось простым, но эффективным: включение имен столбцов в системный промпт или смягчение запрета на вызов describe_table. Это устранило необходимость угадывания и снизило количество ошибок.
03Инструментарий и установка
Для воспроизведения эксперимента требуется актуальная версия Datasette (alpha), плагин datasette-agent и библиотека DSPy. Ниже приведена команда для настройки окружения:
pip install datasette datasette-agent dspyПосле установки необходимо инициализировать DSPy-контекст и подключить провайдер LLM (в примере использовался OpenAI, но DSPy поддерживает и другие, включая локальные модели через Ollama или LM Studio, что актуально для работы из РФ).
import dspy
# Инициализация DSPy с использованием OpenAI
# Для локальных моделей можно использовать LMStudio или Ollama
dspy.settings.configure(lm=dspy.OpenAI(model='gpt-4.1-mini'))04Метрики оценки
DSPy позволяет создавать кастомные метрики. В данном случае оценивались:
- SQL Validity: Проходит ли сгенерированный запрос валидацию SQLite?
- Result Match: Совпадают ли результаты запроса модели с эталонным результатом?
- Token Efficiency: Сколько токенов потрачено на исправление ошибок?
Автоматическая генерация датасета (auto-generated dataset) сыграла ключевую роль. Ручное создание сотен пар «вопрос-SQL» заняло бы дни, тогда как автоматизация позволила быстро протестировать множество вариантов промптов.
05Пример улучшенного промпта
На основе выводов DSPy, базовый промпт был модифицирован. Вместо того чтобы прятать детали схемы, мы явно включаем имена колонок в контекст.
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 ↗
