# File: simple_finetune.py -script inti untuk proses fine-tuning, yang dijalankan oleh Celery Worker. import os import json import pandas as pd from sqlalchemy import create_engine import torch from datasets import Dataset from transformers import ( AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, TrainingArguments, Trainer ) from peft import LoraConfig, get_peft_model # --- 1. Konfigurasi --- HF_TOKEN = os.getenv("HF_TOKEN") DATABASE_URL = os.getenv("DATABASE_URL") BASE_MODEL_ID = "SeaLLMs/SeaLLM-7B-v2.5" NEW_TUNED_MODEL_ID = f"nama-anda/lessonplan-assistant-finetuned-v1" # Ganti "nama-anda" # --- 2. Memuat Data dari Database --- def create_lessonplan_dataset_from_db(): print("Menghubungkan ke database untuk mengambil data RPP...") engine = create_engine(DATABASE_URL) # Ambil data yang belum pernah digunakan untuk training df = pd.read_sql("SELECT * FROM approved_lesson_plans WHERE is_used_for_training = FALSE", engine) if df.empty: print("Tidak ada data RPP baru untuk training.") return None instructions = [] for _, row in df.iterrows(): rpp_data = json.loads(row['full_json_data']) prompt = f"Buatkan Rencana Pelaksanaan Pembelajaran (RPP) untuk mata pelajaran {rpp_data.get('lp_subject', '')} dengan topik '{rpp_data.get('lp_topic', '')}'." response = json.dumps(rpp_data, indent=2, ensure_ascii=False) instructions.append({"prompt": prompt, "response": response}) print(f"Berhasil memuat {len(instructions)} data RPP baru.") return Dataset.from_pandas(pd.DataFrame(instructions)) # --- 3. Proses Fine-Tuning --- def main(): dataset = create_lessonplan_dataset_from_db() if dataset is None: return # ... (Sisa kode sama seperti `simple_finetune.py` sebelumnya) ... # (Memuat model, tokenizer, format data, training, push to hub) # Pastikan setelah push_to_hub berhasil, Anda mengupdate kolom is_used_for_training menjadi TRUE di database. if __name__ == "__main__": main()