Spaces:
Sleeping
Sleeping
Upload 47 files
Browse files- .gitattributes +39 -0
- Dockerfile +42 -0
- app.py +211 -0
- core/rag_services.py +131 -0
- docker-compose.yml +65 -0
- knowledge_base/2118-Article Text-14396-1-10-20230413.pdf +3 -0
- knowledge_base/2233-Article Text-12596-1-10-20240723.pdf +3 -0
- knowledge_base/259034-differentiated-instruction-solusi-pembel-7b868815.pdf +3 -0
- knowledge_base/266-Article Text-1333-1-10-20220811.pdf +3 -0
- knowledge_base/276698-memahami-gaya-belajar-untuk-meningkatkan-7924c83a.pdf +3 -0
- knowledge_base/309-Article Text-1228-1-10-20230402.pdf +3 -0
- knowledge_base/442-Article Text-1341-1-10-20220711.pdf +3 -0
- knowledge_base/587955-analisis-teoritis-tujuan-pembelajaran-be-3194189b.pdf +3 -0
- knowledge_base/5881-29852-1-PB.pdf +3 -0
- knowledge_base/8736-25824-1-PB.pdf +3 -0
- knowledge_base/897-Article Text-4084-2-10-20240911.pdf +3 -0
- knowledge_base/Analisis Gaya Belajar Peserta Didik dalam Pembelajaran di Kelas.pdf +3 -0
- knowledge_base/Artikel+9.pdf +3 -0
- knowledge_base/BAB II 24 SEPTEMBER FIX.pdf +3 -0
- knowledge_base/Buku Multiple Intellegence Dalam Pembelajaran-compressed-compressed.pdf +3 -0
- knowledge_base/Buku-Digital---MANAJEMEN-KELAS.pdf +3 -0
- knowledge_base/Buku-Model-Pengembangan-Pembelajaran-Berdiferensiasi-SMPN-20-Tangsel-_5-Maretisbn.pdf +3 -0
- knowledge_base/IDENTIFIKASI GAYA BELAJAR.pdf +3 -0
- knowledge_base/IIS-NURHAYATI_2217119_LANDASAN-FILOSOFIS.pdf +3 -0
- knowledge_base/IMPLEMENTASITAKSONOMIBLOOMRANAHKOGNITIFnew.pdf +3 -0
- knowledge_base/Konsep Gaya Belajar dan Implementasinya.pdf +3 -0
- knowledge_base/Lencana+Vol+3+no+1+Januari+2025+hal+227-246.pdf +3 -0
- knowledge_base/MANAJEMEN-KELAS.pdf +3 -0
- knowledge_base/Manajemen Kelas Afriza.pdf +3 -0
- knowledge_base/PRINSIP PENGEMBANGAN PEMBELAJARAN BERDEFERENSIASI.pdf +3 -0
- knowledge_base/PSIKOLOGI PERKEMBANGAN PESERTA DIDIK.pdf +3 -0
- knowledge_base/PSIKOLOGI PERKEMBANGAN.pdf +3 -0
- knowledge_base/Pendekatan Differentiated Instruction.docx +0 -0
- knowledge_base/Penerapan_Model_Pembelajaran_Diferensiasi_Differen.pdf +3 -0
- knowledge_base/Pengertian-Multiple-Intelligences.pdf +3 -0
- knowledge_base/Perkembangan Peserta Didik.pdf +3 -0
- knowledge_base/Problematika+Manajemen+Kelas-AI.pdf +3 -0
- knowledge_base/admin_jurnal,+3+Jurnal+Ahmad+Teguh+Purnawanto_removed.pdf +3 -0
- knowledge_base/administrator,+106-534-1-PB.pdf +3 -0
- knowledge_base/adminjip1,+23115-Article+Text-78714-1-4-20230501.pdf +3 -0
- knowledge_base/adminopenjurnal,+publish+ke-3.doc.pdf +3 -0
- knowledge_base/humanika,+4-+J-HUMANIKA+VOL+21+N0+2+2021.pdf +3 -0
- knowledge_base/humanika,+MENGGALI+KEMAMPUAN+Sunartini+-+5.pdf +3 -0
- knowledge_base/nur-hidayah-buku-Psikologi-Pendidikan-cover.pdf +3 -0
- knowledge_base/skripsi bab 2 Desi Nur Safitri.pdf +3 -0
- requirements.txt +35 -0
- simple_finetune.py +56 -0
- tasks.py +37 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,42 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
knowledge_base/2118-Article[[:space:]]Text-14396-1-10-20230413.pdf filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
knowledge_base/2233-Article[[:space:]]Text-12596-1-10-20240723.pdf filter=lfs diff=lfs merge=lfs -text
|
| 38 |
+
knowledge_base/259034-differentiated-instruction-solusi-pembel-7b868815.pdf filter=lfs diff=lfs merge=lfs -text
|
| 39 |
+
knowledge_base/266-Article[[:space:]]Text-1333-1-10-20220811.pdf filter=lfs diff=lfs merge=lfs -text
|
| 40 |
+
knowledge_base/276698-memahami-gaya-belajar-untuk-meningkatkan-7924c83a.pdf filter=lfs diff=lfs merge=lfs -text
|
| 41 |
+
knowledge_base/309-Article[[:space:]]Text-1228-1-10-20230402.pdf filter=lfs diff=lfs merge=lfs -text
|
| 42 |
+
knowledge_base/442-Article[[:space:]]Text-1341-1-10-20220711.pdf filter=lfs diff=lfs merge=lfs -text
|
| 43 |
+
knowledge_base/587955-analisis-teoritis-tujuan-pembelajaran-be-3194189b.pdf filter=lfs diff=lfs merge=lfs -text
|
| 44 |
+
knowledge_base/5881-29852-1-PB.pdf filter=lfs diff=lfs merge=lfs -text
|
| 45 |
+
knowledge_base/8736-25824-1-PB.pdf filter=lfs diff=lfs merge=lfs -text
|
| 46 |
+
knowledge_base/897-Article[[:space:]]Text-4084-2-10-20240911.pdf filter=lfs diff=lfs merge=lfs -text
|
| 47 |
+
knowledge_base/admin_jurnal,+3+Jurnal+Ahmad+Teguh+Purnawanto_removed.pdf filter=lfs diff=lfs merge=lfs -text
|
| 48 |
+
knowledge_base/administrator,+106-534-1-PB.pdf filter=lfs diff=lfs merge=lfs -text
|
| 49 |
+
knowledge_base/adminjip1,+23115-Article+Text-78714-1-4-20230501.pdf filter=lfs diff=lfs merge=lfs -text
|
| 50 |
+
knowledge_base/adminopenjurnal,+publish+ke-3.doc.pdf filter=lfs diff=lfs merge=lfs -text
|
| 51 |
+
knowledge_base/Analisis[[:space:]]Gaya[[:space:]]Belajar[[:space:]]Peserta[[:space:]]Didik[[:space:]]dalam[[:space:]]Pembelajaran[[:space:]]di[[:space:]]Kelas.pdf filter=lfs diff=lfs merge=lfs -text
|
| 52 |
+
knowledge_base/Artikel+9.pdf filter=lfs diff=lfs merge=lfs -text
|
| 53 |
+
knowledge_base/BAB[[:space:]]II[[:space:]]24[[:space:]]SEPTEMBER[[:space:]]FIX.pdf filter=lfs diff=lfs merge=lfs -text
|
| 54 |
+
knowledge_base/Buku[[:space:]]Multiple[[:space:]]Intellegence[[:space:]]Dalam[[:space:]]Pembelajaran-compressed-compressed.pdf filter=lfs diff=lfs merge=lfs -text
|
| 55 |
+
knowledge_base/Buku-Digital---MANAJEMEN-KELAS.pdf filter=lfs diff=lfs merge=lfs -text
|
| 56 |
+
knowledge_base/Buku-Model-Pengembangan-Pembelajaran-Berdiferensiasi-SMPN-20-Tangsel-_5-Maretisbn.pdf filter=lfs diff=lfs merge=lfs -text
|
| 57 |
+
knowledge_base/humanika,+4-+J-HUMANIKA+VOL+21+N0+2+2021.pdf filter=lfs diff=lfs merge=lfs -text
|
| 58 |
+
knowledge_base/humanika,+MENGGALI+KEMAMPUAN+Sunartini+-+5.pdf filter=lfs diff=lfs merge=lfs -text
|
| 59 |
+
knowledge_base/IDENTIFIKASI[[:space:]]GAYA[[:space:]]BELAJAR.pdf filter=lfs diff=lfs merge=lfs -text
|
| 60 |
+
knowledge_base/IIS-NURHAYATI_2217119_LANDASAN-FILOSOFIS.pdf filter=lfs diff=lfs merge=lfs -text
|
| 61 |
+
knowledge_base/IMPLEMENTASITAKSONOMIBLOOMRANAHKOGNITIFnew.pdf filter=lfs diff=lfs merge=lfs -text
|
| 62 |
+
knowledge_base/Konsep[[:space:]]Gaya[[:space:]]Belajar[[:space:]]dan[[:space:]]Implementasinya.pdf filter=lfs diff=lfs merge=lfs -text
|
| 63 |
+
knowledge_base/Lencana+Vol+3+no+1+Januari+2025+hal+227-246.pdf filter=lfs diff=lfs merge=lfs -text
|
| 64 |
+
knowledge_base/Manajemen[[:space:]]Kelas[[:space:]]Afriza.pdf filter=lfs diff=lfs merge=lfs -text
|
| 65 |
+
knowledge_base/MANAJEMEN-KELAS.pdf filter=lfs diff=lfs merge=lfs -text
|
| 66 |
+
knowledge_base/nur-hidayah-buku-Psikologi-Pendidikan-cover.pdf filter=lfs diff=lfs merge=lfs -text
|
| 67 |
+
knowledge_base/Penerapan_Model_Pembelajaran_Diferensiasi_Differen.pdf filter=lfs diff=lfs merge=lfs -text
|
| 68 |
+
knowledge_base/Pengertian-Multiple-Intelligences.pdf filter=lfs diff=lfs merge=lfs -text
|
| 69 |
+
knowledge_base/Perkembangan[[:space:]]Peserta[[:space:]]Didik.pdf filter=lfs diff=lfs merge=lfs -text
|
| 70 |
+
knowledge_base/PRINSIP[[:space:]]PENGEMBANGAN[[:space:]]PEMBELAJARAN[[:space:]]BERDEFERENSIASI.pdf filter=lfs diff=lfs merge=lfs -text
|
| 71 |
+
knowledge_base/Problematika+Manajemen+Kelas-AI.pdf filter=lfs diff=lfs merge=lfs -text
|
| 72 |
+
knowledge_base/PSIKOLOGI[[:space:]]PERKEMBANGAN[[:space:]]PESERTA[[:space:]]DIDIK.pdf filter=lfs diff=lfs merge=lfs -text
|
| 73 |
+
knowledge_base/PSIKOLOGI[[:space:]]PERKEMBANGAN.pdf filter=lfs diff=lfs merge=lfs -text
|
| 74 |
+
knowledge_base/skripsi[[:space:]]bab[[:space:]]2[[:space:]]Desi[[:space:]]Nur[[:space:]]Safitri.pdf filter=lfs diff=lfs merge=lfs -text
|
Dockerfile
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# File: Dockerfile (KODE FINAL DAN LENGKAP)
|
| 2 |
+
|
| 3 |
+
# --- Base Stage (Membangun lingkungan dasar) ---
|
| 4 |
+
FROM python:3.10-slim AS base
|
| 5 |
+
ENV PYTHONDONTWRITEBYTECODE 1
|
| 6 |
+
ENV PYTHONUNBUFFERED 1
|
| 7 |
+
ENV HOME=/app
|
| 8 |
+
WORKDIR /app
|
| 9 |
+
COPY requirements.txt .
|
| 10 |
+
|
| 11 |
+
# --- PENTING: Perbaikan untuk ImportError: libGL.so.1 dan libgthread-2.0.so.0 ---
|
| 12 |
+
# Menginstal library grafis (libgl1) DAN GLib (libglib2.0-0)
|
| 13 |
+
RUN apt-get update && apt-get install -y \
|
| 14 |
+
libgl1 \
|
| 15 |
+
libglib2.0-0 \
|
| 16 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 17 |
+
# --------------------------------------------------------------------------------
|
| 18 |
+
|
| 19 |
+
# --- Konfigurasi User (Mencegah Permission Errors) ---
|
| 20 |
+
RUN adduser --disabled-password --no-create-home appuser
|
| 21 |
+
RUN chown -R appuser:appuser /app
|
| 22 |
+
|
| 23 |
+
# --- Builder Stage (Membuat wheel dependensi) ---
|
| 24 |
+
FROM base AS builder
|
| 25 |
+
RUN pip install --no-cache-dir --upgrade pip
|
| 26 |
+
RUN pip wheel --no-cache-dir --wheel-dir /app/wheels -r requirements.txt
|
| 27 |
+
|
| 28 |
+
# --- Final Stage (Lingkungan Runtime) ---
|
| 29 |
+
FROM base AS final
|
| 30 |
+
COPY --from=builder /app/wheels /app/wheels
|
| 31 |
+
|
| 32 |
+
# Instalasi Python Wheels
|
| 33 |
+
RUN pip install --no-cache-dir /app/wheels/*
|
| 34 |
+
|
| 35 |
+
# Menyalin kode aplikasi
|
| 36 |
+
COPY . .
|
| 37 |
+
|
| 38 |
+
# Mengalihkan ke user non-root
|
| 39 |
+
USER appuser
|
| 40 |
+
|
| 41 |
+
# Perintah menjalankan aplikasi
|
| 42 |
+
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
|
app.py
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# File: app.py (VERSI KOREKSI FINAL DAN LENGKAP)
|
| 2 |
+
|
| 3 |
+
import os
|
| 4 |
+
from fastapi import FastAPI, Depends, HTTPException
|
| 5 |
+
from pydantic import BaseModel, Field
|
| 6 |
+
from typing import List, Optional
|
| 7 |
+
from contextlib import asynccontextmanager
|
| 8 |
+
|
| 9 |
+
# --- Database Imports ---
|
| 10 |
+
from sqlalchemy.orm import sessionmaker, Session
|
| 11 |
+
from sqlalchemy import create_engine
|
| 12 |
+
from sqlalchemy.orm import declarative_base
|
| 13 |
+
from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime
|
| 14 |
+
from sqlalchemy.sql import func
|
| 15 |
+
|
| 16 |
+
# --- LangChain & Hugging Face Imports ---
|
| 17 |
+
from langchain_huggingface import HuggingFaceEndpoint, HuggingFaceEmbeddings
|
| 18 |
+
from huggingface_hub import login
|
| 19 |
+
|
| 20 |
+
# --- Impor Layanan RAG ---
|
| 21 |
+
from core.rag_services import create_vector_store, load_vector_store, get_rag_chain
|
| 22 |
+
|
| 23 |
+
# --- Impor Tugas Latar Belakang ---
|
| 24 |
+
from tasks import start_lessonplan_finetune_task
|
| 25 |
+
|
| 26 |
+
# ==============================================================================
|
| 27 |
+
# 1. KONFIGURASI APLIKASI & DATABASE
|
| 28 |
+
# ==============================================================================
|
| 29 |
+
|
| 30 |
+
# --- Load Environment Variables ---
|
| 31 |
+
DATABASE_URL = os.getenv("DATABASE_URL")
|
| 32 |
+
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 33 |
+
BASE_MODEL_REPO_ID = "SeaLLMs/SeaLLM-7B-v2.5"
|
| 34 |
+
TUNED_LESSONPLAN_MODEL_ID = os.getenv("TUNED_LESSONPLAN_MODEL_ID", BASE_MODEL_REPO_ID)
|
| 35 |
+
|
| 36 |
+
if not DATABASE_URL or not HF_TOKEN:
|
| 37 |
+
raise ValueError("DATABASE_URL and HF_TOKEN environment variables must be set!")
|
| 38 |
+
|
| 39 |
+
# --- Database Engine & Base (Deklarasi global, inisialisasi di lifespan) ---
|
| 40 |
+
Base = declarative_base()
|
| 41 |
+
engine = None
|
| 42 |
+
SessionLocal = None
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
# ==============================================================================
|
| 46 |
+
# 2. LIFESPAN EVENT HANDLER (FUNGSI STARTUP & SHUTDOWN)
|
| 47 |
+
# ==============================================================================
|
| 48 |
+
|
| 49 |
+
@asynccontextmanager
|
| 50 |
+
async def lifespan(app: FastAPI):
|
| 51 |
+
"""
|
| 52 |
+
Menangani semua proses yang harus terjadi saat aplikasi pertama kali menyala.
|
| 53 |
+
"""
|
| 54 |
+
global engine, SessionLocal
|
| 55 |
+
|
| 56 |
+
print("--- Memulai Proses Startup Aplikasi ---")
|
| 57 |
+
|
| 58 |
+
# --- INISIALISASI DATABASE ---
|
| 59 |
+
print("0/5: Menginisialisasi koneksi database...")
|
| 60 |
+
engine = create_engine(DATABASE_URL)
|
| 61 |
+
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
| 62 |
+
print("Koneksi database siap.")
|
| 63 |
+
|
| 64 |
+
# Langkah 1: Login ke Hugging Face
|
| 65 |
+
print("1/5: Melakukan login ke Hugging Face Hub...")
|
| 66 |
+
os.environ["HUGGINGFACEHUB_API_TOKEN"] = HF_TOKEN
|
| 67 |
+
print("Login berhasil.")
|
| 68 |
+
|
| 69 |
+
# Langkah 2: Memuat Embedding Model untuk RAG
|
| 70 |
+
print("2/5: Memuat Embedding Model (sentence-transformers/all-MiniLM-L6-v2)...")
|
| 71 |
+
embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
|
| 72 |
+
app.state.embedding_model = embedding_model
|
| 73 |
+
print("Embedding Model berhasil dimuat.")
|
| 74 |
+
|
| 75 |
+
# Langkah 3: Memuat atau Membuat Vector Store untuk RAG
|
| 76 |
+
print("3/5: Menginisialisasi RAG Knowledge Base...")
|
| 77 |
+
vector_store = load_vector_store(embedding_model)
|
| 78 |
+
if vector_store is None:
|
| 79 |
+
print("Vector store tidak ditemukan, membuat yang baru...")
|
| 80 |
+
vector_store = create_vector_store(embedding_model)
|
| 81 |
+
print("RAG Knowledge Base siap.")
|
| 82 |
+
|
| 83 |
+
# Langkah 4: Memuat LLM Utama
|
| 84 |
+
print(f"4/5: Memuat LLM Utama dari repo: {TUNED_LESSONPLAN_MODEL_ID}...")
|
| 85 |
+
llm = HuggingFaceEndpoint(
|
| 86 |
+
repo_id=TUNED_LESSONPLAN_MODEL_ID,
|
| 87 |
+
huggingfacehub_api_token=HF_TOKEN,
|
| 88 |
+
temperature=0.7,
|
| 89 |
+
max_new_tokens=1024,
|
| 90 |
+
repetition_penalty=1.1
|
| 91 |
+
)
|
| 92 |
+
app.state.llm = llm
|
| 93 |
+
print("LLM Utama berhasil dimuat.")
|
| 94 |
+
|
| 95 |
+
# Langkah 5: Membuat RAG Chain dan Menghubungkan ke Database
|
| 96 |
+
print("5/5: Membuat RAG Chain dan menghubungkan ke database...")
|
| 97 |
+
app.state.rag_chain = get_rag_chain(llm, vector_store)
|
| 98 |
+
Base.metadata.create_all(bind=engine)
|
| 99 |
+
print("Database siap dan RAG Chain berhasil dibuat.")
|
| 100 |
+
|
| 101 |
+
print("--- Startup Selesai. Aplikasi Siap Menerima Permintaan. ---")
|
| 102 |
+
|
| 103 |
+
yield # Aplikasi berjalan di sini
|
| 104 |
+
|
| 105 |
+
print("--- Aplikasi Dimatikan ---")
|
| 106 |
+
|
| 107 |
+
|
| 108 |
+
# --- Inisialisasi Aplikasi FastAPI ---
|
| 109 |
+
app = FastAPI(
|
| 110 |
+
title="Lesson Plan Assistant API",
|
| 111 |
+
description="API untuk membantu guru membuat Rencana Pelaksanaan Pembelajaran (RPP) melalui dialog diagnostik.",
|
| 112 |
+
lifespan=lifespan
|
| 113 |
+
)
|
| 114 |
+
|
| 115 |
+
# ==============================================================================
|
| 116 |
+
# 3. MODEL DATABASE & DEPENDENCY
|
| 117 |
+
# ==============================================================================
|
| 118 |
+
class ApprovedLessonPlanDB(Base):
|
| 119 |
+
__tablename__ = "approved_lesson_plans"
|
| 120 |
+
id = Column(Integer, primary_key=True, index=True)
|
| 121 |
+
subject = Column(String(255), index=True)
|
| 122 |
+
grade_semester = Column(String(255), index=True)
|
| 123 |
+
topic = Column(String(500))
|
| 124 |
+
learning_outcomes = Column(Text)
|
| 125 |
+
full_json_data = Column(Text)
|
| 126 |
+
submitted_by_user_id = Column(Integer)
|
| 127 |
+
is_used_for_training = Column(Boolean, default=False)
|
| 128 |
+
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
| 129 |
+
|
| 130 |
+
def get_db():
|
| 131 |
+
db = SessionLocal()
|
| 132 |
+
try:
|
| 133 |
+
yield db
|
| 134 |
+
finally:
|
| 135 |
+
db.close()
|
| 136 |
+
|
| 137 |
+
# ==============================================================================
|
| 138 |
+
# 4. MODEL PYDANTIC (Request & Response)
|
| 139 |
+
# ==============================================================================
|
| 140 |
+
class UserInfo(BaseModel):
|
| 141 |
+
id: int
|
| 142 |
+
greeting: str
|
| 143 |
+
|
| 144 |
+
class ChatMessage(BaseModel):
|
| 145 |
+
role: str
|
| 146 |
+
content: str
|
| 147 |
+
|
| 148 |
+
class ChatInput(BaseModel):
|
| 149 |
+
conversation_id: str
|
| 150 |
+
user_info: UserInfo
|
| 151 |
+
prompt: str
|
| 152 |
+
chat_history: List[ChatMessage]
|
| 153 |
+
attachment_url: Optional[str] = None
|
| 154 |
+
|
| 155 |
+
class LessonPlanOutput(BaseModel):
|
| 156 |
+
lp_subject: str
|
| 157 |
+
lp_grade_semester: str
|
| 158 |
+
lp_topic: str
|
| 159 |
+
lp_learning_outcomes: str
|
| 160 |
+
|
| 161 |
+
# ==============================================================================
|
| 162 |
+
# 5. ENDPOINTS API
|
| 163 |
+
# ==============================================================================
|
| 164 |
+
@app.post("/chat/")
|
| 165 |
+
async def chat(request: ChatInput):
|
| 166 |
+
"""
|
| 167 |
+
Endpoint utama untuk dialog dengan AI.
|
| 168 |
+
"""
|
| 169 |
+
rag_chain = request.app.state.rag_chain
|
| 170 |
+
if not rag_chain:
|
| 171 |
+
raise HTTPException(
|
| 172 |
+
status_code=503,
|
| 173 |
+
detail="Layanan Asisten AI tidak siap. Harap coba lagi sesaat."
|
| 174 |
+
)
|
| 175 |
+
|
| 176 |
+
try:
|
| 177 |
+
input_data = {
|
| 178 |
+
"question": request.prompt,
|
| 179 |
+
"chat_history": [msg.model_dump() for msg in request.chat_history]
|
| 180 |
+
}
|
| 181 |
+
ai_response = rag_chain.invoke(input_data)
|
| 182 |
+
return {"reply": ai_response.get("answer", "Maaf, terjadi kesalahan dalam menghasilkan respons.")}
|
| 183 |
+
|
| 184 |
+
except Exception as e:
|
| 185 |
+
print(f"Error during RAG chain invocation: {e}")
|
| 186 |
+
raise HTTPException(status_code=500, detail="Terjadi kesalahan saat memproses permintaan Anda.")
|
| 187 |
+
|
| 188 |
+
|
| 189 |
+
@app.post("/admin/save-approved-plan/")
|
| 190 |
+
async def save_approved_plan(plan: LessonPlanOutput, user_info: UserInfo, db: Session = Depends(get_db)):
|
| 191 |
+
try:
|
| 192 |
+
new_plan = ApprovedLessonPlanDB(
|
| 193 |
+
subject=plan.lp_subject,
|
| 194 |
+
grade_semester=plan.lp_grade_semester,
|
| 195 |
+
topic=plan.lp_topic,
|
| 196 |
+
learning_outcomes=plan.lp_learning_outcomes,
|
| 197 |
+
full_json_data=plan.model_dump_json(),
|
| 198 |
+
submitted_by_user_id=user_info.id
|
| 199 |
+
)
|
| 200 |
+
db.add(new_plan)
|
| 201 |
+
db.commit()
|
| 202 |
+
db.refresh(new_plan)
|
| 203 |
+
return {"message": "RPP yang disetujui berhasil disimpan untuk training.", "plan_id": new_plan.id}
|
| 204 |
+
except Exception as e:
|
| 205 |
+
db.rollback()
|
| 206 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 207 |
+
|
| 208 |
+
@app.post("/admin/start-finetune", status_code=202)
|
| 209 |
+
async def trigger_fine_tuning():
|
| 210 |
+
task = start_lessonplan_finetune_task.delay()
|
| 211 |
+
return {"message": "Proses fine-tuning Lesson Plan Assistant telah dimulai.", "task_id": task.id}
|
core/rag_services.py
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# File: core/rag_services.py (FILE BARU)
|
| 2 |
+
|
| 3 |
+
import os
|
| 4 |
+
from langchain_community.vectorstores import FAISS
|
| 5 |
+
from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader, Docx2txtLoader
|
| 6 |
+
# --- TAMBAH BARIS INI ---
|
| 7 |
+
from langchain_community.document_loaders import UnstructuredFileLoader
|
| 8 |
+
# -------------------------
|
| 9 |
+
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
| 10 |
+
from langchain_core.prompts import ChatPromptTemplate
|
| 11 |
+
from langchain_core.runnables import RunnablePassthrough
|
| 12 |
+
from langchain_core.output_parsers import StrOutputParser
|
| 13 |
+
|
| 14 |
+
# --- Konfigurasi Path ---
|
| 15 |
+
KNOWLEDGE_BASE_DIR = "knowledge_base"
|
| 16 |
+
FAISS_INDEX_PATH = "faiss_index"
|
| 17 |
+
|
| 18 |
+
def create_vector_store(embedding_model):
|
| 19 |
+
"""
|
| 20 |
+
Membangun Vector Store dari dokumen di direktori knowledge_base.
|
| 21 |
+
Hanya dijalankan jika index FAISS belum ada.
|
| 22 |
+
"""
|
| 23 |
+
print(f"Membangun Vector Store dari direktori: {KNOWLEDGE_BASE_DIR}")
|
| 24 |
+
|
| 25 |
+
# Loader untuk berbagai jenis file
|
| 26 |
+
loader = DirectoryLoader(
|
| 27 |
+
'knowledge_base',
|
| 28 |
+
glob="**/*",
|
| 29 |
+
loader_cls=UnstructuredFileLoader, # Menggantikan loader_map
|
| 30 |
+
show_progress=True,
|
| 31 |
+
recursive=True
|
| 32 |
+
)
|
| 33 |
+
|
| 34 |
+
documents = loader.load()
|
| 35 |
+
if not documents:
|
| 36 |
+
print("Peringatan: Tidak ada dokumen yang ditemukan di `knowledge_base`. Kemampuan RAG akan terbatas.")
|
| 37 |
+
return None
|
| 38 |
+
|
| 39 |
+
# Memecah dokumen menjadi bagian-bagian kecil (chunks)
|
| 40 |
+
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
|
| 41 |
+
docs = text_splitter.split_documents(documents)
|
| 42 |
+
|
| 43 |
+
# Membuat index FAISS dari dokumen dan model embedding
|
| 44 |
+
print(f"Membuat index FAISS dari {len(docs)} potongan dokumen...")
|
| 45 |
+
db = FAISS.from_documents(docs, embedding_model)
|
| 46 |
+
db.save_local(FAISS_INDEX_PATH)
|
| 47 |
+
print(f"Vector Store berhasil dibuat dan disimpan di: {FAISS_INDEX_PATH}")
|
| 48 |
+
return db
|
| 49 |
+
|
| 50 |
+
def load_vector_store(embedding_model):
|
| 51 |
+
"""
|
| 52 |
+
Memuat Vector Store yang sudah ada dari disk.
|
| 53 |
+
"""
|
| 54 |
+
if os.path.exists(FAISS_INDEX_PATH):
|
| 55 |
+
print(f"Memuat Vector Store dari: {FAISS_INDEX_PATH}")
|
| 56 |
+
db = FAISS.load_local(FAISS_INDEX_PATH, embedding_model, allow_dangerous_deserialization=True)
|
| 57 |
+
return db
|
| 58 |
+
return None
|
| 59 |
+
|
| 60 |
+
def get_rag_chain(llm, vector_store):
|
| 61 |
+
"""
|
| 62 |
+
Membuat RAG Chain yang akan digunakan untuk chat.
|
| 63 |
+
Chain ini menggabungkan pencarian konteks dengan LLM.
|
| 64 |
+
"""
|
| 65 |
+
if not vector_store:
|
| 66 |
+
raise ValueError("Vector Store tidak tersedia untuk membuat RAG chain.")
|
| 67 |
+
|
| 68 |
+
retriever = vector_store.as_retriever(search_type="similarity", search_kwargs={"k": 5}) # Ambil lebih banyak konteks
|
| 69 |
+
|
| 70 |
+
# --- [REVISI UTAMA] OTAK BARU UNTUK AGEN 'MEGURI' ---
|
| 71 |
+
# Prompt ini telah diperbarui untuk diagnosa multi-dimensi.
|
| 72 |
+
template = """
|
| 73 |
+
Anda adalah Meguri, seorang Asisten Desain Instruksional AI yang ahli, empatik, dan sangat peduli pada konteks kelas.
|
| 74 |
+
Tugas utama Anda adalah memandu guru merancang Rencana Pelaksanaan Pembelajaran (RPP) yang efektif, personal, dan relevan dengan kondisi nyata di lapangan.
|
| 75 |
+
|
| 76 |
+
PENTING: JANGAN langsung membuat RPP. Misi Anda adalah melakukan DIAGNOSA MENYELURUH melalui dialog yang santai namun mendalam. Gunakan 'Konteks' yang relevan di bawah ini untuk memandu pertanyaan Anda.
|
| 77 |
+
|
| 78 |
+
Anda harus menggali TIGA DIMENSI UTAMA sebelum merancang kegiatan pembelajaran:
|
| 79 |
+
|
| 80 |
+
1. DIMENSI KOGNITIF (Prerequisite Knowledge):
|
| 81 |
+
- Tanyakan topik yang akan diajarkan.
|
| 82 |
+
- Pahami level pemahaman siswa saat ini terkait topik tersebut.
|
| 83 |
+
- Contoh pertanyaan: "Untuk topik ini, materi apa yang sebelumnya sudah mereka pelajari?", "Apa miskonsepsi atau kesulitan paling umum yang Bapak/Ibu temui saat mengajarkan topik ini?"
|
| 84 |
+
|
| 85 |
+
2. DIMENSI SOSIAL-EMOSIONAL (Dinamika & Suasana Kelas):
|
| 86 |
+
- Pahami 'kepribadian' kelas secara umum.
|
| 87 |
+
- Contoh pertanyaan: "Bagaimana biasanya suasana di kelas Bapak/Ibu? Apakah siswanya cenderung aktif berdiskusi, lebih suka mendengarkan, atau mungkin kelasnya cukup ramai?", "Bagaimana interaksi antar siswa? Apakah mereka nyaman bekerja dalam kelompok?", "Adakah hal-hal khusus terkait perilaku siswa yang perlu kita antisipasi dalam rancangan kegiatan?"
|
| 88 |
+
|
| 89 |
+
3. DIMENSI GAYA BELAJAR & MINAT:
|
| 90 |
+
- Identifikasi preferensi belajar dan minat siswa.
|
| 91 |
+
- Contoh pertanyaan: "Dari pengamatan Bapak/Ibu, apakah siswa lebih antusias dengan media visual seperti video/gambar, atau lebih suka kegiatan praktik langsung?", "Adakah minat atau hobi yang sedang populer di kalangan siswa (misal: game, musik, film) yang mungkin bisa kita kaitkan dengan topik agar lebih menarik?"
|
| 92 |
+
|
| 93 |
+
Setelah Anda merasa cukup memahami ketiga dimensi tersebut berdasarkan dialog dengan guru, rangkum pemahaman Anda dan minta konfirmasi. Contoh: "Baik, jadi jika saya simpulkan, kita perlu RPP untuk topik X, untuk kelas yang cenderung pasif namun visual, di mana sebagian besar siswa sudah paham konsep dasar A tapi masih kesulitan dengan B. Apakah kesimpulan saya sudah tepat?"
|
| 94 |
+
|
| 95 |
+
Setelah guru mengkonfirmasi, barulah Anda menawarkan untuk membuat kerangka RPP yang secara spesifik menjawab semua kebutuhan tersebut.
|
| 96 |
+
|
| 97 |
+
Gunakan histori percakapan untuk menjaga konteks. Jika guru bertanya tentang strategi mengajar atau hal lain, jawablah menggunakan 'Konteks' yang tersedia.
|
| 98 |
+
|
| 99 |
+
Konteks:
|
| 100 |
+
{context}
|
| 101 |
+
|
| 102 |
+
Histori Percakapan:
|
| 103 |
+
{chat_history}
|
| 104 |
+
|
| 105 |
+
Pertanyaan Guru:
|
| 106 |
+
{question}
|
| 107 |
+
|
| 108 |
+
Jawaban Anda:
|
| 109 |
+
"""
|
| 110 |
+
prompt = ChatPromptTemplate.from_template(template)
|
| 111 |
+
|
| 112 |
+
def format_chat_history(chat_history: list[dict]) -> str:
|
| 113 |
+
"""Mengubah list dict histori chat menjadi format string."""
|
| 114 |
+
buffer = []
|
| 115 |
+
for message in chat_history:
|
| 116 |
+
role = "Guru" if message.get('role') == 'user' else 'Meguri'
|
| 117 |
+
buffer.append(f"{role}: {message.get('content')}")
|
| 118 |
+
return "\n".join(buffer)
|
| 119 |
+
|
| 120 |
+
rag_chain = (
|
| 121 |
+
{
|
| 122 |
+
"context": lambda x: retriever.invoke(x["question"]),
|
| 123 |
+
"question": lambda x: x["question"],
|
| 124 |
+
"chat_history": lambda x: format_chat_history(x["chat_history"]),
|
| 125 |
+
}
|
| 126 |
+
| prompt
|
| 127 |
+
| llm
|
| 128 |
+
| StrOutputParser()
|
| 129 |
+
)
|
| 130 |
+
|
| 131 |
+
return rag_chain
|
docker-compose.yml
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# File: docker-compose.yml (VERSI KOREKSI ENVIRONMENT)
|
| 2 |
+
|
| 3 |
+
services:
|
| 4 |
+
lessonplan_assistant_api:
|
| 5 |
+
build:
|
| 6 |
+
context: .
|
| 7 |
+
container_name: lessonplan_assistant_api
|
| 8 |
+
ports:
|
| 9 |
+
- "7860:7860"
|
| 10 |
+
volumes:
|
| 11 |
+
- .:/app
|
| 12 |
+
# --- Tambah Environment Variables ---
|
| 13 |
+
environment:
|
| 14 |
+
- HUGGINGFACE_HUB_CACHE=/app/hf_cache # Mengatasi PermissionError cache
|
| 15 |
+
# ------------------------------------
|
| 16 |
+
depends_on:
|
| 17 |
+
lessonplan_db:
|
| 18 |
+
condition: service_healthy
|
| 19 |
+
lessonplan_redis:
|
| 20 |
+
condition: service_started
|
| 21 |
+
|
| 22 |
+
lessonplan_db:
|
| 23 |
+
image: mysql:8.0
|
| 24 |
+
container_name: lessonplan_db
|
| 25 |
+
restart: always
|
| 26 |
+
environment:
|
| 27 |
+
MYSQL_DATABASE: ${MYSQL_DATABASE}
|
| 28 |
+
MYSQL_USER: ${MYSQL_USER}
|
| 29 |
+
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
|
| 30 |
+
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
| 31 |
+
ports:
|
| 32 |
+
- "3307:3306"
|
| 33 |
+
volumes:
|
| 34 |
+
- lessonplan_mysql_data:/var/lib/mysql
|
| 35 |
+
healthcheck:
|
| 36 |
+
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "--user=root", "--password=${MYSQL_ROOT_PASSWORD}"]
|
| 37 |
+
interval: 10s
|
| 38 |
+
timeout: 5s
|
| 39 |
+
retries: 5
|
| 40 |
+
start_period: 30s
|
| 41 |
+
|
| 42 |
+
lessonplan_redis:
|
| 43 |
+
image: redis:7-alpine
|
| 44 |
+
container_name: lessonplan_redis
|
| 45 |
+
restart: always
|
| 46 |
+
|
| 47 |
+
lessonplan_worker:
|
| 48 |
+
build:
|
| 49 |
+
context: .
|
| 50 |
+
container_name: lessonplan_worker
|
| 51 |
+
command: ["celery", "-A", "tasks.celery_app", "worker", "--loglevel=info"]
|
| 52 |
+
volumes:
|
| 53 |
+
- .:/app
|
| 54 |
+
# --- Tambah Environment Variables ---
|
| 55 |
+
environment:
|
| 56 |
+
- HUGGINGFACE_HUB_CACHE=/app/hf_cache # Penting untuk worker finetuning
|
| 57 |
+
# ------------------------------------
|
| 58 |
+
depends_on:
|
| 59 |
+
lessonplan_redis:
|
| 60 |
+
condition: service_started
|
| 61 |
+
lessonplan_db:
|
| 62 |
+
condition: service_healthy
|
| 63 |
+
|
| 64 |
+
volumes:
|
| 65 |
+
lessonplan_mysql_data:
|
knowledge_base/2118-Article Text-14396-1-10-20230413.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:a55b9153b6ff178774927241df25fc14a8ee01b06c700bfa5a525deb6cbec39f
|
| 3 |
+
size 335754
|
knowledge_base/2233-Article Text-12596-1-10-20240723.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:56045d82b89b5e7f511dc9f96e317fd24fd006091128315ef3dfaaa805eea8d0
|
| 3 |
+
size 206827
|
knowledge_base/259034-differentiated-instruction-solusi-pembel-7b868815.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:aa8e3bbd2bbc62971b001478e74bf0cd5cd240f3987831c786ea9646c3bc9642
|
| 3 |
+
size 339531
|
knowledge_base/266-Article Text-1333-1-10-20220811.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:121d2dccc8fc841bce82c496f762f819c68d6cfb946ce83631c37fc4dde9094d
|
| 3 |
+
size 783518
|
knowledge_base/276698-memahami-gaya-belajar-untuk-meningkatkan-7924c83a.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:a2eb657fbe9436d68bbc91421a884fc15b3db75012ebafb01f3773757a77d44d
|
| 3 |
+
size 6910176
|
knowledge_base/309-Article Text-1228-1-10-20230402.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:6f192e44f4bfc557a9a5d212b34467f6fded1ca71ddf7a8f056fcfedc39e1824
|
| 3 |
+
size 562486
|
knowledge_base/442-Article Text-1341-1-10-20220711.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:9bbf0abd9fcce2815cfc3ded76e2a17d7ab453df106ebf4e7807993d3b271e7f
|
| 3 |
+
size 660984
|
knowledge_base/587955-analisis-teoritis-tujuan-pembelajaran-be-3194189b.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:12e64d55fb75c7778b1c518f944aa25da777dce9f979505d291a6840f5f7b1d4
|
| 3 |
+
size 138978
|
knowledge_base/5881-29852-1-PB.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f73d5ef54c4cb28b3efe688e1ee6f4f44fa9eef7195c0ab2d260ef460d23f759
|
| 3 |
+
size 351583
|
knowledge_base/8736-25824-1-PB.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:e054d7b87a1303d0f8f3a20772a1ba92a80139e777cd12ddc09e352f4d2e0269
|
| 3 |
+
size 723055
|
knowledge_base/897-Article Text-4084-2-10-20240911.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b9860eb6ad3a9423e392fb1b10ac9e9306e77ba8aeeaf6358a117df299e77a1a
|
| 3 |
+
size 320612
|
knowledge_base/Analisis Gaya Belajar Peserta Didik dalam Pembelajaran di Kelas.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ddd95e5f97b2c49ab6dd47880c78b57860de49a9b75c590d6f4943474acc03e4
|
| 3 |
+
size 570751
|
knowledge_base/Artikel+9.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:608a88f81a407781c8bb17d94035da90afffd10f0776a150904f1f47eabe6b4a
|
| 3 |
+
size 309453
|
knowledge_base/BAB II 24 SEPTEMBER FIX.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b6de12d3a7fcb9ce45b08172cb73f004b71f367eb6f6e6c8c3e6683fc2addc0e
|
| 3 |
+
size 593712
|
knowledge_base/Buku Multiple Intellegence Dalam Pembelajaran-compressed-compressed.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:2b7b405642814fe68dc02acaebddc5143d2305ba59e4e7505e58beb1b4095036
|
| 3 |
+
size 32577687
|
knowledge_base/Buku-Digital---MANAJEMEN-KELAS.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:5c1710003fc318922bec2a4cc959d30babf6d45624e0976fd503d4d6ef8e192e
|
| 3 |
+
size 5564182
|
knowledge_base/Buku-Model-Pengembangan-Pembelajaran-Berdiferensiasi-SMPN-20-Tangsel-_5-Maretisbn.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:bf29a328fed3f6ba06261377c0105e69a658d0994cdc9b7aca00d415a8a23efa
|
| 3 |
+
size 8495647
|
knowledge_base/IDENTIFIKASI GAYA BELAJAR.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:03398136e49855c6c73c90482ca996f690cc0b7c0bbbc1f39f9e4c111816ee19
|
| 3 |
+
size 191924
|
knowledge_base/IIS-NURHAYATI_2217119_LANDASAN-FILOSOFIS.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:99958339d0d7c765f8eaaacd627d9f99bfba13441e7650ff636da44035755c26
|
| 3 |
+
size 661516
|
knowledge_base/IMPLEMENTASITAKSONOMIBLOOMRANAHKOGNITIFnew.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:eefd1ba17ff79b2a8c0c28bd605fd8dd21ab26cf4cfaddfacd9fbb4b25e17e56
|
| 3 |
+
size 298994
|
knowledge_base/Konsep Gaya Belajar dan Implementasinya.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:39cb0c6e0b802b1be2df1d9b5316610df195a0fcf24b9d5e787a33d4440a7b20
|
| 3 |
+
size 547998
|
knowledge_base/Lencana+Vol+3+no+1+Januari+2025+hal+227-246.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:44a032a21c641194433d27daf015a9486212d79e59fa0b6e642999dd8e8a97ec
|
| 3 |
+
size 919095
|
knowledge_base/MANAJEMEN-KELAS.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ae853f90c7a2f86e4deb4f63c66c1647506b6736fe796b4558c40d917874c188
|
| 3 |
+
size 1312294
|
knowledge_base/Manajemen Kelas Afriza.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:cce33229322ae15a65ed9f279095911b25e99aaba2ef9aa66d400405ee8e4b73
|
| 3 |
+
size 4541004
|
knowledge_base/PRINSIP PENGEMBANGAN PEMBELAJARAN BERDEFERENSIASI.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:fd9cf1d4523249e8e8460dccf4731919d784d456bf545800b531047862c860de
|
| 3 |
+
size 1993490
|
knowledge_base/PSIKOLOGI PERKEMBANGAN PESERTA DIDIK.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:bad9ac2284000035171e35eb6f72222964d4f417e226eeed8ab3caa8bdbed737
|
| 3 |
+
size 3582868
|
knowledge_base/PSIKOLOGI PERKEMBANGAN.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:fb843efd55ee5073b8c39ab4ca23243394797f51519609b4c4b33d8bd19ffb83
|
| 3 |
+
size 921652
|
knowledge_base/Pendekatan Differentiated Instruction.docx
ADDED
|
Binary file (36 kB). View file
|
|
|
knowledge_base/Penerapan_Model_Pembelajaran_Diferensiasi_Differen.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:26e38446974645be95ab5c79caf93457abddc72249018bd3592b18b20b9736de
|
| 3 |
+
size 620942
|
knowledge_base/Pengertian-Multiple-Intelligences.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c1169f05055a7e5ae44a5559ee8071fa1674d29b08a2f281614995a7d9850981
|
| 3 |
+
size 101636
|
knowledge_base/Perkembangan Peserta Didik.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:898c4b0a83252018c0e0a27eccd2d9bebf25e47a40b9f8ade27669b68dc35da5
|
| 3 |
+
size 20279589
|
knowledge_base/Problematika+Manajemen+Kelas-AI.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b87dce3b69608bf461cd8cdf2e1097f06ff312787c3773074e190b40eae7f330
|
| 3 |
+
size 482213
|
knowledge_base/admin_jurnal,+3+Jurnal+Ahmad+Teguh+Purnawanto_removed.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:6a1faf2df5a2780a7c3c2650a20044e87b606b3663232afffc38bd2d8679f8ae
|
| 3 |
+
size 824111
|
knowledge_base/administrator,+106-534-1-PB.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:5ac9e82fcb18143da44f9c8752b325a4eab7de295f98ff89bd3111e5ee9487db
|
| 3 |
+
size 1210768
|
knowledge_base/adminjip1,+23115-Article+Text-78714-1-4-20230501.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:a36ab49383cde59352b86564ae642d292d9e57abc2b62c44dadfecab216fac6e
|
| 3 |
+
size 246150
|
knowledge_base/adminopenjurnal,+publish+ke-3.doc.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ec2b3b5e2e8c6b3adc0ff9345afa32b3070b4418b088ed3b33fd6a919abb4534
|
| 3 |
+
size 465856
|
knowledge_base/humanika,+4-+J-HUMANIKA+VOL+21+N0+2+2021.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:76e88b066774194a3656a766e489142095ae728e8a2390972a392d049eaf3602
|
| 3 |
+
size 332721
|
knowledge_base/humanika,+MENGGALI+KEMAMPUAN+Sunartini+-+5.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:cff5ac74d060373b0c33dc78eb9281a33f1b03e9930d460a605a2c4fd13a9af9
|
| 3 |
+
size 109171
|
knowledge_base/nur-hidayah-buku-Psikologi-Pendidikan-cover.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:432a5368ae1629d0faf9b7ae92f4512c7075bb76c784136080c8cb30133f0ade
|
| 3 |
+
size 3513401
|
knowledge_base/skripsi bab 2 Desi Nur Safitri.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:379c8b9832024a49ea5d5258e374e130ebe6a337e2a4fa784dae3acbe5550189
|
| 3 |
+
size 445124
|
requirements.txt
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# File: requirements.txt (REVISED TO ADD pypdf)
|
| 2 |
+
|
| 3 |
+
# --- Core FastAPI & Web Server ---
|
| 4 |
+
fastapi
|
| 5 |
+
uvicorn
|
| 6 |
+
|
| 7 |
+
# --- LangChain & Hugging Face (Versions are now flexible) ---
|
| 8 |
+
langchain==0.1.20
|
| 9 |
+
langchain-community==0.0.38
|
| 10 |
+
langchain-huggingface
|
| 11 |
+
huggingface_hub
|
| 12 |
+
sentence-transformers
|
| 13 |
+
unstructured[pdf]
|
| 14 |
+
python-docx
|
| 15 |
+
duckduckgo-search
|
| 16 |
+
pypdf # <-- TAMBAHKAN INI
|
| 17 |
+
|
| 18 |
+
# --- Database (MySQL) ---
|
| 19 |
+
sqlalchemy
|
| 20 |
+
pymysql
|
| 21 |
+
|
| 22 |
+
# --- Vector Store ---
|
| 23 |
+
faiss-cpu
|
| 24 |
+
|
| 25 |
+
# --- Fine-Tuning & PyTorch (Core) ---
|
| 26 |
+
transformers
|
| 27 |
+
peft
|
| 28 |
+
bitsandbytes
|
| 29 |
+
datasets
|
| 30 |
+
accelerate
|
| 31 |
+
torch
|
| 32 |
+
|
| 33 |
+
# --- Asynchronous Task Queue for Fine-Tuning ---
|
| 34 |
+
celery
|
| 35 |
+
redis
|
simple_finetune.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# File: simple_finetune.py -script inti untuk proses fine-tuning, yang dijalankan oleh Celery Worker.
|
| 2 |
+
|
| 3 |
+
import os
|
| 4 |
+
import json
|
| 5 |
+
import pandas as pd
|
| 6 |
+
from sqlalchemy import create_engine
|
| 7 |
+
import torch
|
| 8 |
+
from datasets import Dataset
|
| 9 |
+
from transformers import (
|
| 10 |
+
AutoModelForCausalLM,
|
| 11 |
+
AutoTokenizer,
|
| 12 |
+
BitsAndBytesConfig,
|
| 13 |
+
TrainingArguments,
|
| 14 |
+
Trainer
|
| 15 |
+
)
|
| 16 |
+
from peft import LoraConfig, get_peft_model
|
| 17 |
+
|
| 18 |
+
# --- 1. Konfigurasi ---
|
| 19 |
+
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 20 |
+
DATABASE_URL = os.getenv("DATABASE_URL")
|
| 21 |
+
BASE_MODEL_ID = "SeaLLMs/SeaLLM-7B-v2.5"
|
| 22 |
+
NEW_TUNED_MODEL_ID = f"nama-anda/lessonplan-assistant-finetuned-v1" # Ganti "nama-anda"
|
| 23 |
+
|
| 24 |
+
# --- 2. Memuat Data dari Database ---
|
| 25 |
+
def create_lessonplan_dataset_from_db():
|
| 26 |
+
print("Menghubungkan ke database untuk mengambil data RPP...")
|
| 27 |
+
engine = create_engine(DATABASE_URL)
|
| 28 |
+
# Ambil data yang belum pernah digunakan untuk training
|
| 29 |
+
df = pd.read_sql("SELECT * FROM approved_lesson_plans WHERE is_used_for_training = FALSE", engine)
|
| 30 |
+
|
| 31 |
+
if df.empty:
|
| 32 |
+
print("Tidak ada data RPP baru untuk training.")
|
| 33 |
+
return None
|
| 34 |
+
|
| 35 |
+
instructions = []
|
| 36 |
+
for _, row in df.iterrows():
|
| 37 |
+
rpp_data = json.loads(row['full_json_data'])
|
| 38 |
+
prompt = f"Buatkan Rencana Pelaksanaan Pembelajaran (RPP) untuk mata pelajaran {rpp_data.get('lp_subject', '')} dengan topik '{rpp_data.get('lp_topic', '')}'."
|
| 39 |
+
response = json.dumps(rpp_data, indent=2, ensure_ascii=False)
|
| 40 |
+
instructions.append({"prompt": prompt, "response": response})
|
| 41 |
+
|
| 42 |
+
print(f"Berhasil memuat {len(instructions)} data RPP baru.")
|
| 43 |
+
return Dataset.from_pandas(pd.DataFrame(instructions))
|
| 44 |
+
|
| 45 |
+
# --- 3. Proses Fine-Tuning ---
|
| 46 |
+
def main():
|
| 47 |
+
dataset = create_lessonplan_dataset_from_db()
|
| 48 |
+
if dataset is None:
|
| 49 |
+
return
|
| 50 |
+
|
| 51 |
+
# ... (Sisa kode sama seperti `simple_finetune.py` sebelumnya) ...
|
| 52 |
+
# (Memuat model, tokenizer, format data, training, push to hub)
|
| 53 |
+
# Pastikan setelah push_to_hub berhasil, Anda mengupdate kolom is_used_for_training menjadi TRUE di database.
|
| 54 |
+
|
| 55 |
+
if __name__ == "__main__":
|
| 56 |
+
main()
|
tasks.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# File: tasks.py (File ini mendefinisikan tugas latar belakang -fine-tuning- yang akan dijalankan oleh Celery.)
|
| 2 |
+
|
| 3 |
+
import os
|
| 4 |
+
from celery import Celery
|
| 5 |
+
import subprocess
|
| 6 |
+
|
| 7 |
+
# Ambil URL broker dari environment variable
|
| 8 |
+
CELERY_BROKER_URL = os.getenv('CELERY_BROKER_URL', 'redis://redis:6379/0')
|
| 9 |
+
|
| 10 |
+
# Inisialisasi aplikasi Celery
|
| 11 |
+
celery_app = Celery('lessonplan_tasks', broker=CELERY_BROKER_URL)
|
| 12 |
+
|
| 13 |
+
@celery_app.task(name='tasks.start_lessonplan_finetune_task')
|
| 14 |
+
def start_lessonplan_finetune_task():
|
| 15 |
+
"""
|
| 16 |
+
Tugas ini memanggil script fine-tuning utama.
|
| 17 |
+
Ini akan dijalankan oleh Celery Worker di server GPU.
|
| 18 |
+
"""
|
| 19 |
+
try:
|
| 20 |
+
print("Memulai proses fine-tuning untuk Lesson Plan Assistant...")
|
| 21 |
+
|
| 22 |
+
# Menjalankan script sebagai proses terpisah
|
| 23 |
+
# Pastikan environment worker memiliki akses ke semua environment variable
|
| 24 |
+
result = subprocess.run(
|
| 25 |
+
["python", "simple_finetune.py"],
|
| 26 |
+
check=True,
|
| 27 |
+
capture_output=True,
|
| 28 |
+
text=True
|
| 29 |
+
)
|
| 30 |
+
|
| 31 |
+
print("Proses fine-tuning selesai.")
|
| 32 |
+
print("Output:", result.stdout)
|
| 33 |
+
return {"status": "Completed", "output": result.stdout}
|
| 34 |
+
|
| 35 |
+
except subprocess.CalledProcessError as e:
|
| 36 |
+
print(f"Error saat fine-tuning: {e.stderr}")
|
| 37 |
+
return {"status": "Failed", "error": e.stderr}
|