yopiindra commited on
Commit
a9bd304
·
verified ·
1 Parent(s): 7b9db2f

Upload 47 files

Browse files
Files changed (48) hide show
  1. .gitattributes +39 -0
  2. Dockerfile +42 -0
  3. app.py +211 -0
  4. core/rag_services.py +131 -0
  5. docker-compose.yml +65 -0
  6. knowledge_base/2118-Article Text-14396-1-10-20230413.pdf +3 -0
  7. knowledge_base/2233-Article Text-12596-1-10-20240723.pdf +3 -0
  8. knowledge_base/259034-differentiated-instruction-solusi-pembel-7b868815.pdf +3 -0
  9. knowledge_base/266-Article Text-1333-1-10-20220811.pdf +3 -0
  10. knowledge_base/276698-memahami-gaya-belajar-untuk-meningkatkan-7924c83a.pdf +3 -0
  11. knowledge_base/309-Article Text-1228-1-10-20230402.pdf +3 -0
  12. knowledge_base/442-Article Text-1341-1-10-20220711.pdf +3 -0
  13. knowledge_base/587955-analisis-teoritis-tujuan-pembelajaran-be-3194189b.pdf +3 -0
  14. knowledge_base/5881-29852-1-PB.pdf +3 -0
  15. knowledge_base/8736-25824-1-PB.pdf +3 -0
  16. knowledge_base/897-Article Text-4084-2-10-20240911.pdf +3 -0
  17. knowledge_base/Analisis Gaya Belajar Peserta Didik dalam Pembelajaran di Kelas.pdf +3 -0
  18. knowledge_base/Artikel+9.pdf +3 -0
  19. knowledge_base/BAB II 24 SEPTEMBER FIX.pdf +3 -0
  20. knowledge_base/Buku Multiple Intellegence Dalam Pembelajaran-compressed-compressed.pdf +3 -0
  21. knowledge_base/Buku-Digital---MANAJEMEN-KELAS.pdf +3 -0
  22. knowledge_base/Buku-Model-Pengembangan-Pembelajaran-Berdiferensiasi-SMPN-20-Tangsel-_5-Maretisbn.pdf +3 -0
  23. knowledge_base/IDENTIFIKASI GAYA BELAJAR.pdf +3 -0
  24. knowledge_base/IIS-NURHAYATI_2217119_LANDASAN-FILOSOFIS.pdf +3 -0
  25. knowledge_base/IMPLEMENTASITAKSONOMIBLOOMRANAHKOGNITIFnew.pdf +3 -0
  26. knowledge_base/Konsep Gaya Belajar dan Implementasinya.pdf +3 -0
  27. knowledge_base/Lencana+Vol+3+no+1+Januari+2025+hal+227-246.pdf +3 -0
  28. knowledge_base/MANAJEMEN-KELAS.pdf +3 -0
  29. knowledge_base/Manajemen Kelas Afriza.pdf +3 -0
  30. knowledge_base/PRINSIP PENGEMBANGAN PEMBELAJARAN BERDEFERENSIASI.pdf +3 -0
  31. knowledge_base/PSIKOLOGI PERKEMBANGAN PESERTA DIDIK.pdf +3 -0
  32. knowledge_base/PSIKOLOGI PERKEMBANGAN.pdf +3 -0
  33. knowledge_base/Pendekatan Differentiated Instruction.docx +0 -0
  34. knowledge_base/Penerapan_Model_Pembelajaran_Diferensiasi_Differen.pdf +3 -0
  35. knowledge_base/Pengertian-Multiple-Intelligences.pdf +3 -0
  36. knowledge_base/Perkembangan Peserta Didik.pdf +3 -0
  37. knowledge_base/Problematika+Manajemen+Kelas-AI.pdf +3 -0
  38. knowledge_base/admin_jurnal,+3+Jurnal+Ahmad+Teguh+Purnawanto_removed.pdf +3 -0
  39. knowledge_base/administrator,+106-534-1-PB.pdf +3 -0
  40. knowledge_base/adminjip1,+23115-Article+Text-78714-1-4-20230501.pdf +3 -0
  41. knowledge_base/adminopenjurnal,+publish+ke-3.doc.pdf +3 -0
  42. knowledge_base/humanika,+4-+J-HUMANIKA+VOL+21+N0+2+2021.pdf +3 -0
  43. knowledge_base/humanika,+MENGGALI+KEMAMPUAN+Sunartini+-+5.pdf +3 -0
  44. knowledge_base/nur-hidayah-buku-Psikologi-Pendidikan-cover.pdf +3 -0
  45. knowledge_base/skripsi bab 2 Desi Nur Safitri.pdf +3 -0
  46. requirements.txt +35 -0
  47. simple_finetune.py +56 -0
  48. 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}