| # ארכיטקטורת המערכת - Feedback Analysis SQL-Based Agent | |
| ## סקירה כללית | |
| המערכת היא מערכת ניתוח משובי משתמשים מבוססת SQL ו-LLM. המערכת מקבלת שאלות בשפה טבעית, יוצרת שאילתות SQL, מבצעת אותן על הנתונים, ומחזירה תשובות מפורטות. | |
| ## זרימת הנתונים - מהפרונט לאחור | |
| ### 1. Frontend (1_frontend/) | |
| #### `index.html` | |
| **תפקיד**: ממשק המשתמש הראשי | |
| **סיבה לקיום**: מספק ממשק ווב אינטראקטיבי למשתמש | |
| **תפקידים**: | |
| - הצגת שדה קלט לשאלות | |
| - הצגת תשובות, שאילתות SQL, תוצאות, וגרפים | |
| - ניהול היסטוריית שאלות | |
| - אנימציית loading | |
| #### `app.js` | |
| **תפקיד**: לוגיקת Frontend | |
| **סיבה לקיום**: מטפל באינטראקציות המשתמש ותקשורת עם ה-Backend | |
| **תפקידים**: | |
| - שליחת שאלות ל-`/query-sql` endpoint | |
| - הצגת תשובות וגרפים | |
| - ניהול היסטוריה (טעינה ושחזור) | |
| - עיבוד ויזואליזציות עם Chart.js | |
| **זרימת נתונים**: | |
| ``` | |
| משתמש מזין שאלה → sendQuery() → POST /query-sql → קבלת תשובה → הצגה | |
| ``` | |
| ### 2. Backend API (2_backend_llm/app/api.py) | |
| #### `api.py` | |
| **תפקיד**: FastAPI endpoints - נקודת הכניסה של ה-Backend | |
| **סיבה לקיום**: מספק API RESTful לתקשורת בין Frontend ל-Backend | |
| **תפקידים**: | |
| - `GET /` - מחזיר את `index.html` | |
| - `POST /query-sql` - מקבל שאלה, מחזיר תשובה מפורטת | |
| - `GET /history` - מחזיר היסטוריית שאלות | |
| - `POST /health` - בדיקת תקינות השרת | |
| **זרימת נתונים**: | |
| ``` | |
| Frontend → POST /query-sql {query: "..."} | |
| → api.py:query_sql() | |
| → SQLFeedbackService.analyze_query() | |
| → SQLQueryResponse {summary, sql_queries, query_results, visualizations} | |
| → Frontend | |
| ``` | |
| **מודלים/פונקציות קרואות**: | |
| - `SQLFeedbackService` - השירות הראשי לניתוח | |
| - `save_history()` - שמירת היסטוריה לדיסק | |
| - `load_history()` - טעינת היסטוריה מהדיסק | |
| ### 3. SQL Service (2_backend_llm/app/sql_service.py) | |
| #### `sql_service.py` | |
| **תפקיד**: הליבה של המערכת - ניתוח SQL מבוסס LLM | |
| **סיבה לקיום**: מטפל בכל הלוגיקה של יצירת שאילתות SQL, ביצוען, וסינתזת תשובות | |
| **תפקידים**: | |
| - `analyze_query()` - הפונקציה הראשית - מנהלת את כל התהליך | |
| - `_get_schema_info()` - יוצר מידע מפורט על כל השדות בטבלה | |
| - `_generate_sql_queries()` - משתמש ב-LLM ליצירת שאילתות SQL | |
| - `_execute_sql_queries()` - מבצע שאילתות SQL על הנתונים | |
| - `_synthesize_answer()` - משתמש ב-LLM ליצירת תשובה מפורטת | |
| - `_evaluate_answer_quality()` - מעריך את איכות התשובה | |
| - `_generate_visualizations()` - יוצר מפרטי ויזואליזציות | |
| **זרימת נתונים**: | |
| ``` | |
| analyze_query(query) | |
| ↓ | |
| 1. _generate_sql_queries(query) | |
| → LLM (Gemini/OpenAI) מקבל: schema_info + query | |
| → מחזיר: ["SELECT ...", "SELECT ..."] | |
| ↓ | |
| 2. _execute_sql_queries(sql_queries) | |
| → טוען DataFrame ל-SQLite in-memory | |
| → מבצע כל שאילתה | |
| → מחזיר: [SQLQueryResult, ...] | |
| ↓ | |
| 3. _synthesize_answer(query, sql_queries, query_results) | |
| → LLM (Gemini/OpenAI) מקבל: query + sql_queries + results | |
| → מחזיר: תשובה מפורטת בעברית | |
| → (אופציונלי) _evaluate_answer_quality() + שיפור אם נדרש | |
| ↓ | |
| 4. _generate_visualizations(query_results) | |
| → מנתח את התוצאות | |
| → מחזיר: [visualization_spec, ...] | |
| ↓ | |
| AnalysisResult {user_query, sql_queries, query_results, summary, visualizations} | |
| ``` | |
| **מודלים/פונקציות קרואות**: | |
| - `LLM (Gemini/OpenAI)` - ליצירת שאילתות SQL וסינתזת תשובות | |
| - `pandas.DataFrame` - לניהול הנתונים | |
| - `sqlite3` - לביצוע שאילתות SQL | |
| ### 4. Data Loader (2_backend_llm/app/data_loader.py) | |
| #### `data_loader.py` | |
| **תפקיד**: טעינת נתונים מ-CSV | |
| **סיבה לקיום**: מטפל בטעינת וניקוי הנתונים מהקובץ | |
| **תפקידים**: | |
| - `load_feedback()` - טוען CSV, בודק שדות נדרשים, מנקה נתונים | |
| **זרימת נתונים**: | |
| ``` | |
| load_feedback() | |
| → קורא CSV מ-settings.csv_path | |
| → בודק שדות: ID, ServiceName, Level, Text | |
| → מסיר שורות עם Text ריק | |
| → מחזיר: pd.DataFrame | |
| ``` | |
| ### 5. Config (2_backend_llm/app/config.py) | |
| #### `config.py` | |
| **תפקיד**: הגדרות מערכת | |
| **סיבה לקיום**: מרכז את כל ההגדרות (API keys, נתיבי קבצים) | |
| **תפקידים**: | |
| - טעינת API keys מ-.env | |
| - הגדרת נתיב CSV ברירת מחדל | |
| - הגדרת שמות עמודות | |
| ## זרימה מלאה - דוגמה | |
| ### שאילתת משתמש: "מה הדירוג הממוצע לפי שירות?" | |
| 1. **Frontend** (`app.js`): | |
| ```javascript | |
| sendQuery() → POST /query-sql {query: "מה הדירוג הממוצע לפי שירות?"} | |
| ``` | |
| 2. **Backend API** (`api.py`): | |
| ```python | |
| @app.post("/query-sql") | |
| def query_sql(request: QueryRequest): | |
| result = sql_svc.analyze_query(request.query) | |
| save_history(result) # שמירה להיסטוריה | |
| return SQLQueryResponse(...) | |
| ``` | |
| 3. **SQL Service** (`sql_service.py`): | |
| ```python | |
| analyze_query("מה הדירוג הממוצע לפי שירות?") | |
| ``` | |
| 4. **שלב 1 - יצירת SQL**: | |
| ```python | |
| _generate_sql_queries(query) | |
| → LLM מקבל: schema_info + query | |
| → LLM מחזיר: ["SELECT ServiceName, AVG(Level) as avg_rating FROM Feedback_transformed GROUP BY ServiceName"] | |
| ``` | |
| 5. **שלב 2 - ביצוע SQL**: | |
| ```python | |
| _execute_sql_queries(["SELECT ServiceName, AVG(Level)..."]) | |
| → טוען DataFrame ל-SQLite | |
| → מבצע שאילתה | |
| → מחזיר: DataFrame עם ServiceName ו-avg_rating | |
| ``` | |
| 6. **שלב 3 - סינתזת תשובה**: | |
| ```python | |
| _synthesize_answer(query, sql_queries, query_results) | |
| → LLM מקבל: query + SQL + results | |
| → LLM מחזיר: "הדירוג הממוצע לפי שירות: שירות X - 4.2, שירות Y - 3.8..." | |
| → (אופציונלי) _evaluate_answer_quality() + שיפור | |
| ``` | |
| 7. **שלב 4 - יצירת ויזואליזציות**: | |
| ```python | |
| _generate_visualizations(query_results) | |
| → מחזיר: [{type: "bar", x: "ServiceName", y: "avg_rating", ...}] | |
| ``` | |
| 8. **חזרה ל-Frontend**: | |
| ```javascript | |
| קבלת תשובה → הצגת summary → הצגת גרף → עדכון היסטוריה | |
| ``` | |
| ## מבנה הנתונים | |
| ### AnalysisResult | |
| ```python | |
| { | |
| user_query: str, | |
| sql_queries: List[str], | |
| query_results: List[SQLQueryResult], | |
| summary: str, | |
| visualizations: Optional[List[Dict]] | |
| } | |
| ``` | |
| ### SQLQueryResult | |
| ```python | |
| { | |
| query: str, | |
| result: pd.DataFrame, | |
| error: Optional[str] | |
| } | |
| ``` | |
| ## LLM Models בשימוש | |
| 1. **יצירת SQL** (`_generate_sql_queries`): | |
| - Model: Gemini 2.0 Flash / GPT-4o-mini | |
| - Input: schema_info + user_query | |
| - Output: JSON עם רשימת שאילתות SQL | |
| 2. **סינתזת תשובה** (`_synthesize_answer`): | |
| - Model: Gemini 2.0 Flash / GPT-4o-mini | |
| - Input: user_query + sql_queries + query_results | |
| - Output: תשובה מפורטת בעברית | |
| 3. **הערכת איכות** (`_evaluate_answer_quality`): | |
| - Model: Gemini 2.0 Flash / GPT-4o-mini | |
| - Input: user_query + answer + context | |
| - Output: score (0-100) + reasoning | |
| ## Database Schema | |
| טבלה: `Feedback_transformed` (SQLite in-memory) | |
| שדות: | |
| - ID (UUID) | |
| - ServiceName (TEXT) | |
| - Level (INTEGER 1-5) | |
| - Text (TEXT) | |
| - ReferenceNumber (INTEGER, nullable) | |
| - RequestID (UUID, nullable) | |
| - ProcessID (UUID, nullable) | |
| - Year (INTEGER) | |
| - Month (INTEGER 1-12) | |
| - DayInMonth (INTEGER 1-31) | |
| - DayOfWeek (TEXT: Monday-Sunday) | |
| - Hour (INTEGER 0-23) | |
| - DayOrNight (TEXT: 'יום'/'לילה') | |
| ## תלויות בין מודולים | |
| ``` | |
| Frontend (app.js) | |
| ↓ HTTP POST | |
| API (api.py) | |
| ↓ | |
| SQL Service (sql_service.py) | |
| ↓ | |
| ├─→ Data Loader (data_loader.py) - טעינת נתונים | |
| ├─→ Config (config.py) - הגדרות | |
| └─→ LLM (Gemini/OpenAI) - יצירת SQL וסינתזת תשובות | |
| ``` | |
| ## נקודות כניסה | |
| 1. **Frontend**: `1_frontend/index.html` - נקודת הכניסה למשתמש | |
| 2. **Backend**: `2_backend_llm/run.py` - מפעיל את FastAPI server | |
| 3. **API**: `2_backend_llm/app/api.py` - מגדיר את ה-endpoints | |