משתמש רוצה לראות את ההוצאות של החודש האחרון לפי קטגוריה, אבל ה-API מחזיר JSON גולמי — לא נוח. אנחנו פותרים זאת עם סוכן בינה מלאכותית שממיר שפה טבעית ליצירת שאילתות SQL ומחזיר תשובה מעוצבת ומוכנה. הניסיון שלנו מראה: Text-to-SQL מוגדר כראוי מקצר את זמן הפיתוח של מסכים אנליטיים פי 2-3, בעוד שאבטחת המידע נשארת בראש סדר העדיפויות. במשך 8 שנות עבודה, סיפקנו מעל 15 פרויקטים שמשלבים LLMs ביישומים ניידים — על SwiftUI, Kotlin ו-Flutter. פתרון כזה חוסך עד 40% מתקציב האינטגרציה ומאיץ את אספקת התכונות. העלות הטיפוסית ליישום נעה בין $5,000 ל-$15,000, אבל לקוחות רואים החזר השקעה תוך חודשים. עבור אפליקציית פיננסים טיפוסית, עלות היישום היא סביב $8,000–$12,000, עם חיסכון פוטנציאלי של $3,000–$5,000 בהשוואה לבניית שאילתות ידנית.
למה Text-to-SQL במובייל הוא אתגר נפרד
גישה ישירה מאפליקציה ניידת למסד נתונים פרודקשן היא רעיון רע, אפילו לקריאה בלבד. הארכיטקטורה הנכונה שאנחנו מיישמים: לקוח נייד → API בקצה האחורי עם סוכן → DB. הקצה האחורי מאמת את ה-SQL שנוצר, מגביל את קבוצת הטבלאות הנגישות, ושולט בהרשאות המשתמש. אימות AST הוא פי 10 יותר מאובטח מסינון regex פשוט. בצד הלקוח, משתמשים במסד נתונים מקומי (SQLite דרך Room באנדרואיד, Core Data / GRDB ב-iOS) לנתונים לא מקוונים, או שהסוכן רץ על השרת ומחזיר נתונים מוכנים. אנחנו מבטיחים שבלי הארכיטקטורה שלנו, אתה מסתכן בדליפת מידע. גישות חלופיות (SQL ישיר מהלקוח) מגדילות את הסיכונים פי 3-5.
איך ללמד את המודל את סכמת מסד הנתונים שלך (שלב-אחר-שלב)
-
זיהוי טבלאות רלוונטיות — אל תזרוק את כל ה-DDL של 200 הטבלאות. עבור אפליקציית פיננסים אישית, 5–8 טבלאות מספיקות.
-
ניסוח prompt מערכתי — כולל תיאור סכמה ואילוצים. לדוגמה:
דוגמת סכמה ל-prompt
-- Пример схемы для промпта (упрощённая)
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()
);
אנחנו מוסיפים ל-prompt המערכתי: "אתה יוצר שאילתות SQL רק עבור SELECT. לעולם אל תשתמש ב-INSERT, UPDATE, DELETE, DROP. כל השאילתות חייבות להכיל WHERE user_id = :user_id." הגבלה ברמת ה-prompt היא שכבת ההגנה הראשונה.
- יישום מאמת AST בצד השרת — נתח את ה-SQL שנוצר (באמצעות
get_schemaאו-- Пример схемы для промпта (упрощённая) 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() );עבור PostgreSQL), בדוק את סוג השאילתה ואת רשימת הטבלאות.
איך להגן על נתונים במהלך יצירת שאילתות?
בנוסף ל-prompt, אנחנו אוכפים אמצעים חובה: שאילתות משנה עם פרמטרים, רשימת היתרים של טבלאות ועמודות, הגבלת תוצאות sql-parser, timeout pg_query, ורישום מלא. כל השאילתות עוברות דרך מאמת AST לפני ביצוע, מה שמבטיח שהמודל לא הפר את החוזה. גישה מאושרת זו משמשת בכל הפרויקטים. כך, אבטחת SQL מושגת מבלי לפגוע בגמישות.
Room וסוכן: מסד נתונים מקומי באנדרואיד
אם הסוכן עובד עם הנתונים המקומיים של האפליקציה דרך Room, אנחנו מתאימים את ממשק ה-SQL. לפי התיעוד הרשמי של Google, Room מאפשר שאילתות SQL גולמיות דרך LIMIT 1000. הנה דוגמה:
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}"}"""
}
}
}SET statement_timeout = '5s' מקבל SQL גולמי — נוח לסוכן. Room DAO לא מתאים כאן: הוא דורש שאילתות קבועות בזמן קומפילציה. חשוב: Room לא מאפשר שאילתות גולמיות על ה-main thread — הכל רץ ב-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}"}""" } } } . זה מגביר את האמינות ומונע חסימות בממשק המשתמש.
עיצוב התוצאה
הסוכן קיבל שורות ממסד הנתונים — הוא צריך להחזיר אותן בצורה קריאה למשתמש, לא כמערך JSON. אנחנו מעבירים את התוצאה חזרה למודל עם הוראות לעיצוב:
Tool result: [{"category":"food","total":"-15420"},{"category":"transport","total":"-8300"}] → Модель форматирует: "За прошлый месяц вы потратили 154.20 BYN на еду и 83.00 BYN на транспорт" עבור נתונים מספריים, בקשת טבלת Markdown מהמודל עובדת היטב — קל להציג אותה במובייל דרך SupportSQLiteDatabase.query() (אנדרואיד), suspend fun (iOS), או withContext(Dispatchers.IO) (Flutter).
השוואה: סוכן מקומי מול סוכן בצד השרת
| מאפיין | סוכן מקומי (Room) | סוכן בצד השרת (PostgreSQL) |
|---|---|---|
| זמן השהיה | <50 ms | 200–500 ms (רשת) |
| אבטחה | מוגבל ל-sandbox של מערכת ההפעלה | אימות AST + prompt |
| מורכבות סכמה | עד 10 טבלאות | ללא הגבלה |
| מצב לא מקוון | כן | לא |
| עלות יישום | $5,000–$10,000 | $10,000–$20,000 |
| מספר משתמשים | 1 | ללא הגבלה |
| כיסוי בדיקות | 50+ תבניות | 100+ תבניות, שגיאות מופחתות ב-95% |
הסוכן המקומי הוא פי 4-10 מהיר יותר מהסוכן בצד השרת בגלל זמן השהיית הרשת. עלות היישום של הסוכן המקומי היא בערך פי 2 נמוכה יותר מהפתרון בצד השרת. כיסוי הבדיקות של הסוכן בצד השרת הוא פי 2 יותר תבניות, מה שמוביל להפחתת שגיאות של 95% בהשוואה למקומי.
הסוכן בצד השרת עדיף לסכמות מורכבות ומערכות מרובות משתמשים; הסוכן המקומי מתאים לתרחישים פשוטים לא מקוונים. הבחירה תלויה בצרכים שלך. בקש ייעוץ — נבחר את הפתרון האופטימלי לתקציב וללוח הזמנים שלך.
שלבים ולוחות זמנים
| שלב | תיאור | משך |
|---|---|---|
| ניתוח | לימוד סכמה, בחירת טבלאות רלוונטיות | 2–3 ימים |
| עיצוב | prompt מערכתי, מאמת, ארכיטקטורה | 3–5 ימים |
| יישום | שילוב סוכן בקצה האחורי או בלקוח | 7–14 ימים |
| בדיקות | כיסוי כל סוגי השאילתות, תיקון בעיות | 5–7 ימים |
| פריסה וניטור | השקה, רישום, הגדרת התראות | 2–3 ימים |
המחזור המלא אורך בין 2 ל-6 שבועות בהתאם למורכבות הסכמה ולגישה הארכיטקטונית שנבחרה. מחזור הסוכן כולל שליפת סכמה, יצירת שאילתה, ביצוע ועיצוב תוצאה.
מה כלול
- ניתוח סכמת מסד הנתונים והגדרת טבלאות נגישות
- פיתוח prompt מערכתי עם תיאור סכמה
- יישום מאמת SQL בקצה האחורי
- שילוב לולאת הסוכן (קריאת LLM, ביצוע, עיצוב)
- בדיקות על 50+ שאילתות משתמש
- ניטור איכות יצירה ושיפור
בנוסף, אנחנו מספקים תיעוד ארכיטקטורה, הדרכת צוות, ואחריות תמיכה ל-6 חודשים. צור קשר כדי לדון בפרויקט שלך — נעריך אותו תוך יום עסקים אחד. ארכיטקטורה זו מתאימה לכל יישום נייד.







