Update app.py
Browse files
app.py
CHANGED
|
@@ -84,11 +84,16 @@ TARGETS = {
|
|
| 84 |
USE_LLM = True
|
| 85 |
|
| 86 |
# Pilih salah satu model yang kompatibel
|
| 87 |
-
LLM_MODEL_NAME = "
|
|
|
|
| 88 |
# Alternatif lain (juga kompatibel):
|
| 89 |
# LLM_MODEL_NAME = "mistralai/Mistral-7B-Instruct-v0.2"
|
| 90 |
|
| 91 |
-
HF_TOKEN =
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
|
| 93 |
_HF_CLIENT = None
|
| 94 |
|
|
@@ -1154,21 +1159,10 @@ def generate_llm_analysis(detail_df: pd.DataFrame,
|
|
| 1154 |
kew_value: str) -> str:
|
| 1155 |
"""
|
| 1156 |
Analisis otomatis:
|
| 1157 |
-
- Jika
|
| 1158 |
-
- Jika HF_TOKEN ada tapi pemanggilan LLM gagal -> fallback ke rule-based dengan pesan error ringkas.
|
| 1159 |
"""
|
| 1160 |
|
| 1161 |
-
# MODE
|
| 1162 |
-
if not HF_TOKEN:
|
| 1163 |
-
rb = generate_rule_based_analysis(detail_df, agg_df, kab_name, kew_value)
|
| 1164 |
-
return (
|
| 1165 |
-
"ℹ️ Mode analisis berbasis LLM belum diaktifkan karena `HF_TOKEN` "
|
| 1166 |
-
"tidak ditemukan di Environment / Secrets.\n\n"
|
| 1167 |
-
"Analisis berikut menggunakan pendekatan **rule-based**.\n\n"
|
| 1168 |
-
+ rb
|
| 1169 |
-
)
|
| 1170 |
-
|
| 1171 |
-
# MODE LLM AKTIF
|
| 1172 |
context = build_context_for_llm(detail_df, agg_df, verif_df, kab_name, kew_value)
|
| 1173 |
|
| 1174 |
client = get_llm_client()
|
|
@@ -1196,8 +1190,8 @@ TULISKAN ANALISIS DALAM BAHASA INDONESIA FORMAL, DENGAN STRUKTUR:
|
|
| 1196 |
|
| 1197 |
1. Gambaran umum kondisi perpustakaan di wilayah tersebut (1 paragraf).
|
| 1198 |
2. Analisis capaian indeks: soroti kekuatan dan kelemahan utama, terutama perbedaan antar jenis perpustakaan (2 paragraf).
|
| 1199 |
-
3. Analisis risiko dan kesenjangan layanan, termasuk jika coverage perpustakaan terhadap satuan pendidikan atau wilayah administratif masih rendah (1
|
| 1200 |
-
4. Rekomendasi program dan kebijakan prioritas yang konkret untuk 3
|
| 1201 |
|
| 1202 |
PANDUAN GAYA:
|
| 1203 |
- Jangan hanya mengulang angka apa adanya, tetapi jelaskan maknanya.
|
|
@@ -1205,18 +1199,21 @@ PANDUAN GAYA:
|
|
| 1205 |
- Hindari kalimat terlalu panjang; gunakan kalimat efektif dan jelas.
|
| 1206 |
"""
|
| 1207 |
|
| 1208 |
-
prompt = f"{system_prompt}\n\n{user_prompt}"
|
| 1209 |
-
|
| 1210 |
try:
|
| 1211 |
-
|
| 1212 |
-
|
| 1213 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1214 |
temperature=0.35,
|
| 1215 |
top_p=0.9,
|
| 1216 |
-
do_sample=True,
|
| 1217 |
-
repetition_penalty=1.05,
|
| 1218 |
)
|
| 1219 |
-
|
|
|
|
| 1220 |
if not text:
|
| 1221 |
raise ValueError("Respon LLM kosong.")
|
| 1222 |
|
|
@@ -1231,6 +1228,7 @@ PANDUAN GAYA:
|
|
| 1231 |
f"{rb}"
|
| 1232 |
)
|
| 1233 |
|
|
|
|
| 1234 |
# ============================================================
|
| 1235 |
# 8. WORD REPORT (Plotly Pie + Indeks + Agregat + LLM Narrative)
|
| 1236 |
# ============================================================
|
|
@@ -1596,4 +1594,4 @@ with gr.Blocks() as demo:
|
|
| 1596 |
],
|
| 1597 |
)
|
| 1598 |
|
| 1599 |
-
demo.launch()
|
|
|
|
| 84 |
USE_LLM = True
|
| 85 |
|
| 86 |
# Pilih salah satu model yang kompatibel
|
| 87 |
+
LLM_MODEL_NAME = "meta-llama/Meta-Llama-3-8B-Instruct"
|
| 88 |
+
# LLM_MODEL_NAME = "mistralai/Mistral-7B-Instruct-v0.2"
|
| 89 |
# Alternatif lain (juga kompatibel):
|
| 90 |
# LLM_MODEL_NAME = "mistralai/Mistral-7B-Instruct-v0.2"
|
| 91 |
|
| 92 |
+
HF_TOKEN = (
|
| 93 |
+
os.getenv("HF_TOKEN")
|
| 94 |
+
or os.getenv("HUGGINGFACEHUB_API_TOKEN")
|
| 95 |
+
or os.getenv("HF_API_TOKEN")
|
| 96 |
+
)
|
| 97 |
|
| 98 |
_HF_CLIENT = None
|
| 99 |
|
|
|
|
| 1159 |
kew_value: str) -> str:
|
| 1160 |
"""
|
| 1161 |
Analisis otomatis:
|
| 1162 |
+
- Jika pemanggilan LLM gagal -> fallback ke rule-based dengan pesan error ringkas.
|
|
|
|
| 1163 |
"""
|
| 1164 |
|
| 1165 |
+
# MODE LLM AKTIF: selalu coba, token bisa dari HF_TOKEN / HUGGINGFACEHUB_API_TOKEN
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1166 |
context = build_context_for_llm(detail_df, agg_df, verif_df, kab_name, kew_value)
|
| 1167 |
|
| 1168 |
client = get_llm_client()
|
|
|
|
| 1190 |
|
| 1191 |
1. Gambaran umum kondisi perpustakaan di wilayah tersebut (1 paragraf).
|
| 1192 |
2. Analisis capaian indeks: soroti kekuatan dan kelemahan utama, terutama perbedaan antar jenis perpustakaan (2 paragraf).
|
| 1193 |
+
3. Analisis risiko dan kesenjangan layanan, termasuk jika coverage perpustakaan terhadap satuan pendidikan atau wilayah administratif masih rendah (1-2 paragraf).
|
| 1194 |
+
4. Rekomendasi program dan kebijakan prioritas yang konkret untuk 3-5 tahun ke depan. Susun dalam bentuk paragraf naratif, bukan bullet list (2 paragraf).
|
| 1195 |
|
| 1196 |
PANDUAN GAYA:
|
| 1197 |
- Jangan hanya mengulang angka apa adanya, tetapi jelaskan maknanya.
|
|
|
|
| 1199 |
- Hindari kalimat terlalu panjang; gunakan kalimat efektif dan jelas.
|
| 1200 |
"""
|
| 1201 |
|
|
|
|
|
|
|
| 1202 |
try:
|
| 1203 |
+
messages = [
|
| 1204 |
+
{"role": "system", "content": system_prompt},
|
| 1205 |
+
{"role": "user", "content": user_prompt},
|
| 1206 |
+
]
|
| 1207 |
+
|
| 1208 |
+
resp = client.chat_completion(
|
| 1209 |
+
model=LLM_MODEL_NAME,
|
| 1210 |
+
messages=messages,
|
| 1211 |
+
max_tokens=900,
|
| 1212 |
temperature=0.35,
|
| 1213 |
top_p=0.9,
|
|
|
|
|
|
|
| 1214 |
)
|
| 1215 |
+
|
| 1216 |
+
text = resp.choices[0].message.content.strip()
|
| 1217 |
if not text:
|
| 1218 |
raise ValueError("Respon LLM kosong.")
|
| 1219 |
|
|
|
|
| 1228 |
f"{rb}"
|
| 1229 |
)
|
| 1230 |
|
| 1231 |
+
|
| 1232 |
# ============================================================
|
| 1233 |
# 8. WORD REPORT (Plotly Pie + Indeks + Agregat + LLM Narrative)
|
| 1234 |
# ============================================================
|
|
|
|
| 1594 |
],
|
| 1595 |
)
|
| 1596 |
|
| 1597 |
+
demo.launch()
|