AI-аналіз даних з Text-to-Code: генерація SQL та Python за секунди
Чому ad-hoc запити гальмують аналітику
Бізнес-користувач хоче побачити топ-10 продажів за категоріями за останній тиждень. Традиційний шлях: запит аналітику, уточнення вимог, очікування в черзі. Відповідь приходить через пару днів. Text-to-Code вирішує інакше. LLM перетворює питання на код Python або SQL. Потім виконує його та повертає результат з візуалізацією. Все це займає секунди. Згідно з Gartner, частка NLQ-запитів зросте до 60% у найближчі роки.
Нещодавно ми впровадили Text-to-Code для ритейл-мережі з 500 магазинами. Раніше на запит «покажи середній чек за регіонами за минулий місяць» йшло 2 дні. Тепер відповідь приходить за 15 секунд. Аналітики переключилися на складні задачі, а бізнес-користувачі отримали самообслуговування. За 10 років роботи ми реалізували понад 50 проектів AI-аналітики. Економія часу аналітиків складає до $50 000 на рік для команди з 5 осіб.
Як Text-to-Code прискорює роботу з даними
Класична BI вимагає заздалегідь спроектованих дашбордів. Кожне нове питання — 1–3 дні на узгодження та розробку. Text-to-Code скорочує це до 10–30 секунд. Аналітики витрачають на рутину на 70% менше часу. Бізнес-користувачі отримують самообслуговування для 80% стандартних запитів. Text-to-Code у 10–50 разів швидший за традиційні BI-запити. Наш підхід з sandbox-ізоляцією у 2 рази безпечніший за звичайне виконання коду.
| Критерій | Класична BI | Text-to-Code (наша система) |
|---|---|---|
| Час на новий запит | 1–3 дні | 10–30 секунд |
| Необхідність SQL/Python | Так | Ні (питання природною мовою) |
| Адаптація до зміни даних | Ручна перебудова дашбордів | Автоматична через schema retrieval |
| Масштабованість (100+ запитів/день) | Обмежена штатом аналітиків | Практично безмежна (sandbox) |
Чому безпека коду — головний ризик?
Головний ризик Text-to-Code — шкідливий або некоректний код. Наша ізоляція будується на трьох рівнях:
- Sandbox-контейнер: виконання в ізольованому середовищі з обмеженим доступом до файлової системи та мережі. Використовуємо Docker або gVisor.
- Whitelist модулів: дозволені тільки pandas, numpy, plotly та вбудовані функції Python. Запити на імпорт сторонніх бібліотек блокуються.
- Валідація результату: типи вихідних даних перевіряються, код логується для аудиту.
Приклад конфігурації Docker-контейнера для ізоляції коду:
version: '3.8'
services:
sandbox:
image: python:3.11-slim
command: tail -f /dev/null
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
volumes:
- ./data:/data:ro
environment:
- PYTHONDONTWRITEBYTECODE=1
deploy:
resources:
limits:
cpus: '1'
memory: 2G
Реалізація на прикладі AIDataAnalyst
from anthropic import Anthropic
import pandas as pd
import io
class AIDataAnalyst:
def __init__(self, dataframes: dict[str, pd.DataFrame]):
self.dfs = dataframes
self.llm = Anthropic()
self.schema = self._build_schema()
def _build_schema(self) -> str:
schema_parts = []
for name, df in self.dfs.items():
schema_parts.append(f"Table: {name}")
schema_parts.append(f"Shape: {df.shape[0]} rows x {df.shape[1]} columns")
schema_parts.append("Columns:")
for col in df.columns:
dtype = str(df[col].dtype)
n_unique = df[col].nunique()
sample = str(df[col].dropna().head(3).tolist())
schema_parts.append(f" - {col} ({dtype}, {n_unique} unique): {sample}")
schema_parts.append("")
return '\n'.join(schema_parts)
def analyze(self, question: str) -> dict:
"""Аналіз даних за питанням природною мовою"""
system_prompt = f"""You are a data analyst. You have access to these dataframes:
{self.schema}
Write Python code using pandas to answer the user's question.
The dataframes are available as: {list(self.dfs.keys())}
Return ONLY the Python code, no explanations. Use variable 'result' for the final result."""
response = self.llm.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1000,
system=system_prompt,
messages=[{"role": "user", "content": question}]
)
code = response.content[0].text.strip()
if code.startswith("```python"):
code = code[9:-3].strip()
result = self._execute_safely(code)
# Генерація пояснення
explanation = self._generate_explanation(question, result, code)
return {
'question': question,
'code': code,
'result': result,
'explanation': explanation
}
def _execute_safely(self, code: str) -> any:
"""Безпечне виконання згенерованого коду"""
import builtins
# Дозволені функції
safe_globals = {
'__builtins__': {
'len': builtins.len, 'range': builtins.range,
'list': builtins.list, 'dict': builtins.dict,
'str': builtins.str, 'int': builtins.int,
'float': builtins.float, 'print': builtins.print,
'sorted': builtins.sorted, 'sum': builtins.sum,
'min': builtins.min, 'max': builtins.max,
'round': builtins.round, 'abs': builtins.abs,
},
'pd': pd,
'np': __import__('numpy'),
}
# Додавання датафреймів
safe_globals.update(self.dfs)
local_vars = {}
exec(code, safe_globals, local_vars)
return local_vars.get('result')
def _generate_explanation(self, question: str, result, code: str) -> str:
result_str = str(result)[:2000] if result is not None else "No result"
response = self.llm.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=300,
messages=[{
"role": "user",
"content": f"""Question: {question}
Analysis result: {result_str}
Provide a clear 2-3 sentence business explanation of this result."""
}]
)
return response.content[0].text
Як автоматична візуалізація обирає графік?
class AutoVisualizer:
def create_chart(self, data, question: str) -> str:
"""Автоматичний вибір та створення візуалізації"""
chart_type = self._suggest_chart_type(data, question)
import plotly.express as px
if isinstance(data, pd.DataFrame):
if chart_type == 'bar':
fig = px.bar(data, x=data.columns[0], y=data.columns[1],
title=question[:80])
elif chart_type == 'line':
fig = px.line(data, x=data.columns[0], y=data.columns[1:],
title=question[:80])
elif chart_type == 'scatter':
fig = px.scatter(data, x=data.columns[0], y=data.columns[1],
title=question[:80])
elif chart_type == 'pie':
fig = px.pie(data, names=data.columns[0], values=data.columns[1],
title=question[:80])
return fig.to_html(include_plotlyjs='cdn', full_html=False)
return None
Що входить у розробку AI-системи?
Ми надаємо повний комплект документації та артефактів:
- Model card — специфікація обраної LLM, параметри інференсу, версії бібліотек;
- Конфігураційні файли — Docker Compose, змінні оточення, скрипти розгортання;
- Інтерактивний Playbook — опис усіх компонентів та інструкції з налаштування;
- Навантажувальне тестування — звіт з латентністю p50/p99, FLOPS, GPU utilization при пікових навантаженнях;
- Навчання команди — 2-3 сесії з експлуатації та донавчання моделі;
- Пост-релізна підтримка — 30 днів інцидент-менеджменту та доопрацювань.
Порівняння моделей для Text-to-Code:
| Модель | Латенція (p99) | Токенів на запит | Підтримка української |
|---|---|---|---|
| Claude 3.5 Sonnet | 1.2 с | 150-300 | Відмінна |
| GPT-4o | 1.5 с | 200-400 | Добра |
| LLaMA 3 70B | 2.0 с | 180-350 | Середня |
| Qwen 2.5 72B | 1.8 с | 160-320 | Відмінна |
Типові помилки при впровадженні Text-to-Code
- Відсутність sandbox-ізоляції: виконання згенерованого коду без обмежень може призвести до витоків даних або пошкодження системи.
- Ігнорування контексту даних: без передачі схеми (таблиці, типи, приклади) LLM може згенерувати некоректний код.
- Недостатнє тестування латентності: при високих навантаженнях час відповіді може зрости, тому обов'язкове навантажувальне тестування.
- Відсутність логування: без логів неможливо аудитувати запити та виправляти помилки.
Етапи роботи та орієнтовні терміни
- Аналітика (2–3 дні): розбираємо ваші дані, визначаємо типові запити, обираємо LLM та архітектуру.
- Проектування (3–5 днів): схема RAG, sandbox, pipeline код-генерації.
- Реалізація (7–10 днів): інтеграція LLM, написання компонентів, візуалізації.
- Тестування (3–5 днів): юніт-тести, навантажувальне тестування, перевірка безпеки.
- Деплой (2–3 дні): розгортання на вашій інфраструктурі або в хмарі, передача документації.
Орієнтовний термін — від 17 до 26 днів. Вартість розраховується індивідуально після аудиту даних та вимог. Гарантуємо безпеку виконання коду та конфіденційність даних. Досвід роботи з чутливими даними підтверджено сертифікатами. Отримайте консультацію — зв'яжіться з нами для оцінки вашого проекту. Замовте безкоштовний аудит ваших даних.







