LFED / docs /EXPANSION_PLAN.md
Kasualdad's picture
feat: fine-tuned model + GGUF export pipeline fixes
31c493f
|
Raw
History Blame Contribute Delete
11.3 kB
# LFED Training Data Expansion Plan
> **Last updated:** 2026-06-08
> **Goal:** Expand from 1,289 pairs on 2 tables → 10,000+ pairs across 8+ analytics domains
---
## Current State
### What We Have Now
- **Tables:** 2 (enrollment, attendance)
- **Training pairs:** 1,289 (template-generated)
- **Templates:** 32
- **Coverage:** Chronic absenteeism, enrollment counts, absence rates
- **Quality:** Good for narrow domain, but synthetic-feeling
### What's in local-data-stack (Untapped Analytics Domains)
From `/Users/flucido/projects/local-data-stack/rill_project/data/`:
| Domain | Table | Rows | Key Columns |
|---|---|---|---|
| Chronic Absenteeism Risk | chronic_absenteeism_risk | 1,700 | risk_score, risk_level, attendance_rate_30d/90d, discipline_incidents, demographics |
| Student Wellbeing | wellbeing_risk_profiles | 1,700 | attendance/discipline/academic_risk_scores, wellbeing_risk_level, primary_concern |
| Performance Correlations | performance_correlations | 3 | correlation_pair, coefficient, strength |
| Class Effectiveness | class_effectiveness | 300 | avg_grade, pct_passed, effectiveness_rating, ELL/SpEd/FRL pass rates |
| Equity Outcomes | equity_outcomes_by_demographics | 10 | race_ethnicity, ELL, SpEd, FRL, avg_gpa, pct_below_c |
---
## Phase 1: Schema Expansion (Add 6 New Tables)
Add these tables to the DuckDB seed data and update prompts.py:
### 1.1 grades
```sql
CREATE TABLE grades (
student_id INTEGER,
school_name VARCHAR,
school_year VARCHAR,
grade_level INTEGER,
course_name VARCHAR,
term VARCHAR, -- 'Fall', 'Spring'
letter_grade VARCHAR, -- 'A', 'B', 'C', 'D', 'F'
grade_numeric DOUBLE, -- 4.0, 3.0, etc.
gpa DOUBLE,
credit_hours DOUBLE
);
```
### 1.2 discipline
```sql
CREATE TABLE discipline (
incident_id INTEGER,
student_id INTEGER,
school_name VARCHAR,
school_year VARCHAR,
grade_level INTEGER,
incident_type VARCHAR, -- 'Defiance', 'Fighting', 'Vandalism', 'Substance', 'Bullying'
incident_date DATE,
severity VARCHAR, -- 'Minor', 'Major', 'Severe'
action_taken VARCHAR, -- 'Warning', 'Detention', 'Suspension', 'Expulsion'
days_suspended INTEGER
);
```
### 1.3 demographics
```sql
CREATE TABLE demographics (
student_id INTEGER,
school_name VARCHAR,
school_year VARCHAR,
grade_level INTEGER,
gender VARCHAR,
race_ethnicity VARCHAR,
english_learner BOOLEAN,
special_education BOOLEAN,
economically_disadvantaged BOOLEAN,
homeless_flag BOOLEAN,
migrant_flag BOOLEAN,
foster_youth BOOLEAN
);
```
### 1.4 assessments
```sql
CREATE TABLE assessments (
student_id INTEGER,
school_name VARCHAR,
school_year VARCHAR,
grade_level INTEGER,
assessment_type VARCHAR, -- 'SBAC', 'CAASPP', 'CELCAST', 'District Benchmark'
subject VARCHAR, -- 'ELA', 'Math', 'Science'
score DOUBLE,
proficiency_level VARCHAR, -- 'Below Standard', 'Near Standard', 'At/Above Standard'
growth_percentile INTEGER
);
```
### 1.5 programs
```sql
CREATE TABLE programs (
student_id INTEGER,
school_name VARCHAR,
school_year VARCHAR,
program_type VARCHAR, -- 'Title I', 'ELL Support', 'SpEd IEP', '504 Plan', 'MTSS Tier 1/2/3'
start_date DATE,
end_date DATE,
status VARCHAR -- 'Active', 'Exited', 'Transferred'
);
```
### 1.6 staff
```sql
CREATE TABLE staff (
staff_id INTEGER,
school_name VARCHAR,
school_year VARCHAR,
role VARCHAR, -- 'Teacher', 'Counselor', 'Admin', 'Aide'
subject_area VARCHAR,
years_experience INTEGER,
credential_type VARCHAR,
student_load INTEGER
);
```
---
## Phase 2: Training Data Expansion (1,289 → 10,000+ pairs)
### 2.1 New Template Categories (add ~150 templates)
#### Grades & GPA (~30 templates)
- Average GPA by school/grade/demographic
- Grade distribution (A/B/C/D/F counts and percentages)
- GPA trends over time
- Failing rate by course/teacher
- GPA comparison between schools
- Students below 2.0 GPA
- Honor roll counts
#### Discipline (~30 templates)
- Incident counts by type, school, year
- Suspension rates by demographic
- Discipline trends over time
- Most common incident types
- Students with multiple incidents
- Days lost to suspension by school
- Discipline correlation with attendance
#### Demographics (~20 templates)
- Enrollment by race/ethnicity
- ELL student counts and percentages
- SpEd population by school
- Economically disadvantaged rates
- Foster/homeless student counts
- Demographic breakdowns of outcomes
#### Assessments (~30 templates)
- Proficiency rates by subject and school
- Growth percentiles by grade
- Assessment score trends
- Below-standard student counts
- Demographic gaps in test scores
- School performance rankings
#### Programs (~20 templates)
- Active program counts by type
- MTSS tier distribution
- IEP/504 plan counts
- Program participation by school
- Title I eligible counts
#### Cross-Table Joins (~20 templates)
- Attendance vs. grades correlation
- Discipline incidents vs. GPA
- ELL status vs. assessment scores
- SpEd vs. chronic absenteeism
- Program participation vs. outcomes
### 2.2 Data Augmentation Strategies
#### A. Rephrasing (3-5x multiplier)
For each template, generate additional natural-language phrasings:
- **Formal:** "What is the average GPA for 9th graders at Jefferson High?"
- **Informal:** "What's the avg GPA for freshmen at Jefferson?"
- **Abbreviated:** "9th grade GPA at Jefferson High?"
- **Typo-prone:** "Whats the avg gpa for 9th graders at jefferson hiogh?"
- **Context-rich:** "I'm preparing for the board meeting — need 9th grade GPA at Jefferson High for 2023-2024"
Implementation: Use a small LLM (Qwen2.5-1.5B) to rephrase each template's question while keeping the SQL identical.
#### B. Question Decomposition
Train on multi-part questions:
- Q: "Compare chronic absenteeism rates and average GPA between Lincoln Elementary and Jefferson High"
- SQL: Two CTEs or UNION ALL
#### C. Ambiguous Questions
Train the model to ask clarifying questions or make reasonable assumptions:
- Q: "How are our students doing?"
- SQL: SELECT school_name, AVG(gpa) ... (with a reasonable default)
#### D. Error Recovery
Train on edge cases:
- Questions referencing non-existent columns → model should generate closest valid query
- Questions about data that doesn't exist → model should return empty result gracefully
### 2.3 Seed Data Expansion
Current: 2,900 students, 5 schools, 4 years
Expand to:
- **10,000 students** across 8 schools
- **6 school years** (2019-2025)
- **Realistic distributions:**
- Chronic absenteeism: 15% (current) — keep
- GPA distribution: normal around 2.8, std 0.8
- Discipline: 8% of students with 1+ incident
- ELL: 18%, SpEd: 12%, FRL: 45%
- Assessment proficiency: 55% at/above standard
### 2.4 Quality Assurance Pipeline
1. **SQL Validation:** Run every generated SQL against seed data — must return results (or empty for legitimate queries)
2. **Schema Match:** Every column/table referenced must exist in schema
3. **Dedup:** Exact-match dedup on questions, near-match dedup on SQL structure
4. **Balance Check:** Ensure even coverage across all tables and query patterns
5. **Human Review:** Sample 5% of pairs for manual review
---
## Phase 3: Training Improvements
### 3.1 Data Quality
| Current | Target |
|---|---|
| 1,289 pairs | 10,000+ pairs |
| 2 tables | 8 tables |
| 32 templates | 150+ templates |
| Template-only questions | Template + LLM-rephrased + typo variants |
| No join queries | 20% multi-table joins |
| No ambiguous queries | 5% ambiguous/clarification-needed |
### 3.2 Training Config Improvements
| Param | Current | Proposed | Why |
|---|---|---|---|
| Epochs | 3 | 2 | More data needs fewer epochs to avoid overfitting |
| Learning rate | 2e-4 | 1e-4 | More data = can use lower LR for better convergence |
| LoRA rank | 16 | 32 | More data supports higher rank without overfitting |
| Max seq length | 2048 | 4096 | Multi-table joins need longer sequences |
| Batch size | 4×4=16 | 4×8=32 | Larger effective batch for larger dataset |
### 3.3 Evaluation Metrics
Add eval set (10% holdout):
- **Exact match:** Generated SQL matches expected SQL
- **Execution match:** Generated SQL returns same results as expected
- **Schema validity:** All referenced columns/tables exist
- **Safety:** No DDL/DML statements generated
---
## Phase 4: Implementation Order
| Step | Task | Effort | Priority |
|---|---|---|---|
| 1 | Define new table schemas (above) | 1 hour | P0 |
| 2 | Generate seed data for 6 new tables | 2 hours | P0 |
| 3 | Add new templates for grades + discipline (60 templates) | 3 hours | P0 |
| 4 | Run synthetic generation → 5,000+ pairs | 30 min | P0 |
| 5 | SQL validation pass (run all pairs against seed data) | 1 hour | P0 |
| 6 | Add demographic + assessment templates (50 templates) | 2 hours | P1 |
| 7 | LLM rephrasing augmentation (3x multiplier) | 2 hours | P1 |
| 8 | Add cross-table join templates (20 templates) | 1 hour | P1 |
| 9 | Re-run generation → 10,000+ pairs | 30 min | P1 |
| 10 | Train v2 model with expanded data | 2-3 hours | P1 |
| 11 | Eval v1 vs v2 on holdout set | 1 hour | P2 |
| 12 | Deploy v2 to HF Space | 30 min | P2 |
**Total estimated effort:** ~15-18 hours of work
---
## Phase 5: Quick Wins (Do First)
### 5.1 Expand Seed Data (immediate)
Write a `generate_seed_v2.py` that creates all 6 new tables with realistic distributions. This unblocks everything else.
### 5.2 Port local-data-stack Patterns
The local-data-stack already has analytics models for:
- Chronic absenteeism risk scoring
- Wellbeing composite scores
- Class effectiveness ratings
- Equity outcome comparisons
Port these SQL patterns into training templates. The queries are already validated — just need NL phrasings.
### 5.3 Add Join Templates
The biggest gap in current training is zero join queries. Even 20 join templates would dramatically improve the model's ability to answer cross-domain questions.
---
## Appendix: local-data-stack Column Reference
### chronic_absenteeism_risk
student_key, grade_level, school_id, gender, race_ethnicity, english_learner, special_education, economically_disadvantaged, homeless_flag, attendance_rate_30d, unexcused_absence_rate_30d, discipline_incidents_30d, absence_discipline_correlation_score, attendance_rate_90d, attendance_trend_90d, chronic_absence_flag, chronic_absenteeism_risk_score, risk_level
### wellbeing_risk_profiles
student_key, grade_level, school_id, attendance_risk_score, discipline_risk_score, academic_risk_score, high_risk_domain_count, wellbeing_risk_score, wellbeing_risk_level, primary_concern
### class_effectiveness
course_id, school_id, grade_level, enrollment_count, avg_grade_numeric, pct_passed, pct_a_b_grades, course_avg_grade, grade_diff_from_course_avg, pct_passed_ell, pct_passed_sped, pct_passed_frl, pass_rate_rank, grade_rank, effectiveness_rating, term
### equity_outcomes_by_demographics
race_ethnicity, english_learner, special_education, economically_disadvantaged, cohort_size, pct_good_attendance, pct_no_discipline, avg_gpa, pct_gpa_2_5_plus, pct_below_c