NL-to-SQL агенты: кейс Suzano по внедрению AI в бизнес-процессы | AiManual
AiManual Logo Ai / Manual.
29 Дек 2025 Гайд

Как настроить агентный workflow: пример от мирового лидера целлюлозы Suzano

Пошаговый гайд по настройке агентного workflow на примере Suzano. Как переводить естественный язык в SQL, автоматизировать запросы и внедрять AI в больших компа

Проблема: почему бизнесу нужны AI-агенты для работы с данными?

Представьте крупную компанию с сотнями таблиц в базе данных, где каждый день десятки менеджеров задают вопросы типа: "Какие регионы показали рост продаж в прошлом квартале?" или "Сколько сырья осталось на складе в Бразилии?". Каждый такой запрос требует:

  • Обращения к data-аналитику
  • Ожидания в очереди на выполнение
  • Риска неверной интерпретации требования
  • Потери времени на уточнения

Именно с этой проблемой столкнулась Suzano — мировой лидер в производстве целлюлозы с годовым оборотом $10+ млрд. Их база данных содержала тысячи таблиц по цепочке поставок, производству, логистике и продажам. Бизнес-пользователи тратили дни на получение простых ответов.

Ключевой инсайт: 80% запросов к данным были простыми и повторяющимися, но требовали участия технических специалистов. Автоматизация этих запросов через NL-to-SQL агентов могла высвободить сотни человеко-часов ежемесячно.

Решение: архитектура агентного workflow Suzano

Команда Suzano разработала многоагентную систему, где каждый агент выполнял конкретную задачу в цепочке преобразования естественного языка в SQL-запрос. Вот как это работает:

Агент Задача Технологии
Intent Classifier Определить тип запроса (аналитика, отчет, прогноз) Fine-tuned BERT
Schema Understanding Сопоставить сущности из запроса с таблицами и полями БД Embeddings + векторный поиск
SQL Generator Сгенерировать корректный SQL-запрос GPT-4 + CodeLlama
Query Validator Проверить безопасность и производительность запроса SQL parser + правила
Result Interpreter Преобразовать результаты в понятный текст/график LLM + visualization libs

Эта архитектура позволила достичь 92% точности в преобразовании естественного языка в SQL, сократив время ответа с дней до секунд.

Пошаговый план внедрения агентного workflow

1 Анализ и подготовка данных

Перед написанием кода Suzano потратила 2 недели на:

  • Сбор use-cases: проанализировали 1000+ реальных запросов от бизнес-пользователей
  • Документирование схемы БД: создали подробное описание всех таблиц, полей, связей и бизнес-логики
  • Создание тестового набора: 500 пар "естественный язык → правильный SQL" для валидации
# Пример подготовки данных для обучения
import json

# Структура training data
training_examples = [
    {
        "natural_language": "Показать продажи за последний месяц по регионам",
        "sql": "SELECT region, SUM(sales_amount) FROM sales WHERE sale_date >= DATEADD(month, -1, GETDATE()) GROUP BY region",
        "tables_involved": ["sales"],
        "business_domain": "sales_analytics"
    }
]

with open('training_data.json', 'w') as f:
    json.dump(training_examples, f, ensure_ascii=False, indent=2)

2 Выбор и настройка моделей

Suzano использовала гибридный подход:

  1. Для классификации интентов: дообучили BERT-base на своих данных
  2. Для генерации SQL: использовали GPT-4 через API для продакшена и локально развернутые open-source модели из нашего топа для тестирования
  3. Для понимания схемы: создали эмбеддинги для всех полей БД с помощью sentence-transformers
💡
Важно: не пытайтесь использовать одну модель для всех задач. Специализированные модели для конкретных подзадач работают лучше и дешевле, чем одна большая модель.

3 Разработка workflow с LangChain

Вот упрощенная версия workflow, которую можно адаптировать:

from langchain.agents import AgentExecutor, create_react_agent
from langchain.tools import Tool
from langchain_community.utilities import SQLDatabase
from langchain_openai import ChatOpenAI

class NLToSQLWorkflow:
    def __init__(self, db_uri):
        self.db = SQLDatabase.from_uri(db_uri)
        self.llm = ChatOpenAI(model="gpt-4", temperature=0)
        
        # Определяем инструменты для агента
        self.tools = [
            Tool(
                name="get_schema_info",
                func=self.get_relevant_schema,
                description="Получить информацию о схемах таблиц"
            ),
            Tool(
                name="execute_sql",
                func=self.execute_safe_query,
                description="Выполнить SQL запрос и вернуть результаты"
            )
        ]
        
        self.agent = create_react_agent(
            llm=self.llm,
            tools=self.tools,
            prompt=self.create_prompt()
        )
        self.agent_executor = AgentExecutor(agent=self.agent, tools=self.tools)
    
    def get_relevant_schema(self, user_query: str) -> str:
        """Найти релевантные таблицы по запросу пользователя"""
        # Здесь логика векторного поиска по описаниям таблиц
        return "Таблицы: sales, regions, products"
    
    def execute_safe_query(self, sql_query: str) -> str:
        """Безопасное выполнение SQL с валидацией"""
        # Проверяем, что нет DROP, DELETE и т.д.
        if any(keyword in sql_query.upper() for keyword in ["DROP", "DELETE", "UPDATE"]):
            return "ERROR: Запрещенная операция"
        return self.db.run(sql_query)
    
    def process_query(self, user_query: str) -> dict:
        """Основной метод обработки запроса"""
        result = self.agent_executor.invoke({
            "input": f"Преобразуй запрос в SQL: {user_query}"
        })
        return {
            "sql": self.extract_sql(result["output"]),
            "result": result["output"],
            "tables_used": self.extract_tables(result["output"])
        }

Для более сложных сценариев рассмотрите альтернативные фреймворки из нашего обзора.

4 Безопасность и валидация

Самая критичная часть — предотвращение опасных запросов:

  • SQL Injection protection: всегда используйте параметризованные запросы
  • Read-only доступ: агенты должны работать с read-only пользователем БД
  • Query limits: ограничение на время выполнения и количество возвращаемых строк
  • Audit log: логирование всех запросов и их авторов
-- Создание безопасного пользователя для агента
CREATE USER ai_agent WITH PASSWORD 'secure_password';
GRANT SELECT ON ALL TABLES IN SCHEMA public TO ai_agent;
REVOKE INSERT, UPDATE, DELETE, DROP, TRUNCATE ON ALL TABLES 
IN SCHEMA public FROM ai_agent;

-- Установка лимитов
ALTER USER ai_agent SET statement_timeout = '30s';
ALTER USER ai_agent SET max_rows = 10000;

5 Тестирование и итеративное улучшение

Suzano внедряла систему поэтапно:

  1. Бета-тест: 10 пользователей, только простые запросы
  2. Сбор обратной связи: фиксация всех ошибок и неверных интерпретаций
  3. Дообучение моделей: добавление проблемных случаев в тренировочные данные
  4. Постепенное расширение: добавление новых типов запросов и таблиц

Ключевые ошибки, которых стоит избегать

Ошибка #1: Попытка охватить все возможные запросы сразу. Начинайте с 20% самых частых use-cases, которые покрывают 80% потребностей.

Ошибка #2: Недооценка важности качества данных о схеме БД. Потратьте время на создание понятных описаний таблиц и полей на естественном языке.

Ошибка #3: Отсутствие человеческого контроля. Всегда добавляйте возможность для пользователя исправить сгенерированный SQL перед выполнением.

Результаты внедрения в Suzano

Через 6 месяцев после внедрения система показала впечатляющие результаты:

Метрика До внедрения После внедрения Улучшение
Время получения ответа 2-3 дня 30 секунд 99.9% быстрее
Загрузка data-аналитиков 40% на простые запросы 5% Высвобождено 35% времени
Точность ответов ~85% (человеческий фактор) 92% +7% точности
Количество запросов 200/месяц 1200/месяц В 6 раз больше

FAQ: ответы на частые вопросы

Какие модели лучше всего подходят для NL-to-SQL?

Для продакшена Suzano использует GPT-4 из-за высокой точности. Для локального развертывания рассмотрите CodeLlama 34B или DeepSeek-Coder. Важно: модель должна быть обучена на код, а не только на текст.

Как обрабатывать сложные запросы с JOIN 5+ таблиц?

Suzano использует двухэтапный подход: 1) сначала генерирует упрощенный запрос к основной таблице, 2) если нужны детали — уточняет у пользователя и добавляет JOIN. Также создали "шаблоны" для часто используемых сложных запросов.

Что делать с устаревшей или недокументированной схемой БД?

Потратьте 1-2 недели на реверс-инжиниринг: автоматически генерируйте описание таблиц на основе имен полей, sample данных и внешних ключей. Можно использовать LLM для генерации human-readable описаний.

Что дальше? Эволюция агентных систем

NL-to-SQL — только первый шаг. Suzano уже работает над:

  • Прогнозными агентами: не просто "что было", а "что будет если..."
  • Мультимодальным интерфейсом: загрузка Excel/PDF и автоматический анализ
  • Автономным действиям: агенты не только анализируют, но и выполняют простые действия (создание заявок, уведомление менеджеров)

Если вы хотите глубже погрузиться в развитие AI-агентов, рекомендую нашу статью "Куда двигаться после RAG и финтюна".

Главный вывод: Успех внедрения AI-агентов зависит не от сложности моделей, а от глубокого понимания бизнес-процессов, итеративного подхода и внимания к безопасности. Начните с малого, измеряйте результаты, масштабируйте постепенно.