Machine Learning Service Road2Work.id adalah service berbasis FastAPI yang menangani pemrosesan CV, speech-to-text, pembuatan pertanyaan interview adaptif, evaluasi jawaban interview, dan readiness insight.
Service ini dipanggil oleh backend, bukan langsung oleh frontend.
- Python
- FastAPI
- Uvicorn
- Pydantic
- OpenAI Responses API
- faster-whisper
- scikit-learn
- TensorFlow / Keras
- pandas
- numpy
- python-dotenv
- PyMuPDF / PDF Text Extraction
machine-learning/
βββ main.py # FastAPI entry point
βββ genai_helper.py # Helper GenAI untuk pertanyaan, evaluasi, feedback
βββ readiness_engine.py # Readiness scoring dan evaluasi jawaban
βββ nlp_utils.py # NLP utility untuk ekstraksi profil dan skill
βββ stt_utils.py # Speech-to-text utility
βββ model_builder.py # Training/building model utility
βββ data/ # Data kecil yang dibutuhkan service
βββ models/ # Model artifact lokal, sebagian di-ignore jika besar
βββ scripts/ # Script training/evaluation
βββ requirements.txt # Dependency Python
βββ .env.example # Template environment
βββ README_AI_ENGINEER.mdService ini menangani beberapa proses utama pada Road2Work.id:
- CV extraction
- Short profile extraction
- Role fit context generation
- Adaptive interview question generation
- Speech-to-text transcription
- Answer quality evaluation
- Clarification decision
- Evidence ladder evaluation
- Interview result generation
- Readiness scoring support
Frontend tidak memanggil Machine Learning service secara langsung.
Frontend
β Backend API
β Machine Learning Service
β Backend API
β FrontendUpload CV
β Backend menerima file
β Backend mengirim file ke ML service
β ML service mengekstrak profil
β Backend menyimpan hasil ke database
β Frontend menampilkan profile reviewUser menjawab dengan suara
β Frontend mengirim audio ke Backend
β Backend mengirim audio ke ML service
β ML service melakukan STT dan evaluasi jawaban
β Backend menyimpan result
β Frontend menampilkan next question atau resultPastikan sudah terinstall:
- Python versi 3.10 atau lebih baru
- pip
- virtualenv
- FFmpeg untuk audio/STT
- Backend Road2Work.id sudah berjalan jika ingin mencoba flow penuh
Cek FFmpeg:
ffmpeg -versionJika belum tersedia, install FFmpeg terlebih dahulu sesuai sistem operasi yang digunakan.
Masuk ke folder machine-learning:
cd machine-learningBuat virtual environment:
python -m venv .venvAktifkan virtual environment.
.venv\Scripts\Activate.ps1.venv\Scripts\activate.batsource .venv/bin/activateInstall dependency:
pip install -r requirements.txtBuat file .env dari .env.example:
cp .env.example .envContoh konfigurasi .env local:
OPENAI_API_KEY=isi_openai_api_key
OPENAI_MODEL=gpt-5.4-mini
OPENAI_MAX_OUTPUT_TOKENS=2048
GENAI_MAX_RETRIES=3
ROAD2WORK_DATA_DIR=data
STT_MODEL_SIZE=small
STT_LANGUAGE=idJalankan service:
uvicorn main:app --host 127.0.0.1 --port 8000 --reloadBuka dokumentasi API:
http://127.0.0.1:8000/docs| Variable | Keterangan |
|---|---|
OPENAI_API_KEY |
API key untuk OpenAI Responses API |
OPENAI_MODEL |
Model yang dipakai untuk pertanyaan dan evaluasi |
OPENAI_MAX_OUTPUT_TOKENS |
Batas maksimal output token |
GENAI_MAX_RETRIES |
Jumlah retry jika request AI gagal sementara |
ROAD2WORK_DATA_DIR |
Path folder data Machine Learning |
STT_MODEL_SIZE |
Ukuran model faster-whisper |
STT_LANGUAGE |
Bahasa transkripsi, default id |
Contoh local:
ROAD2WORK_DATA_DIR=dataContoh jika data diarahkan ke folder tertentu:
ROAD2WORK_DATA_DIR=E:\Kuliah\DBS Dicoding\2026\Capstone Project\Code\Final Apps\machine-learning\dataGET /Digunakan untuk memastikan service berjalan.
POST /v1/context/extract-cvInput:
- Multipart file CV
Output:
- Professional summary
- Skills
- Tools
- Experience signals
- Achievements
- Evidence items
POST /v1/context/extract-short-profileInput:
- Profile summary
- Target role
- Skill/tools manual
Output:
- Structured profile context
POST /v1/stt/transcribeInput:
- Audio file
Output:
- Transcript
- Confidence / metadata jika tersedia
POST /v1/interview/generate-questionInput:
- Target role
- Profile context
- Interview history
- Current state
- Improvement focus
Output:
- Adaptive question
- Question type
- Competency focus
POST /v1/interview/evaluate-answerInput:
- Question
- Answer transcript
- Target role
- Profile context
- Previous answers
Output:
- Score breakdown
- Final score
- Evidence level
- Weakness
- Clarification decision
- Stronger answer
- Next recommendation
Service mendukung flow interview berikut:
IDLE
β ASKING
β LISTENING
β THINKING
β CLARIFYING / ASKING
β COMPLETEDFungsi ML/AI terutama aktif pada state:
THINKINGPada state ini sistem akan:
- Memproses transcript
- Mengevaluasi jawaban
- Menentukan apakah perlu klarifikasi
- Menyiapkan pertanyaan berikutnya
- Menyusun feedback dan result
Road2Work.id menggunakan konsep Evidence Ladder untuk menilai kekuatan jawaban user saat interview.
| Level | Nama | Contoh |
|---|---|---|
| 1 | Claim | βSaya bisa membuat dashboard.β |
| 2 | Skill | βSaya menggunakan Excel dan Python.β |
| 3 | Context | βSaya membuat dashboard untuk data penjualan.β |
| 4 | Impact | βDashboard membantu tim memahami performa produk.β |
| 5 | Measurable Result | βWaktu pembuatan laporan berkurang dari 2 jam menjadi 30 menit.β |
Semakin tinggi evidence level, semakin kuat jawaban interview user.
Evaluasi jawaban menggunakan beberapa dimensi:
- Role relevance
- STAR structure
- Evidence specificity
- Technical accuracy
- Communication clarity
- Self awareness
Bobot penilaian utama:
| Dimensi | Bobot |
|---|---|
| Role Relevance | 25% |
| STAR Structure | 20% |
| Evidence Specificity | 20% |
| Technical Accuracy | 15% |
| Communication Clarity | 10% |
| Self Awareness | 10% |
Final score akan dinormalisasi sebelum dikirim kembali ke backend.
Speech-to-text menggunakan faster-whisper.
Rekomendasi local:
STT_MODEL_SIZE=small
STT_LANGUAGE=idJika transkripsi kurang akurat:
- Gunakan microphone yang lebih jelas
- Kurangi noise ruangan
- Gunakan model STT lebih besar jika resource cukup
- Pastikan audio dikirim dengan format yang didukung, seperti
webm,wav, ataump3
Jalankan service:
uvicorn main:app --host 127.0.0.1 --port 8000 --reloadBuka Swagger:
http://127.0.0.1:8000/docsTes endpoint berikut:
- Upload CV ke
/v1/context/extract-cv - Tes transkripsi audio ke
/v1/stt/transcribe - Tes generate question ke
/v1/interview/generate-question - Tes evaluate answer ke
/v1/interview/evaluate-answer
Backend harus mengarah ke service ini melalui environment variable:
ML_SERVICE_URL=http://localhost:8000Production:
ML_SERVICE_URL=https://your-ml-service-urlBackend akan meneruskan request dari frontend ke Machine Learning service.
Sebelum deploy, pastikan:
.envproduction sudah tersedia di serverOPENAI_API_KEYvalidROAD2WORK_DATA_DIRmengarah ke folder data yang benar- FFmpeg tersedia di environment deployment
- Dependency Python berhasil di-install
- Service dapat diakses oleh backend
Contoh command production:
uvicorn main:app --host 0.0.0.0 --port 8000Jika menggunakan process manager atau Docker, pastikan port 8000 terbuka untuk backend service.
Jangan commit file berikut:
.env
.venv/
__pycache__/
uploads/
tmp/
temp/
*.wav
*.mp3
*.m4a
*.webm
models/*.keras
models/*.h5
models/*.pb
models/*.savedmodel/Data kecil yang dibutuhkan service boleh di-commit:
data/Model besar sebaiknya disimpan di external storage atau Git LFS.
Cek file .env:
OPENAI_API_KEY=...Restart service setelah mengubah .env.
Biasanya payload request tidak sesuai schema endpoint.
Cek Swagger di:
http://127.0.0.1:8000/docsPastikan field wajib sudah dikirim.
Pastikan:
- FFmpeg sudah terinstall
- Format audio didukung
- File audio tidak kosong
- Microphone browser benar-benar aktif
Cek proses yang memakai port.
Windows PowerShell:
netstat -ano | findstr :8000Matikan proses:
taskkill /PID <PID> /FAtau jalankan di port lain:
uvicorn main:app --host 127.0.0.1 --port 8001 --reloadPastikan request ke /v1/interview/generate-question mengirim context yang lengkap:
- Target role
- Profile context
- Previous answers
- Improvement focus
- Previous questions
- Current interview state
Tanpa context tersebut, pertanyaan akan cenderung generic.
MVP Road2Work.id saat ini berfokus pada domain Information Technology.
Ekspansi domain lain dapat dilakukan dengan menambah taxonomy role, competency map, dan dataset pendukung.
Road2Work.id Capstone Project CC26-PSU050