FAQ Management — Fast Answers via Dify Annotation
Purpose
This page explains how to manage HUPH's FAQ (Frequently Asked Questions) — questions that come up often with curated baseline answers. FAQs respond instantly (~300 ms) without calling an LLM, so users get much faster replies for common questions. Intended for counselors and marketing staff curating chatbot content.
Prerequisites
- Logged in as counselor/marketing/admin
- Understand the difference between FAQ (exact-match curated) and Knowledge Base (semantic search) — explained below
FAQ vs Knowledge Base
| Aspect | FAQ | Knowledge Base |
|---|---|---|
| Matching | Exact / fuzzy match on question | Semantic search with embeddings |
| Speed | ~300 ms (no LLM call) | ~6 seconds (full LLM pipeline) |
| Who edits | Counselor/marketing (manual curation) | Crawler + doc upload |
| Data source | faq_local table → auto-sync to Dify Annotation |
Milvus vector DB (via Dify) |
| Best for | Common repeated questions (fees, schedule, location) | Specific questions that need reasoning |
If the question is frequent and the answer is consistent — make it a FAQ. If the question varies and needs contextual reasoning — let the KB handle it.
Steps
1. Open FAQ Management
Click Knowledge base → FAQ in the sidebar (URL: /knowledge/faq).
You will see the existing FAQ list (101 FAQ items saat ini aktif).
┌──────────────────────────────────────────────┐
│ FAQ Management [+ Add] │
│ │
│ [x] How much is medical school 2026? │
│ IDR ... per semester + form ... │
│ [edit] [toggle on/off] [delete] │
│ │
│ [x] Application schedule? │
│ Wave 1 Oct–Dec, Wave 2 Jan–Mar ... │
│ [edit] [toggle on/off] [delete] │
│ │
│ [ ] Merit scholarship (disabled) │
│ ... │
└──────────────────────────────────────────────┘
The left checkbox indicates active status — unchecked (disabled) FAQs are not used by Dify Annotation.
2. Add a new FAQ from scratch
Click + Add, fill in:
- Question — the canonical form (e.g. "How much is medical school tuition?")
- Alternative questions (optional) — wording variations that should match the same answer
- Answer — full reply, simple markdown allowed
Click Save. FAQ otomatis sync ke Dify Annotation dalam 5 detik (debounced auto-sync).
Annotation Reply
FAQ menggunakan Dify Annotation Reply dengan threshold 0.7 (skor kemiripan semantik). Pertanyaan dengan skor di atas 0.7 langsung dijawab dari FAQ tanpa perlu AI. Semakin banyak FAQ yang berkualitas, semakin cepat dan akurat respon bot.
3. Promote a FAQ from a correction
When you've already given a correction in the Inbox (clicked 👎 → typed the correct answer), you can promote that correction to a permanent FAQ. From the correction panel click Promote to FAQ — the question is taken from the original user message, the answer from your correction. Review once, edit if needed, Save.
4. Toggle on/off
Sometimes a FAQ needs to be temporarily disabled (outdated fee, closed intake window). Instead of deleting, click the toggle off checkbox. The FAQ stays in the database but won't be used by the chatbot. Re-enable it any time.
5. Edit an existing FAQ
Click edit on the FAQ row. Change the question/answer, Save. Dify sync is automatic.
6. Check Dify sync
After add/edit/toggle, syncing to Dify usually takes ~2–5 seconds. Sync status is shown in the right column (green ✓ = synced, yellow ⚠ = pending, red ✗ = failed).
Example scenarios
User asks about the application form fee per program. Previously Aria answered via KB with ~6-second latency. The counselor creates a new FAQ with question "application form fee" and answer showing a price table per program. After sync, every time a user asks about the form fee → Dify Annotation answers in ~300 ms.
Toggle off an expired scholarship FAQ. The Wave 1 scholarship promo has closed. The counselor toggles off the "Wave 1 2026 scholarship" FAQ, creates a new one for Wave 2. The old entry stays in the database for reference but is no longer used.
Troubleshooting
FAQ doesn't match despite similar wording. Symptom: the user asks "what's the price of medical school" but Aria answers via the full LLM instead of the FAQ. Cause: Dify Annotation matching is fairly strict; wording variants can miss. Fix: add Alternative questions to the relevant FAQ ("tuition price", "school fee", "tuition fee" etc.). Edit → Save → retry.
FAQ doesn't sync to Dify — status ⚠ or ✗. Symptom: a new FAQ shows sync stuck. Cause: Dify API down, network issue, or API key expired. Fix: try re-edit + save (force re-sync). If still failing, contact dev team to check the Dify stack health (Dify can OOM under tight memory limits — bumped as of April 2026 but may recur).
Duplicate FAQ with similar questions. Symptom: two entries for "medical school tuition" with different answers. Cause: two counselors creating at once without coordination. Fix: review together, delete the wrong one, ensure the correct one is saved and toggled on.
FAQ Governance — Source Grounding & Cross-Contamination Rules
Aturan baku 2026-04-25 (setelah audit FAQ + uji coba Dify):
1. Setiap FAQ wajib punya source URL resmi
Tidak boleh halusinasi. Setiap FAQ harus di-back oleh URL Tier 1
(uph.edu, one.uph.edu, usm.uph.edu, apply.uph.edu) atau Tier 2
(kompas.com, danacita.co.id, residences.uph.edu) ketika UPH tidak
mempublikasikan fakta tersebut. Form Add FAQ di /knowledge/faq
sudah memvalidasi URL + memberi badge tier.
2. Topic-noun rule
Setiap pertanyaan FAQ harus mengandung topic noun spesifik — bukan sekadar "UPH" atau kata generic.
| ❌ Generic (akan cross-contaminate) | ✅ Topic-noun spesifik |
|---|---|
| Apa itu UPH? | Apa itu Universitas Pelita Harapan (UPH)? |
| Info session itu apa? | Apa itu Info Session UPH dan apa keuntungannya? |
| Biaya kuliah berapa? | Berapa total biaya kuliah Fakultas Kedokteran UPH sampai lulus? |
| Bisa daftar ga? | Saya lulusan Paket C, apa syarat daftar UPH? |
Alasan: Dify Annotation match by similarity score (threshold 0.7). Pertanyaan generic bisa hijack queries yang seharusnya match FAQ lain. Contoh real: "Apa itu UPH?" pernah salah-match ke FAQ "Info session UPH itu apa?" karena keyword overlap.
3. Workflow review 3-status
Setiap FAQ punya review_status:
- needs_review (default) — FAQ baru ditambahkan / belum dikonfirmasi admin / pernah di-edit setelah verified
- verified — admin sudah konfirmasi answer match dengan source_url. Wajib punya source_url terisi.
- outdated — admin tahu source content sudah berubah, tapi FAQ belum di-update
Edit pertanyaan/jawaban → otomatis reset ke needs_review
(content berubah, perlu re-verify).
4. Trigger untuk tambah FAQ baru (pre-GTM)
1 observed misfire di conversation log = trigger. Bukan N misfire — pada volume saat ini (5 conv/30d) N tidak akan pernah tercapai sebelum GTM.
Engineer (bukan operator) yang scan log misfire → ambil sumber resmi UPH → tambah FAQ → curl test → done. Operator hanya verify content kalau ada perubahan biaya/jadwal.
5. Authority tier hierarchy
- Tier 1 (write-authoritative): uph.edu, one.uph.edu, usm.uph.edu, apply.uph.edu. Selalu menang. Konflik = Tier 1 wins.
- Tier 2 (read-supplementary): kompas.com (cross-cited tuition), danacita.co.id (financing partner), residences.uph.edu (asrama sub-domain). Boleh untuk fakta yang Tier 1 tidak publish. TIDAK PERNAH override Tier 1.
- Tier ∅ (silence): kalau bot harus jawab tapi tidak ada Tier 1/2 backing → partial answer dengan disclaimer "perlu konfirmasi tim admisi" + escalate. JANGAN fabrikasi.
6. FAQ vs KB-crawl — kapan duplikat OK
Pertanyaan yang sering muncul: konten yang saya tambah ke FAQ
seringkali sudah ada di KB-crawl (uph.edu/about, uph.edu/program,
dll). Apakah ini redundant?
Jawaban: Sebagian iya. FAQ Annotation dan KB-crawl memang dapat overlap secara konten. Tapi mereka memainkan peran berbeda:
| Approach | Speed | Use case |
|---|---|---|
| FAQ Annotation | ~250ms (fast-path) | Single fact, dominant question form, content stabil per intake, atau bot mis-generate dari KB |
| KB-crawl retrieval | ~7s | Broad context, multi-aspect, content sering update via re-crawl |
Kapan tambah FAQ walau konten ada di KB-crawl:
- Pertanyaan sering ditanya (high frequency) — fast-path 30x lebih cepat ($0 vs $0.012 per query)
- Konten safety-critical (jangan misleading prospect, mis. biaya spesifik) — FAQ deterministic vs LLM probabilistic
- Bot terbukti mis-generate dari KB-crawl untuk pertanyaan ini (lihat eval results)
Kapan cukup andalkan KB-crawl saja:
- Konten broad/multi-aspect — LLM lebih baik narasi daripada FAQ static
- Konten stabil dan jarang ditanya
- Bot konsisten benar untuk variasi pertanyaan saat eval
Rule of thumb: 1 misfire di production atau eval = trigger tambah FAQ. 0 misfire + low frequency = cukup KB-crawl.
7. Quarterly review cycle
Jadwal review FAQ:
- Januari — sebelum intake semester ganjil
- Juli — sebelum intake semester genap
Filter /knowledge/faq?review=needs_review di admin UI →
verifikasi setiap FAQ → mark verified atau outdated.
See also
- Inbox — promote a correction to a FAQ
- Knowledge base — how FAQ differs from KB and when to use each
- Troubleshooting — more common issues