Spaces:
Running
Running
FauziIsyrinApridal
commited on
Commit
Β·
e96fbd0
1
Parent(s):
82031c8
add evaluation
Browse files- .env.example +11 -1
- __pycache__/dataset_rag_pnp.cpython-312.pyc +0 -0
- app.py +1 -2
- app/document_processor.py +9 -15
- dataset_rag_pnp.py +46 -0
- rag_eval_langsmith.ipynb +0 -0
- requirements.txt +2 -1
- tests/test_admin.py +65 -0
- tests/test_chatbot.py +72 -0
.env.example
CHANGED
@@ -1,3 +1,13 @@
|
|
1 |
REPLICATE_API_TOKEN=
|
|
|
2 |
SUPABASE_URL=
|
3 |
-
SUPABASE_KEY=
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
REPLICATE_API_TOKEN=
|
2 |
+
|
3 |
SUPABASE_URL=
|
4 |
+
SUPABASE_KEY=
|
5 |
+
SUPABASE_STORAGE_BUCKET=
|
6 |
+
|
7 |
+
|
8 |
+
HUGGINGFACEHUB_API_TOKEN=
|
9 |
+
LANGSMITH_TRACING=
|
10 |
+
LANGSMITH_ENDPOINT=
|
11 |
+
LANGSMITH_API_KEY=
|
12 |
+
LANGSMITH_PROJECT=
|
13 |
+
OPENAI_API_KEY=
|
__pycache__/dataset_rag_pnp.cpython-312.pyc
ADDED
Binary file (5.2 kB). View file
|
|
app.py
CHANGED
@@ -19,7 +19,7 @@ load_dotenv()
|
|
19 |
|
20 |
# Supabase configuration
|
21 |
BUCKET_NAME = "pnp-bot-storage-archive"
|
22 |
-
VECTOR_STORE_PREFIX = "vector_store"
|
23 |
DATA_DIR = "data"
|
24 |
|
25 |
@traceable(name="Create RAG Conversational Chain")
|
@@ -92,7 +92,6 @@ def vector_store_is_outdated():
|
|
92 |
|
93 |
return data_time > supabase_time
|
94 |
|
95 |
-
@traceable(name="Main Chatbot RAG App")
|
96 |
@traceable(name="Main Chatbot RAG App")
|
97 |
def main():
|
98 |
initialize_session_state()
|
|
|
19 |
|
20 |
# Supabase configuration
|
21 |
BUCKET_NAME = "pnp-bot-storage-archive"
|
22 |
+
VECTOR_STORE_PREFIX = "vector_store"
|
23 |
DATA_DIR = "data"
|
24 |
|
25 |
@traceable(name="Create RAG Conversational Chain")
|
|
|
92 |
|
93 |
return data_time > supabase_time
|
94 |
|
|
|
95 |
@traceable(name="Main Chatbot RAG App")
|
96 |
def main():
|
97 |
initialize_session_state()
|
app/document_processor.py
CHANGED
@@ -102,18 +102,12 @@ def process_documents(docs):
|
|
102 |
model_kwargs={"device": "cpu"},
|
103 |
encode_kwargs={"normalize_embeddings": True}
|
104 |
)
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
metadata=metadata
|
115 |
-
)
|
116 |
-
combined_docs.append(combined_doc)
|
117 |
-
|
118 |
-
vector_store = FAISS.from_documents(combined_docs, embeddings)
|
119 |
-
return vector_store
|
|
|
102 |
model_kwargs={"device": "cpu"},
|
103 |
encode_kwargs={"normalize_embeddings": True}
|
104 |
)
|
105 |
+
|
106 |
+
text_splitter = RecursiveCharacterTextSplitter(
|
107 |
+
chunk_size=1500,
|
108 |
+
chunk_overlap=300
|
109 |
+
)
|
110 |
+
text_chunks = text_splitter.split_documents(docs)
|
111 |
+
vector_store = FAISS.from_documents(text_chunks, embeddings)
|
112 |
+
|
113 |
+
return vector_store
|
|
|
|
|
|
|
|
|
|
|
|
dataset_rag_pnp.py
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
dataset = [
|
2 |
+
{
|
3 |
+
'question': '''Bagaimana sistem pendidikan yang diterapkan di Politeknik Negeri Padang?''',
|
4 |
+
'ground_truth': '''Sistem pendidikan yang diterapkan di Politeknik adalah dengan menggabungkan pendidikan teoritis, praktek (terapan) di Laboratorium dan praktek industry. Pelaksanaan praktik di industri dilakukan oleh mahasiswa selama satu semester untuk menambah wawasan, pengalaman dan pengembangan ilmu guna membentuk tenaga ahli yang terampil dan profesional.'''
|
5 |
+
},
|
6 |
+
{
|
7 |
+
'question': '''Apa saja mata kuliah yang terdapat dalam kurikulum pendidikan Politeknik Negeri Padang?''',
|
8 |
+
'ground_truth': '''Kurikulum Pendidikan telah disusun berbasis kompetensi dengan kelompok mata kuliah sebagai berikut : - Mata Kuliah Pengembangan Kepribadian (MPK) - Mata Kuliah Keimuan dan Keterampilan (MKK) - Mata Kuliah Berkarya (MKB) - Mata Kuliah Berkehidupan Bermasyarakat (MBB)'''
|
9 |
+
},
|
10 |
+
{
|
11 |
+
'question': '''Bagaimana Politeknik Negeri Padang mendukung misi tridharma perguruan tinggi?''',
|
12 |
+
'ground_truth': '''Politeknik Negeri Padang dalam menjalankan misi tridharma perguruan tinggi didukung oleh tenaga pendidik dan tenaga kependidikan yang profesional pada bidangnya. Jumlah dan kualifikasi staf tersebut berdasarkan keadaan Desember 2017 sebagai berikut : - Tenaga Pendidik : S1 = 14 orang, S2 = 256 orang, S3 = 21 orang (Yang sedang menempuh S3 = 7 orang, Yang sedang menempuh S2 = 5 orang) - Tenaga Kependidikan : SD = 5 orang, SMP = 4 orang, SLTA = 71 orang, D3 = 25 orang, S1 = 54 orang, S2 = 15 orang.'''
|
13 |
+
},
|
14 |
+
{
|
15 |
+
'question': '''Bagaimana Politeknik Negeri Padang menyediakan akses internet bagi mahasiswa?''',
|
16 |
+
'ground_truth': '''Politeknik Negeri Padang telah memiliki Anjungan Internet Mandiri (AIM) yang dapat diakses oleh mahasiswa secara gratis, yang tersedia pada titik-titik strategis. Juga tersedia kawasan hot spot area di sekitar kampus sehingga mahasiswa dapat memanfaatkan internet dengan bebas menggunakan laptop/PC.'''
|
17 |
+
},
|
18 |
+
{
|
19 |
+
'question': '''Apa saja contoh kerjasama Politeknik Negeri Padang dengan industri?''',
|
20 |
+
'ground_truth': '''PT. Siemens Indonesia, PT. Toyota Aichi Takaoua Japan, PT. PLN, PT. INTI, Futaba Rashi Siisha Kusho Japan, PT. Sintom, PT. Krakatau Steel, Komatssu Shinge Koumuten, PT. PAL Indonesia, PT. Hexindo, Taishurin Co. Ltd Fukuoaka Japan, PT. Texmaco Perkasa, PT. LEN Industri, PT. Toyota Astra Motor, PT. Indah Kiat, PT. Trakindo Utama, BTN.'''
|
21 |
+
},
|
22 |
+
{
|
23 |
+
'question': '''Bagaimana Politeknik Negeri Padang membantu mahasiswa dalam bidang prestasi dan ekonomi?''',
|
24 |
+
'ground_truth': '''Tersedia bantuan untuk sekitar 800 mahasiswa setiap tahunnya. Beasiswa yang diterima antara lain: - Beasiswa Peningkatan Prestasi Akademik (PPA), - Beasiswa Kerja Mahasiswa (BKM), - Beasiswa Bantuan Belajar Mahasiswa (BBM), - Beasiswa TPSDP, - Beasiswa Kredit Bantuan Belajar Mahasiswa (KBBM), - Beasiswa Depertemen Hankam (ABRI), - Beasiswa PT. Toyota Astra, - Beasiswa ORBIT (ICMI), - Beasiswa Supersemar.'''
|
25 |
+
},
|
26 |
+
{
|
27 |
+
'question': '''Bagaimana status akreditasi program studi di Politeknik Negeri Padang?''',
|
28 |
+
'ground_truth': '''Program studi di Politeknik Negeri Padang memiliki status akreditasi yang bervariasi seperti Baik, Baik Sekali, hingga Unggul. Contohnya, Teknik Mesin (D3) terakreditasi Baik Sekali hingga 2029, Teknik Manufaktur (D4) terakreditasi Unggul hingga 2028, dan Teknik Sipil (D3) terakreditasi A hingga 2026. Setiap program memiliki SK dan sertifikat akreditasi resmi.'''
|
29 |
+
},
|
30 |
+
{
|
31 |
+
'question': '''Bagaimana proses penerimaan mahasiswa baru di Politeknik Negeri Padang?''',
|
32 |
+
'ground_truth': '''Penerimaan mahasiswa baru di Politeknik Negeri Padang dilakukan melalui berbagai jalur seleksi seperti SNBT, SNMPN, dan kelas kerjasama. Tersedia brosur dan informasi detail melalui situs http://penerimaan.pnp.ac.id. Program studi Teknik Alat Berat misalnya memiliki kelas kerjasama dengan PT Trakindo Utama. Jadwal seleksi dan pengumuman dapat diakses secara daring.'''
|
33 |
+
},
|
34 |
+
{
|
35 |
+
'question': '''Apa bentuk kerjasama yang dilakukan Politeknik Negeri Padang?''',
|
36 |
+
'ground_truth': '''Politeknik Negeri Padang menjalin kerjasama dengan industri, pemerintah, BUMN, dan asosiasi profesi baik dalam negeri maupun luar negeri. Bentuk kerjasama mencakup rekrutmen, prakerin (praktik kerja industri), kunjungan industri, bimbingan karir, serta pembuatan MoU. Tujuannya untuk menjaga mutu lulusan dan penyaluran SDM.'''
|
37 |
+
},
|
38 |
+
{
|
39 |
+
'question': '''Siapa saja pimpinan di Politeknik Negeri Padang saat ini?''',
|
40 |
+
'ground_truth': '''Direktur Politeknik Negeri Padang adalah Dr. Ir. Surfa Yondri, S.T., S.ST., M.Kom. Wakil Direktur Bidang Akademik adalah Ir. Revalin Herdianto, ST., M.Sc., Ph.D. Pimpinan lainnya antara lain Nasrullah, ST., M.T., dan Sarmiadi, S.E., M.M. yang memiliki pengalaman panjang dalam jabatan struktural di kampus.'''
|
41 |
+
},
|
42 |
+
{
|
43 |
+
'question': '''Bagaimana sejarah singkat berdirinya Politeknik Negeri Padang?''',
|
44 |
+
'ground_truth': '''Politeknik Negeri Padang didirikan pada tahun 1987 sebagai salah satu dari 17 politeknik pertama di Indonesia. Awalnya bernama Politeknik Engineering Universitas Andalas. Pada 1997 menjadi Politeknik Universitas Andalas lalu berubah menjadi Politeknik Negeri Padang. Saat ini memiliki 32 program studi dari jenjang D3 hingga Magister Terapan.'''
|
45 |
+
},
|
46 |
+
]
|
rag_eval_langsmith.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
requirements.txt
CHANGED
@@ -115,4 +115,5 @@ soundfile
|
|
115 |
SpeechRecognition
|
116 |
chardet
|
117 |
streamlit_mic_recorder
|
118 |
-
gtts
|
|
|
|
115 |
SpeechRecognition
|
116 |
chardet
|
117 |
streamlit_mic_recorder
|
118 |
+
gtts
|
119 |
+
playwright
|
tests/test_admin.py
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from playwright.sync_api import sync_playwright
|
2 |
+
import time
|
3 |
+
import os
|
4 |
+
import random
|
5 |
+
|
6 |
+
# Ganti path ini dengan path file kamu
|
7 |
+
FILE_PATH = r"C:\path\ke\contoh\file.pdf"
|
8 |
+
|
9 |
+
def run_test():
|
10 |
+
with sync_playwright() as p:
|
11 |
+
browser = p.chromium.launch(headless=False) # headless=False untuk lihat
|
12 |
+
page = browser.new_page()
|
13 |
+
|
14 |
+
# 1οΈβ£ Akses halaman login
|
15 |
+
page.goto("https://yozora721-pnp-chatbot-admin-v1.hf.space/login")
|
16 |
+
page.wait_for_timeout(2000)
|
17 |
+
|
18 |
+
# 2οΈβ£ Login dengan admin
|
19 |
+
page.fill("input[name='email']", "[email protected]")
|
20 |
+
page.fill("input[name='password']", "password")
|
21 |
+
page.click("text=Login")
|
22 |
+
page.wait_for_timeout(3000)
|
23 |
+
|
24 |
+
# 3οΈβ£ Verifikasi status awal
|
25 |
+
documents_count = page.inner_text("text=documents available") if page.is_visible("text=documents available") else "Tidak ditemukan"
|
26 |
+
print(f"π Status awal dokumen: {documents_count}")
|
27 |
+
|
28 |
+
# 4οΈβ£ Klik "Upload Document" dan pilih file
|
29 |
+
page.click("text=Upload Document")
|
30 |
+
page.wait_for_timeout(2000)
|
31 |
+
|
32 |
+
page.set_input_files("input[type='file']", FILE_PATH)
|
33 |
+
page.click("text=Upload")
|
34 |
+
page.wait_for_timeout(3000)
|
35 |
+
|
36 |
+
# 5οΈβ£ Klik "Start Scraping"
|
37 |
+
page.click("text=Start Scraping")
|
38 |
+
page.wait_for_timeout(1000)
|
39 |
+
|
40 |
+
# Memilih item dari Dropdown Scraping
|
41 |
+
items = page.query_selector_all("//div[contains(@class,'menu-item')]") # contoh
|
42 |
+
if items:
|
43 |
+
item = random.choice(items)
|
44 |
+
item.click()
|
45 |
+
page.wait_for_timeout(3000)
|
46 |
+
|
47 |
+
# 6οΈβ£ Klik "Filter All Semesters"
|
48 |
+
page.click("text=All Semesters")
|
49 |
+
page.wait_for_timeout(2000)
|
50 |
+
|
51 |
+
# 7οΈβ£ Klik "Refresh"
|
52 |
+
page.click("text=Refresh")
|
53 |
+
page.wait_for_timeout(2000)
|
54 |
+
|
55 |
+
# 8οΈβ£ Klik "Log Out"
|
56 |
+
page.click("text=Log Out")
|
57 |
+
page.wait_for_timeout(2000)
|
58 |
+
|
59 |
+
print("β
Test Admin Page selesai!")
|
60 |
+
|
61 |
+
browser.close()
|
62 |
+
|
63 |
+
|
64 |
+
if __name__ == "__main__":
|
65 |
+
run_test()
|
tests/test_chatbot.py
ADDED
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from playwright.sync_api import sync_playwright
|
2 |
+
import time
|
3 |
+
|
4 |
+
URL = "https://yozora721-pnp-chatbot-v1.hf.space"
|
5 |
+
PERTANYAAN = "Halo"
|
6 |
+
|
7 |
+
def kirim_pertanyaan(page, pertanyaan: str):
|
8 |
+
"""Ketik pertanyaan dan kirim."""
|
9 |
+
page.locator('textarea[placeholder="Masukkan pertanyaan"]').fill(pertanyaan)
|
10 |
+
page.keyboard.press("Enter")
|
11 |
+
page.wait_for_selector('.stChatMessage', timeout=60000)
|
12 |
+
|
13 |
+
def jumlah_tag_audio(page) -> int:
|
14 |
+
"""Hitung jumlah tag <audio>"""
|
15 |
+
return len(page.query_selector_all("audio"))
|
16 |
+
|
17 |
+
def klik_toggle_tts(page):
|
18 |
+
"""Klik Toggle TTS sesuai status awal"""
|
19 |
+
aktif = page.locator('text=π Text-to-Speech Aktif')
|
20 |
+
nonaktif = page.locator('text=π Text-to-Speech Nonaktif')
|
21 |
+
if aktif.count() > 0:
|
22 |
+
aktif.click()
|
23 |
+
elif nonaktif.count() > 0:
|
24 |
+
nonaktif.click()
|
25 |
+
|
26 |
+
def test_tts_condition(page, tts_aktif: bool):
|
27 |
+
"""Test untuk satu skenario."""
|
28 |
+
print(f"\n=== TEST: {'TTS Aktif' if tts_aktif else 'TTS Nonaktif'} ===")
|
29 |
+
awal_aktif = page.locator('text=π Text-to-Speech Aktif')
|
30 |
+
awal_nonaktif = page.locator('text=π Text-to-Speech Nonaktif')
|
31 |
+
|
32 |
+
# Atur status sesuai kebutuhan
|
33 |
+
if tts_aktif and awal_nonaktif.count() > 0:
|
34 |
+
klik_toggle_tts(page)
|
35 |
+
|
36 |
+
if not tts_aktif and awal_aktif.count() > 0:
|
37 |
+
klik_toggle_tts(page)
|
38 |
+
|
39 |
+
kirim_pertanyaan(page, PERTANYAAN)
|
40 |
+
|
41 |
+
jumlah_audio = jumlah_tag_audio(page)
|
42 |
+
|
43 |
+
if tts_aktif:
|
44 |
+
if jumlah_audio > 0:
|
45 |
+
print(f"β
[AKTIF] Ada {jumlah_audio} tag <audio> (sesuai ekspektasi).")
|
46 |
+
else:
|
47 |
+
print(f"β [AKTIF] Tidak ditemukan tag <audio>.")
|
48 |
+
else:
|
49 |
+
if jumlah_audio == 0:
|
50 |
+
print(f"β
[NONAKTIF] Tidak ditemukan tag <audio> (sesuai ekspektasi).")
|
51 |
+
else:
|
52 |
+
print(f"β [NONAKTIF] Ada {jumlah_audio} tag <audio>, tidak sesuai ekspektasi.")
|
53 |
+
|
54 |
+
time.sleep(3) # buat melihat efek sebelum tes selanjutnya
|
55 |
+
|
56 |
+
def main():
|
57 |
+
"""Main entry point."""
|
58 |
+
with sync_playwright() as p:
|
59 |
+
browser = p.chromium.launch(headless=False) # True kalau tidak perlu melihat
|
60 |
+
page = browser.new_page()
|
61 |
+
page.goto(URL)
|
62 |
+
|
63 |
+
# Test dengan TTS aktif
|
64 |
+
test_tts_condition(page, True)
|
65 |
+
|
66 |
+
# Test dengan TTS nonaktif
|
67 |
+
test_tts_condition(page, False)
|
68 |
+
|
69 |
+
browser.close()
|
70 |
+
|
71 |
+
if __name__ == '__main__':
|
72 |
+
main()
|