import gradio as gr
from sentence_transformers import SentenceTransformer
import datasets
import time
import faiss
# Impor tema custom dari themes.py
from themes_2 import ClassicMinimalTheme
# Inisialisasi dataset dan model hanya sekali di Gradio
def initialize():
dataset = datasets.load_dataset('A-Roucher/english_historical_quotes', download_mode="force_redownload")['train']
all_authors = list(set(dataset['author']))
model_name = "BAAI/bge-small-en-v1.5"
encoder = SentenceTransformer(model_name)
index = faiss.read_index('index_alone.faiss')
return dataset, encoder, index, all_authors
# Fungsi untuk melakukan pencarian kutipan berdasarkan query
def search(query, dataset, encoder, index, progress=gr.Progress()):
start = time.time()
if len(query.strip()) == 0:
return "Silakan masukkan ide atau kata kunci." # Tidak ada pencarian jika query kosong
# Memulai progres dengan 0%
progress(0, desc="Memulai proses...")
# Encode query menjadi embedding
progress(0.2, desc="Proses encoding...")
query_embedding = encoder.encode([query])
time.sleep(1) # Simulasi proses lambat
# Cari kutipan yang paling mirip menggunakan faiss
progress(0.5, desc="Menemukan kutipan yang mirip...")
_, samples = index.search(query_embedding, k=10)
time.sleep(1)
quotes = dataset.select(samples[0])
result = "\n\n"
for i in progress.tqdm(range(len(quotes)), desc="Menyusun hasil..."):
time.sleep(0.25) # Simulasi penundaan saat menyusun hasil
# Menggunakan HTML untuk mengatur ukuran font pada quote dan tebal pada author
result += f"## ⭐ {quotes['author'][i]}\n> {quotes['quote'][i]}\n----\n"
# result += f"{quotes['author'][i]}
{quotes['quote'][i]}"
delay = "%.3f" % (time.time() - start)
# Proses selesai 100%
progress(1.0, desc="Selesai!")
return f"_Waktu komputasi: **{delay} detik**_{result}"
# Fungsi untuk memulai pencarian dengan progress tracking
def run_search(query):
dataset, encoder, index, _ = initialize() # Ambil state inisialisasi (dataset, encoder, index)
return search(query, dataset, encoder, index) # Mengembalikan hasil akhir sebagai string
# CSS Kustom untuk mempercantik tampilan
css = """
#header {
text-align: center;
color: #FFFFFF;
background: linear-gradient(90deg, #FF5733, #C70039);
padding: 20px;
border-radius: 10px;
}
#input-section, #output-section {
margin: 10px auto;
max-width: 700px;
background-color: #F0F0F0;
border-radius: 10px;
padding: 20px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
}
#footer {
text-align: center;
margin-top: 30px;
color: #888;
}
#submit-button {
background-color: #FF5733;
color: #FFF;
font-weight: bold;
padding: 10px;
border-radius: 10px;
cursor: pointer;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
body {
background-color: #F8F9F9;
}
.note {
background-color: #ddffdd;
border: 1px solid #ddd;
padding: 10px;
margin: 10px 0;
border-radius: 5px;
font-family: Arial, sans-serif;
}
"""
# -----------------
# Antarmuka Gradio
# -----------------
with gr.Blocks(css=css, theme=ClassicMinimalTheme()) as Apps:
# Tambahkan banner
gr.HTML("""