Prompt-Builder / README.md
ArielJoe's picture
docs: update README.md
29c3929
|
Raw
History Blame Contribute Delete
13.7 kB
metadata
title: Prompt Builder
emoji: 🧠
colorFrom: green
colorTo: blue
sdk: docker
app_port: 7860
pinned: false
license: mit
short_description: Indonesian prompt builder with real-time NLP detectors

Prompt Builder

Prompt Builder adalah web app berbasis Bahasa Indonesia untuk membantu pengguna menyusun prompt AI yang efektif, bersih, dan bertanggung jawab. Setiap field prompt dianalisis secara real-time oleh sembilan detektor NLP sebelum prompt dikirimkan ke model AI.

Fitur Utama

  • 9 field prompt terstruktur: Task, Context, References, Role, Audience, Tone, Constraints, Output Format, dan Example.
  • 9 detektor NLP: PII, Word Quality, Konten Berisiko, NER, Profanity, Filler, Special Char, Syntax, dan Field-Fit.
  • Fokus Bahasa Indonesia, dengan dukungan lintas bahasa pada PII, NER, dan Profanity (identifier, entitas, dan kata kasar berlaku untuk teks Inggris juga). Teks yang terdeteksi Inggris hanya diproses ketiga detektor itu; enam detektor lain Indonesia-only.
  • Lexicon dipisah di resources/lexicons/ agar dapat diperbarui tanpa mengubah kode detektor.
  • Highlight inline untuk kata atau frasa bermasalah.
  • Saran perbaikan otomatis (replace) untuk PII, slang, alay, dan typo.
  • Backend Python sederhana berbasis stdlib http.server — tanpa framework web.
  • Frontend statis berbasis HTML dan Tailwind CSS — tanpa SPA framework.
  • Hot-reload detektor saat file berubah; auto-restart proses jika file inti pipeline berubah.

Arsitektur

web/index.html
  |
  | POST /api/evaluate
  v
src/core/pipeline_server.py
  |
  +-- pii            (NIK, NPWP, email, HP, ... + SSN_US, NIN_UK, IBAN, MAC)   [lintas bahasa]
  +-- word_quality   (slang, alay, l33tspeak, typo)
  +-- risky_content  (injection, harmful, academic dishonesty, sensitive topic)
  +-- ner            (transformer NER + rule-based booster Indonesia + entitas Inggris) [lintas bahasa]
  +-- profanity      (lexicon kata kasar Indonesia + Inggris)                  [lintas bahasa]
  +-- filler         (sapaan, basa-basi, referensi samar)
  +-- special_char   (zero-width, bidi, Unicode tag, homoglyph, full-width, repeated punct)
  +-- syntax         (urutan kata janggal via perplexity IndoBERT)
  +-- field_fit      (deteksi salah field: persona di Task + embedding lintas-field)

Routing bahasa: teks yang terdeteksi Inggris hanya melewati pii, ner, dan
profanity; enam detektor lain Indonesia-only dan dilewati.

Semua detektor dimuat saat server start dan digunakan ulang untuk setiap request.

Struktur Folder

prompt-builder/
  src/
    core/
      pipeline_server.py    # orchestrator utama
      language.py           # deteksi bahasa via wordfreq (id/en/unknown)
      lexicons.py           # loader lexicon terpusat
      config.py             # konfigurasi global (mode produksi, ambang ML)
    pii/
      pii_detector.py
      pii_server.py
    word_quality/
      word_quality_detector.py
      word_quality_server.py
    risky_content/
      risky_content_detector.py
      risky_content_server.py
    profanity/
      profanity_detector.py
      profanity_server.py
    filler/
      filler_detector.py
      filler_server.py
    special_char/
      special_char_detector.py
      special_char_server.py
    ner/
      ner_detector.py
      ner_server.py
    syntax/
      syntax_detector.py
      syntax_server.py
    field_fit/
      field_fit_detector.py
      field_fit_server.py
    thesaurus/
      thesaurus.py
  web/
    index.html
    *-test.html
  resources/
    lexicons/
      language/
      word_quality/
      profanity/       # Indonesia (high/medium) + Inggris (high_en/medium_en)
      ner/
      special_char/    # homoglyph, smart-quote, pesan alasan
      field_fit/       # prototipe & label field (untuk ML embedding)
  scripts/
    import_lexicons.py
    audit_detectors.py
  tests/
  cache/        # cache lokal (gitignored): SymSpell, KBBI, tesaurus, model ML
  pyproject.toml
  package.json
  tailwind.config.js
  Dockerfile

Instalasi

Prasyarat

  • Python 3.10+
  • Node.js (hanya untuk build Tailwind CSS)

Clone Repository

git clone https://github.com/ArielJoe/Prompt-Builder.git
cd Prompt-Builder

Install Dependensi Python

Minimal untuk NLP ringan (tanpa model ML):

pip install -e ".[nlp]"

Lengkap dengan model ML (NER, Syntax, Field-Fit, plus lapis opsional Word Quality dan Profanity):

pip install -e ".[full]"

Development tools:

pip install -e ".[dev]"

Model NER, Syntax Checker, dan Field-Fit akan diunduh otomatis dari HuggingFace Hub saat pertama kali digunakan.

Cara Menjalankan

Pipeline utama (dengan semua detektor):

python src/core/pipeline_server.py

Mode cepat — tanpa model ML berat (semua model berat dinonaktifkan):

python src/core/pipeline_server.py --fast

Tanpa lapis ML ringan (Word Quality & Profanity) saja:

python src/core/pipeline_server.py --no-resp-ml

Port dan host custom:

python src/core/pipeline_server.py --port 8080 --host 0.0.0.0

Setelah server berjalan, buka http://127.0.0.1:8000 di browser.

Saat development, server otomatis memuat ulang perubahan detektor. Jika file inti pipeline (pipeline_server.py, language.py, lexicons.py) berubah, proses akan restart sendiri dengan argumen yang sama. Matikan dengan --no-auto-reload jika diperlukan.

Deploy ke Hugging Face Spaces

Space ini dikonfigurasi sebagai Docker Space (port 7860). Dockerfile menjalankan pipeline:

python3 src/core/pipeline_server.py --host 0.0.0.0 --port ${PORT:-7860} ${PIPELINE_FLAGS}

PORT dan PIPELINE_FLAGS dapat diatur lewat Settings > Variables pada Space tanpa mengubah Dockerfile. PIPELINE_FLAGS kosong secara default sehingga pipeline penuh (semua detektor, termasuk model ML) yang berjalan. Untuk Free CPU Space yang terbatas RAM-nya, set PIPELINE_FLAGS=--fast agar model transformer besar tidak dimuat.

--fast setara dengan --no-resp-ml --no-ner-ml --no-syntax-ml --no-fieldfit-ml.

Untuk deployment publik, set environment variable PROMPT_BUILDER_ENV=production. Pada mode produksi: auto-reload dimatikan, sub-server halaman test tidak dijalankan, dan header CORS tidak dikirim karena frontend disajikan satu origin dengan backend.

Privasi Data

Prompt yang dimasukkan hanya diproses di memori selama evaluasi berlangsung dan tidak disimpan ke penyimpanan permanen, basis data, atau log. Server tidak menulis isi prompt ke berkas. Meski demikian, pengguna tetap disarankan tidak memasukkan data pribadi yang sebenarnya, dan detektor PII berfungsi sebagai pengingat bila data semacam itu terdeteksi.

Push ke Space:

git remote add space https://huggingface.co/spaces/ArielJoe/Prompt-Builder
git push space main

Auto Deploy dari GitHub

Workflow .github/workflows/deploy-hf-space.yml akan push ke Hugging Face Space secara otomatis setiap ada push ke main yang mengubah file pipeline, frontend, lexicon, Dockerfile, atau dependency.

Setup sekali:

  1. Buat token di https://huggingface.co/settings/tokens dengan permission write.
  2. Di GitHub repo: Settings > Secrets and variables > Actions.
  3. Tambahkan secret: HF_TOKEN=hf_...

Server Detektor Individual

Setiap detektor memiliki server test mandiri:

python -m src.pii.pii_server
python -m src.word_quality.word_quality_server
python -m src.risky_content.risky_content_server
python -m src.profanity.profanity_server
python -m src.filler.filler_server
python -m src.special_char.special_char_server
python -m src.ner.ner_server
python -m src.syntax.syntax_server
python -m src.field_fit.field_fit_server

Halaman test tersedia di web/*-test.html.

Pengujian

Unit test fungsi murni (validator PII, normalisasi teks, skeleton konsonan):

python -m pytest tests/

Audit Detektor

Uji semua detektor dengan skenario positif, negatif, dan bypass:

python scripts/audit_detectors.py

Termasuk layer ML opsional:

python scripts/audit_detectors.py --include-ml

Audit menampilkan status kasus, label temuan, latency, serta proxy precision, recall, dan F1 per detector. Untuk rencana evaluasi etika, risiko, efisiensi komputasi, serta DOI paper rujukan, lihat docs/detector_evaluation.md.

Seed dataset untuk fine-tuning/evaluasi lanjutan tersedia di resources/evaluation/. Validasi schema dan distribusi label:

python scripts/validate_evaluation_sets.py

Tailwind CSS

npm install
npm run dev      # watch mode
npm run build    # CSS minified untuk produksi

Lexicon Resources

Folder Isi
language/ Stopwords Indonesia untuk filter entitas dan konteks.
word_quality/ Slang, alay, dan data koreksi typo Bahasa Indonesia.
profanity/ Kata kasar curated Indonesia (high/medium) + Inggris (high_en/medium_en). Tanpa whitelist — kurasi di sumber lexicon.
ner/ Nama orang, organisasi, sufiks badan usaha & akronim global, nama tempat, kata pemicu (gelar, etnis) untuk rule NER.
special_char/ Peta homoglyph, smart-quote, dan pesan alasan per kategori.
field_fit/ Prototipe contoh dan label tiap field untuk centroid embedding.

Update lexicon dari sumber online:

python scripts/import_lexicons.py --all

Import selektif:

python scripts/import_lexicons.py --slang-id
python scripts/import_lexicons.py --profanity-id
python scripts/import_lexicons.py --stopwords
python scripts/import_lexicons.py --geonames --ssa-names

API Reference

GET /api/status

{
  "ready": true,
  "detectors": {
    "pii": true,
    "word_quality": true,
    "risky_content": true,
    "ner": true,
    "profanity": true,
    "filler": true,
    "special_char": true,
    "syntax": true,
    "field_fit": true
  }
}

POST /api/evaluate

Request:

{
  "fields": {
    "task": "Jelaskan konsep fotosintesis",
    "context": "Untuk siswa kelas 7 SMP",
    "references": "Buku IPA Kurikulum Merdeka",
    "role": "Guru IPA",
    "audience": "Siswa usia 12-13 tahun"
  }
}

Response:

{
  "issues": [
    {
      "field_id": "task",
      "field_label": "Task",
      "css_class": "slang",
      "severity": "MEDIUM",
      "word": "nemenin",
      "start": 5,
      "end": 12,
      "reason": "Kata informal; padanan baku: \"menemani\".",
      "action": "replace",
      "replacement": "menemani"
    }
  ],
  "final_prompt": "Task: ...",
  "final_prompt_sections": []
}

Field issue yang dikirim hanya yang dipakai frontend. Atribut internal seperti source, issue_type, dan confidence tidak disertakan dalam respons; status detektor tersedia di GET /api/status. Temuan konten berisiko menambahkan field recommendation berisi saran reformulasi.

Severity: HIGH | MEDIUM | LOW, dikirim pada tiap issue tetapi tidak dipakai untuk mengelompokkan tampilan. Semua temuan bersifat saran dan ditampilkan sebagai satu daftar, dikelompokkan per kategori (css_class) sesuai urutan kepentingan pada frontend. Action: replace (ada saran penggantian; replacement kosong berarti hapus) atau select (hanya sorot).

Ringkasan Detektor

Detektor File Utama Fungsi
PII src/pii/pii_detector.py NIK, NPWP, BPJS, SIM, plat nomor, email, telepon, rekening, kartu kredit, IP, tanggal lahir, alamat Indonesia + identifier internasional (SSN_US, NIN_UK, IBAN, MAC, TELEPON_US). Lintas bahasa.
Word Quality src/word_quality/word_quality_detector.py Slang, alay, l33tspeak, typo — dengan saran perbaikan dan reklasifikasi kontekstual.
Konten Berisiko src/risky_content/risky_content_detector.py Prompt injection, self-harm, konten seksual eksplisit, diskriminasi, academic dishonesty, framing berbahaya, sensitive topic.
NER src/ner/ner_detector.py Named entity recognition via transformer + rule-based booster Indonesia + entitas Inggris (gelar, sufiks badan usaha, akronim global). Lintas bahasa.
Profanity src/profanity/profanity_detector.py Kata kasar berbasis leksikon Indonesia + Inggris + classifier toksisitas opsional. Lintas bahasa.
Filler src/filler/filler_detector.py Sapaan ke AI, basa-basi, ucapan terima kasih, permintaan maaf, referensi samar.
Special Char src/special_char/special_char_detector.py Zero-width (termasuk BOM, word joiner, soft hyphen), kontrol arah teks (bidi), Unicode tag, homoglyph, control char, non-breaking space, full-width ASCII, repeated punct, spasi berlebih.
Syntax src/syntax/syntax_detector.py Deteksi urutan kata janggal via pseudo-log-likelihood IndoBERT.
Field-Fit src/field_fit/field_fit_detector.py Deteksi salah field: aturan persona di Task + ML embedding kemiripan lintas-field (sentence-transformers).

Field Prompt

Field ID Wajib
Task task Ya
Context context Ya
References references Ya
Role role Tidak
Audience audience Tidak
Tone tone Tidak
Constraints constraints Tidak
Output Format outputFormat Tidak
Example example Tidak

Field wajib yang kosong dilaporkan sebagai issue MISSING dengan severity HIGH.

Dependensi

Grup Isi
nlp wordfreq, symspellpy
ml transformers, torch, sentencepiece, accelerate, protobuf, huggingface-hub
full nlp + ml
dev pytest, pytest-cov, ruff

Node.js: tailwindcss (build CSS frontend).

Lisensi

Lihat LICENSE.


title: Prompt Builder
emoji: 🧩
colorFrom: green
colorTo: blue
sdk: docker
app_port: 7860
pinned: false
license: mit