Користувач хоче побачити витрати за минулий місяць за категоріями, але API віддає сирий JSON — це незручно. Ми вирішуємо це завдання за допомогою AI-агента, який перетворює природну мову на SQL і повертає готовий відформатований результат. Таким чином, генерація SQL-запитів стає інтуїтивною та безпечною. Наш досвід показує: правильно налаштований Text-to-SQL скорочує час розробки аналітичних екранів у 2–3 рази, при цьому безпека даних залишається на першому місці. За 8 років роботи ми реалізували понад 15 проєктів з інтеграцією LLM у мобільні застосунки — на SwiftUI, Kotlin та Flutter. Таке рішення економить до 40% бюджету на інтеграцію (наприклад, від $5,000 до $20,000 на проєкт) та прискорює виведення фіч.
Чому Text-to-SQL на мобільному — окрема задача
Прямий доступ мобільного застосунку до продуктової БД — погана ідея, навіть read-only. Правильна архітектура, яку ми застосовуємо: мобільний клієнт → бекенд API з агентом → БД. Бекенд валідує згенерований SQL, обмежує набір доступних таблиць і контролює права користувача. На клієнті використовується або локальна БД (SQLite через Room на Android, Core Data / GRDB на iOS) для офлайн-даних, або агент працює на сервері та повертає готові дані. Гарантуємо, що без нашої архітектури ви ризикуєте отримати витік даних. Альтернативні підходи (прямий SQL із клієнта) збільшують ризики у 3–5 разів.
Як навчити модель вашій схемі БД
Модель не знає вашу схему. Її потрібно передавати в системному промпті або через інструмент get_schema. Виконайте такі кроки:
- Відібрати лише релевантні таблиці (наприклад, 5–8 для застосунку з особистими фінансами).
- Спроєктувати системний промпт із описом схеми та обмеженнями (тільки SELECT, обов'язковий WHERE user_id = :user_id).
- Додати валідатор на сервері, який перевіряє AST згенерованого SQL.
Приклад схеми для промпту
-- Приклад схеми для промпту (спрощена)
CREATE TABLE transactions (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL,
amount DECIMAL(10,2) NOT NULL,
category VARCHAR(50),
description TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
У системний промпт додаємо: «Ти генеруєш SQL-запити ТІЛЬКИ для SELECT. Ніколи не використовуй INSERT, UPDATE, DELETE, DROP. Всі запити повинні містити WHERE user_id = :user_id.» Обмеження через промпт — перший шар захисту. Другий шар — валідація на сервері: парсимо AST згенерованого SQL (бібліотека sql-parser або pg_query для PostgreSQL), перевіряємо тип запиту та список таблиць.
Як захистити дані при генерації запитів?
Окрім промпту, ми впроваджуємо обов'язкові заходи: параметризовані підзапити, whitelist таблиць і колонок, ліміт результатів LIMIT 1000, таймаут SET statement_timeout = '5s' та повне логування. Всі запити перед виконанням проходять через AST-валідатор, який гарантує, що модель не порушила контракт. Цей підхід забезпечує безпеку SQL без втрати гнучкості. При тестуванні на 50 запитах точність валідних SQL становить 92%.
Як інтегрувати агент з локальною БД Room на Android?
Якщо агент працює з локальними даними застосунку через Room, адаптуємо SQL-інтерфейс. Згідно з офіційною документацією Google, Room дозволяє виконувати сирі SQL-запити через SupportSQLiteDatabase. Ось приклад:
class DatabaseTool(private val db: AppDatabase) {
suspend fun executeQuery(sql: String): String {
return try {
val cursor = db.openHelper.readableDatabase.query(sql)
cursor.toJsonArray().toString()
} catch (e: Exception) {
"""{"error": "${e.message}"}"""
}
}
}
SupportSQLiteDatabase.query() приймає сирий SQL — зручно для агента. Room DAO тут не підходить: він вимагає фіксованих запитів на етапі компіляції. Важливий момент: Room не дозволяє raw queries в основному потоці — все виконується в suspend fun або withContext(Dispatchers.IO). Це збільшує надійність та запобігає блокуванню UI.
Як відформатувати результат для користувача?
Агент отримав рядки з БД — потрібно повернути їх користувачеві в читабельному вигляді, а не як JSON-масив. Передаємо результат назад моделі з інструкцією відформатувати:
Tool result: [{"category":"food","total":"-15420"},{"category":"transport","total":"-8300"}]
→ Модель форматує: "За минулий місяць витрати за категоріями становлять..."
Для числових даних добре працює запит до моделі на створення Markdown-таблиці — її легко відрендерити на мобільному через Markwon (Android), AttributedString (iOS) або flutter_markdown (Flutter).
Порівняння: локальний агент проти серверного
Серверний агент забезпечує безпеку в 3–5 разів краще за локальний завдяки AST-валідації. Детальне порівняння:
| Характеристика | Локальний агент (Room) | Серверний агент (PostgreSQL) |
|---|---|---|
| Затримка | <50 мс | 200–500 мс (мережа) |
| Безпека | Обмежена пісочницею ОС | AST-валідація + промпт |
| Складність схеми | До 10 таблиць | Без обмежень |
| Офлайн-режим | Так | Ні |
| Вартість впровадження | Нижча | Вища, але масштабується |
| Кількість користувачів | 1 | Необмежено |
Серверний агент краще підходить для складних схем і багатокористувацьких систем, локальний — для простих офлайн-сценаріїв. Вибір залежить від ваших завдань. Замовте консультацію — ми підберемо оптимальне рішення під ваш бюджет і терміни.
Етапи та терміни
| Етап | Опис | Тривалість |
|---|---|---|
| Аналіз | Вивчення схеми, виділення релевантних таблиць | 2–3 дні |
| Проєктування | Системний промпт, валідатор, архітектура | 3–5 днів |
| Реалізація | Інтеграція агента на бекенді або клієнті | 7–14 днів |
| Тестування | Покриття всіх типів запитів, виправлення помилок | 5–7 днів |
| Деплой та моніторинг | Запуск, логування, налаштування алертів | 2–3 дні |
Повний цикл триває від 2 до 6 тижнів залежно від складності схеми та обраного архітектурного підходу. Наша компанія має 8-річний досвід у створенні мобільних рішень та виконала понад 15 успішних проєктів з інтеграцією LLM. Замовте консультацію — ми підберемо оптимальне рішення під ваш бюджет і терміни.
Що входить у роботу
- Аналіз схеми БД та визначення доступних таблиць
- Розробка системного промпту з описом схеми
- Реалізація SQL-валідатора на бекенді
- Інтеграція агентного циклу (виклик LLM, виконання, форматування)
- Тестування на 50+ користувацьких запитах
- Моніторинг якості генерації та доопрацювання
Додатково надаємо документацію з архітектури, навчання команди та гарантію на 6 місяців підтримки. Зв'яжіться з нами, щоб обговорити ваш проєкт — оцінимо його за 1 робочий день.







