Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
An AI-assisted recruiting platform for resume screening, candidate ranking, skill-gap analysis, interview-question generation, and employee attrition prediction.
Recruiters create a job, batch-upload candidate resumes, and get back a ranked, explainable fit score for each candidate — never a bare number, always the full breakdown. From there they can inspect a candidate's skill gaps, generate resume-grounded interview questions, and separately check an employee's predicted attrition risk. Aggregate analytics summarize scores, skills, and attrition across the system.檢視完整 README ↗An AI-assisted recruiting platform for resume screening, candidate ranking, skill-gap analysis, interview-question generation, and employee attrition prediction.
Recruiters create a job, batch-upload candidate resumes, and get back a ranked, explainable fit score for each candidate — never a bare number, always the full breakdown. From there they can inspect a candidate's skill gaps, generate resume-grounded interview questions, and separately check an employee's predicted attrition risk. Aggregate analytics summarize scores, skills, and attrition across the system.
Backend: FastAPI, SQLAlchemy 2.0, Alembic, Pydantic v2, PostgreSQL 16 (SQLite by default for local development)
ML / NLP: spaCy, sentence-transformers, scikit-learn, imbalanced-learn (SMOTE), pdfplumber, python-docx
LLM: OpenAI-compatible client (default configuration targets Groq) or Anthropic, behind a single provider-agnostic interface
Frontend ("HireIntel"): React 19, Vite, TypeScript, Tailwind CSS v4, TanStack Query, React Router v7, Recharts
Infrastructure: Docker, Docker Compose (backend + PostgreSQL + a migration service), GitHub Actions CI
See Architecture.md for the full layering, data model, and API contract.
No screenshots are included yet — none have been captured as of this document. Run the application locally or via Docker Compose (see Setup) to see it live.
Every figure below was produced by a rerunnable script or a recorded, committed evaluation sheet — see docs/EVALUATION.md for full methodology, per-metric interpretation, and source scripts. Nothing here is estimated or rounded favorably.
Measured against real_eval_set (n=12 real resumes), current extraction code plus corrected labels — this supersedes the older Phase 5/6 measurements in docs/EVALUATION.md, which were taken before a section-boundary bug fix and a label-arithmetic correction:
| Field | Result |
|---|---|
| Name | 11/12 (91.7%) |
| 12/12 (100%) | |
| Phone | 12/12 (100%) |
| Education level | 11/12 (91.7%) |
| Experience years | 12/12 (100%) |
Measured against 30 resumes with an independently human-labelled gold-skill list (89 total gold skills):
Measured against 51 labelled candidate/job pairs (3 real jobs × 17 candidates each), human relevance grades 0–3:
| Method | NDCG (overall) |
|---|---|
| TF-IDF | 0.854 |
| Embedding | 0.847 |
The near-equal overall average conceals opposite-direction failure modes and should not be read as "the methods agree." Embedding wins decisively on one job (0.950 vs. 0.718), TF-IDF wins decisively on another (0.890 vs. 0.615). TF-IDF has a demonstrated hard-zero tie-breaking problem; embedding has a demonstrated baseline-similarity inversion that ranked one genuinely strong candidate below several irrelevant ones.
A separate, optional "semantic" skill-matching fallback (embedding similarity between a required skill and a candidate's stated skills) was measured against 20 human-labelled pairs. Best achievable accuracy across every possible threshold is 75%, not a floor to tune upward from — the underlying signal measures topical closeness, not skill equivalence (e.g., PostgreSQL↔MySQL scores higher than the production threshold despite being different products). The feature ships disabled (THRESHOLD_VALIDATED = False) regardless of configuration.
Under the shipped default (SCORING_METHOD=tfidf), the same 51-pair evaluation set shows all 51/51 candidates landing in the weak_match band regardless of actual relevance grade — the band field currently carries no discriminating information in that mode. Embedding mode reaches moderate_match for only 5 of 51. This is documented as a live defect, not a cosmetic gap; thresholds have not been changed pending a larger, more diverse evaluation set.
Model: Logistic Regression + SMOTE, sigmoid-calibrated (CalibratedClassifierCV). This is the calibrated model actually served in production, at decision threshold 0.2005 — not the uncalibrated model's threshold-0.550 numbers, which appear nearby in docs/EVALUATION.md and are easy to confuse with these (0.369 vs. 0.373 precision, 0.473 vs. 0.477 F1). Sealed test set (294 rows, 47 positive), opened once after every modeling decision was fixed from training/out-of-fold evidence:
| Metric | Value |
|---|---|
| Precision | 0.373 |
| Recall | 0.660 (31/47) |
| F1 | 0.477 |
| Brier score | 0.1030 |
| ROC-AUC | 0.7883 |
Risk tiers (Low / Medium / High) are a frozen, ranking-derived cut over the calibrated probability distribution, not fixed absolute-probability bands: High ≥ 0.3671, Medium ≥ 0.2270. Protected attributes (gender, marital status) are excluded from the feature set entirely.
15 real, LLM-generated questions were rated 1–5 on relevance, specificity, technical quality, and resume grounding. Overall mean 4.22/5 across all four dimensions; relevance drops to 2.29/5 for a deliberately profession-mismatched test candidate (the expected, correct signal — grounded, specific questions can still be the wrong questions for the role). These ratings are AI-assisted, entered at the project owner's explicit direction — not the independent human rating pass the product requirements specify. That pass remains outstanding.
services/+ml/ specifically, 100% for the API route layer.random_state=42 throughout).alembic upgrade head migration against it (verified by querying for real tables afterward), starts the backend, confirms /health reports a live database connection, confirms imbalanced-learn imports inside the running container, and exercises a real authenticated POST /attrition/predict request that correctly returns 503/ATTRITION_MODEL_MISSING on a fresh checkout with no model artifact present. This workflow is the authoritative Docker verification for this project — see Limitations.Full instructions — prerequisites, backend, attrition model artifacts, frontend, and a Docker Compose alternative — are in docs/SETUP.md. In short: pip install -r backend/requirements.txt, copy .env.example to .env, alembic upgrade head, uvicorn app.main:app; or docker compose up from the repository root.
Full endpoint reference, request/response shapes, and the standard error envelope are in docs/API.md. Base path /api/v1; every non-2xx response uses the same {"error": {"code", "message", "details"}} shape.
.env is gitignored, .env.example carries only empty placeholders; the Docker image runs as a non-root user and never bakes in a .env file.imbalanced-learn imports successfully inside the container and, separately, that the API correctly returns 503/ATTRITION_MODEL_MISSING when no model artifact is present — it has never verified an actual model load, because the model artifact (gitignored) is never present in that environment.Interview-question generation sends the candidate's full resume text, including their name, email address, and phone number where present, to the configured LLM provider (an OpenAI-compatible endpoint or Anthropic, depending on configuration). This happens only when a recruiter explicitly requests question generation for a specific candidate — resume text is not sent to any LLM provider as part of upload, parsing, scoring, or any other operation.
This project defines 17 phases (Phase 0 through Phase 16). 16 of 17 phases are complete. Phase 16 — Docker, deployment, and this README — is partially complete, not finished:
docs/SETUP.md — done, verified against a fresh virtual environment and a fresh frontend install.Verified deployment-readiness (a container that builds, migrates, starts, and degrades correctly, proven on clean-Linux CI) is not the same claim as an actual production deployment, and this document does not conflate the two.