Проблема: почему бизнесу нужны 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 использовала гибридный подход:
- Для классификации интентов: дообучили BERT-base на своих данных
- Для генерации SQL: использовали GPT-4 через API для продакшена и локально развернутые open-source модели из нашего топа для тестирования
- Для понимания схемы: создали эмбеддинги для всех полей БД с помощью 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 внедряла систему поэтапно:
- Бета-тест: 10 пользователей, только простые запросы
- Сбор обратной связи: фиксация всех ошибок и неверных интерпретаций
- Дообучение моделей: добавление проблемных случаев в тренировочные данные
- Постепенное расширение: добавление новых типов запросов и таблиц
Ключевые ошибки, которых стоит избегать
Ошибка #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-агентов зависит не от сложности моделей, а от глубокого понимания бизнес-процессов, итеративного подхода и внимания к безопасности. Начните с малого, измеряйте результаты, масштабируйте постепенно.