FauziIsyrinApridal commited on
Commit
25db599
·
1 Parent(s): 8c09e73

update testing script and rollback chat

Browse files
Files changed (3) hide show
  1. app/chat.py +18 -53
  2. evaluate.py +2 -2
  3. evaluate_ragas.py +132 -0
app/chat.py CHANGED
@@ -21,34 +21,18 @@ def initialize_session_state():
21
  st.session_state['should_speak'] = True
22
  if 'input_text' not in st.session_state:
23
  st.session_state['input_text'] = ""
24
- if 'audio_cache' not in st.session_state:
25
- st.session_state['audio_cache'] = {}
26
- if 'play_audio' not in st.session_state:
27
- st.session_state['play_audio'] = None
28
 
29
- # Fungsi TTS dengan cache
30
- def text_to_speech(text, message_id=None):
31
- # Cek cache terlebih dahulu
32
- if message_id and message_id in st.session_state['audio_cache']:
33
- return st.session_state['audio_cache'][message_id]
34
-
35
  tts = gtts.gTTS(text, lang="id")
36
  audio_bytes = BytesIO()
37
  tts.write_to_fp(audio_bytes)
38
  audio_bytes.seek(0)
39
  audio_base64 = base64.b64encode(audio_bytes.read()).decode()
40
-
41
- # Simpan ke cache jika ada message_id
42
- if message_id:
43
- st.session_state['audio_cache'][message_id] = audio_base64
44
-
45
- return audio_base64
46
-
47
- # Fungsi untuk membuat audio player
48
- def create_audio_player(audio_base64, autoplay=False):
49
- autoplay_attr = "autoplay" if autoplay else ""
50
  audio_player = f"""
51
- <audio {autoplay_attr} controls style="width: 100%; margin-top: 5px;">
52
  <source src="data:audio/mp3;base64,{audio_base64}" type="audio/mp3">
53
  </audio>
54
  """
@@ -108,42 +92,23 @@ def display_chat_history(chain):
108
  st.session_state['generated'].append(output)
109
  st.session_state.input_text = ""
110
 
111
- # Auto-play TTS untuk pesan baru jika diaktifkan
112
  if st.session_state['should_speak'] and output:
113
- message_id = len(st.session_state['generated']) - 1
114
- audio_base64 = text_to_speech(output, message_id)
115
- st.session_state['play_audio'] = message_id
116
 
117
- # Tampilkan riwayat chat dengan tombol TTS
118
  if st.session_state['generated']:
119
  with reply_container:
120
  for i in range(len(st.session_state['generated'])):
121
- # Tampilkan pesan user
122
  message(st.session_state["past"][i], is_user=True, key=str(i) + '_user', avatar_style="no-avatar")
123
-
124
- # Tampilkan pesan bot
125
  message(st.session_state["generated"][i], key=str(i), avatar_style="no-avatar")
126
-
127
- # Tombol dan audio player untuk pesan bot
128
- col1, col2 = st.columns([1, 4])
129
- with col1:
130
- if st.button(f"🔊", key=f"play_tts_{i}", help="Putar ulang audio"):
131
- st.session_state['play_audio'] = i
132
- st.experimental_rerun()
133
-
134
- # Tampilkan audio player jika pesan ini yang dipilih untuk diputar
135
- if st.session_state.get('play_audio') == i:
136
- with col2:
137
- message_text = st.session_state["generated"][i]
138
- audio_base64 = text_to_speech(message_text, i)
139
-
140
- # Auto-play untuk pesan baru, manual untuk replay
141
- autoplay = (i == len(st.session_state['generated']) - 1 and
142
- st.session_state['should_speak'])
143
-
144
- audio_player = create_audio_player(audio_base64, autoplay)
145
- st.markdown(audio_player, unsafe_allow_html=True)
146
-
147
- # Reset play_audio setelah ditampilkan
148
- if st.session_state.get('play_audio') == i:
149
- st.session_state['play_audio'] = None
 
21
  st.session_state['should_speak'] = True
22
  if 'input_text' not in st.session_state:
23
  st.session_state['input_text'] = ""
24
+ if 'tts_output' not in st.session_state:
25
+ st.session_state['tts_output'] = ""
 
 
26
 
27
+ # Fungsi TTS
28
+ def text_to_speech(text):
 
 
 
 
29
  tts = gtts.gTTS(text, lang="id")
30
  audio_bytes = BytesIO()
31
  tts.write_to_fp(audio_bytes)
32
  audio_bytes.seek(0)
33
  audio_base64 = base64.b64encode(audio_bytes.read()).decode()
 
 
 
 
 
 
 
 
 
 
34
  audio_player = f"""
35
+ <audio autoplay>
36
  <source src="data:audio/mp3;base64,{audio_base64}" type="audio/mp3">
37
  </audio>
38
  """
 
92
  st.session_state['generated'].append(output)
93
  st.session_state.input_text = ""
94
 
95
+ # Simpan output untuk TTS
96
  if st.session_state['should_speak'] and output:
97
+ st.session_state['tts_output'] = output
98
+ if 'tts_played' in st.session_state:
99
+ del st.session_state['tts_played']
100
 
101
+ # Tampilkan riwayat chat
102
  if st.session_state['generated']:
103
  with reply_container:
104
  for i in range(len(st.session_state['generated'])):
 
105
  message(st.session_state["past"][i], is_user=True, key=str(i) + '_user', avatar_style="no-avatar")
 
 
106
  message(st.session_state["generated"][i], key=str(i), avatar_style="no-avatar")
107
+
108
+ # Tampilkan dan mainkan audio TTS jika ada
109
+ if st.session_state.get('tts_output') and not st.session_state.get('tts_played'):
110
+ st.markdown(text_to_speech(st.session_state['tts_output']), unsafe_allow_html=True)
111
+ st.session_state['tts_played'] = True
112
+ elif st.session_state.get('tts_played'):
113
+ st.session_state['tts_output'] = ""
114
+ del st.session_state['tts_played']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
evaluate.py CHANGED
@@ -61,7 +61,7 @@ class PNPRAGEvaluator:
61
  # Initialize RAG chain
62
  self.chain = ConversationalRetrievalChain.from_llm(
63
  self.llm,
64
- retriever=self.vector_store.as_retriever(search_kwargs={"k": 6}),
65
  combine_docs_chain_kwargs={"prompt": sahabat_prompt},
66
  return_source_documents=True,
67
  memory=self.memory
@@ -496,7 +496,7 @@ evaluation_dataset = [
496
  "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."
497
  },
498
  {
499
- "question": "Siapa saja pimpinan di Politeknik Negeri Padang saat ini?",
500
  "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."
501
  },
502
  {
 
61
  # Initialize RAG chain
62
  self.chain = ConversationalRetrievalChain.from_llm(
63
  self.llm,
64
+ retriever=self.vector_store.as_retriever(search_kwargs={"k": 10}),
65
  combine_docs_chain_kwargs={"prompt": sahabat_prompt},
66
  return_source_documents=True,
67
  memory=self.memory
 
496
  "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."
497
  },
498
  {
499
+ "question": "Siapa saja direktur di Politeknik Negeri Padang saat ini?",
500
  "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."
501
  },
502
  {
evaluate_ragas.py ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from datasets import Dataset
2
+ import json
3
+ from datetime import datetime
4
+ from ragas.metrics import (
5
+ answer_relevancy,
6
+ context_precision,
7
+ context_recall,
8
+ ContextRelevance,
9
+ faithfulness
10
+ )
11
+ from ragas import evaluate
12
+ from app.document_processor import load_vector_store_from_supabase
13
+ from app.db import supabase
14
+ from app.prompts import sahabat_prompt
15
+ from langchain.chains import ConversationalRetrievalChain
16
+ from langchain.memory import ConversationBufferMemory
17
+ from langchain_community.llms import Replicate
18
+ import os
19
+
20
+ # Load vector store
21
+ BUCKET_NAME = "pnp-bot-storage-archive"
22
+ VECTOR_STORE_PREFIX = "vector_store"
23
+ vector_store = load_vector_store_from_supabase(supabase, BUCKET_NAME, VECTOR_STORE_PREFIX)
24
+
25
+ # RAG Chain
26
+ def create_rag_chain():
27
+ llm = Replicate(
28
+ model="fauziisyrinapridal/sahabat-ai-v1:afb9fa89fe786362f619fd4fef34bd1f7a4a4da23073d8a6fbf54dcbe458f216",
29
+ model_kwargs={"temperature": 0.1, "top_p": 0.9, "max_new_tokens": 10000},
30
+ replicate_api_token=os.getenv("REPLICATE_API_TOKEN"),
31
+ )
32
+ memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True, output_key='answer')
33
+ chain = ConversationalRetrievalChain.from_llm(
34
+ llm,
35
+ retriever=vector_store.as_retriever(search_kwargs={"k": 10}),
36
+ combine_docs_chain_kwargs={"prompt": sahabat_prompt},
37
+ return_source_documents=True,
38
+ memory=memory
39
+ )
40
+ return chain
41
+
42
+ chain = create_rag_chain()
43
+
44
+ # PNP Evaluation Dataset
45
+ evaluation_dataset = [
46
+ {
47
+ "question": "Bagaimana sistem pendidikan yang diterapkan di Politeknik Negeri Padang?",
48
+ "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."
49
+ },
50
+ {
51
+ "question": "Apa saja mata kuliah yang terdapat dalam kurikulum pendidikan Politeknik Negeri Padang?",
52
+ "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)"
53
+ },
54
+ {
55
+ "question": "Bagaimana Politeknik Negeri Padang mendukung misi tridharma perguruan tinggi?",
56
+ "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."
57
+ },
58
+ {
59
+ "question": "Bagaimana Politeknik Negeri Padang menyediakan akses internet bagi mahasiswa?",
60
+ "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."
61
+ },
62
+ {
63
+ "question": "Apa saja contoh kerjasama Politeknik Negeri Padang dengan industri?",
64
+ "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."
65
+ },
66
+ {
67
+ "question": "Bagaimana Politeknik Negeri Padang membantu mahasiswa dalam bidang prestasi dan ekonomi?",
68
+ "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."
69
+ },
70
+ {
71
+ "question": "Bagaimana status akreditasi program studi di Politeknik Negeri Padang?",
72
+ "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."
73
+ },
74
+ {
75
+ "question": "Bagaimana proses penerimaan mahasiswa baru di Politeknik Negeri Padang?",
76
+ "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."
77
+ },
78
+ {
79
+ "question": "Apa bentuk kerjasama yang dilakukan Politeknik Negeri Padang?",
80
+ "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."
81
+ },
82
+ {
83
+ "question": "Siapa saja direktur di Politeknik Negeri Padang saat ini?",
84
+ "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."
85
+ },
86
+ {
87
+ "question": "Bagaimana sejarah singkat berdirinya Politeknik Negeri Padang?",
88
+ "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."
89
+ }
90
+ ]
91
+
92
+ # Format Ragas
93
+ ragas_data = {
94
+ "question": [],
95
+ "answer": [],
96
+ "contexts": [],
97
+ "ground_truth": []
98
+ }
99
+
100
+ for item in evaluation_dataset:
101
+ result = chain({"question": item["question"]})
102
+ documents = result.get("source_documents", [])
103
+ doc_texts = [doc.page_content for doc in documents]
104
+
105
+ ragas_data["question"].append(item["question"])
106
+ ragas_data["answer"].append(result["answer"])
107
+ ragas_data["contexts"].append(doc_texts)
108
+ ragas_data["ground_truth"].append(item["ground_truth"])
109
+
110
+ # Buat dataset HuggingFace
111
+ dataset = Dataset.from_dict(ragas_data)
112
+
113
+ # Jalankan evaluasi
114
+ result = evaluate(
115
+ dataset=dataset,
116
+ metrics=[
117
+ answer_relevancy,
118
+ context_precision,
119
+ context_recall,
120
+ ContextRelevance,
121
+ faithfulness
122
+ ]
123
+ )
124
+
125
+ print(result)
126
+ # Simpan hasil evaluasi ke file JSON
127
+ output_file = f"ragas_eval_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
128
+
129
+ with open(output_file, "w", encoding="utf-8") as f:
130
+ json.dump(result, f, indent=2, ensure_ascii=False)
131
+
132
+ print(f"Hasil evaluasi disimpan ke {output_file}")