Spaces:
Running
Running
| # Redrob x Hack2Skill - India Runs : Talentry AI submission | |
| This folder contains the **deliverable shortlist** for the | |
| **Redrob x Hack2Skill - India Runs Data & AI Challenge**. | |
| ## Hackathon problem statement (verbatim) | |
| > *Build an Intelligent Candidate Discovery & Ranking Engine.* | |
| > | |
| > Given a pool of **100,000 anonymised candidates** (`candidates.jsonl`, | |
| > schema in `candidate_schema.json`) and a single Job Description for a | |
| > Senior AI Engineer role at Redrob, produce a **ranked top 100** shortlist | |
| > as a CSV / XLSX matching `sample_submission.csv` and conforming to the | |
| > rules in `validate_submission.py`. | |
| > | |
| > Constraints: | |
| > * **CPU only**, no GPU. | |
| > * **No network / LLM calls** during ranking. | |
| > * Reproducible: a single command must regenerate the submission. | |
| > * Submission must pass the official `validate_submission.py` validator. | |
| > * Evaluation is automated (LightGBM ground-truth match) **and** human | |
| > (manual reasoning review at Stage 4). | |
| ## What is in this folder | |
| ``` | |
| data/ | |
| ├── README.md # this file | |
| ├── raw/ | |
| │ ├── candidates.jsonl # full 100,000-candidate pool (git-ignored) | |
| │ └── sample_candidates.json # 50-row fixture used by the HF Space | |
| ├── output/ # local CLI smoke runs land here (git-ignored) | |
| └── redrob_submission/ | |
| ├── submission.csv # *** OFFICIAL DELIVERABLE *** | |
| └── submission.xlsx # same shortlist, styled for human review | |
| ``` | |
| ## Inputs used to produce `redrob_submission/` | |
| | Item | Value | | |
| | ------------------- | --------------------------------------------------------------- | | |
| | Candidates file | `data/raw/candidates.jsonl` | | |
| | Candidates count | **100,000** records | | |
| | Job Description | `India_runs_data_and_ai_challenge/job_description.docx` | | |
| | JD role / seniority | Senior AI Engineer (Founding Team), 5-9 yrs | | |
| | Top-K | 100 | | |
| | Engine version | `talentry-ai v1.0.0` (commit `f4ea7a8`+) | | |
| ## Reproduce in one command | |
| ```bash | |
| cd talentry-ai | |
| source .venv/bin/activate # or: pip install -e ".[dev]" | |
| python -m talentry.cli.rank \ | |
| --candidates data/raw/candidates.jsonl \ | |
| --jd "/path/to/job_description.docx" \ | |
| --out data/redrob_submission/submission.csv \ | |
| --also-xlsx | |
| ``` | |
| Then validate against the official checker: | |
| ```bash | |
| python "../[PUB] India_runs_data_and_ai_challenge/India_runs_data_and_ai_challenge/validate_submission.py" \ | |
| data/redrob_submission/submission.csv | |
| # -> Submission is valid. | |
| ``` | |
| ## Output summary | |
| * **`submission.csv`** - 1 header row + 100 ranked candidates, | |
| validator-clean (`candidate_id,rank,score,reasoning`). | |
| * **`submission.xlsx`** - same shortlist materialised through `openpyxl` | |
| with frozen header row, sized columns and wrapped reasoning column. | |
| Both files have identical ranking and reasoning - use whichever your | |
| workflow prefers. | |
| ### Top 5 candidates produced for this JD | |
| | rank | candidate_id | score | one-line summary | | |
| | ---: | :-------------- | -----: | :---------------------------------------------------------------------------------------- | | |
| | 1 | `CAND_0086022` | 1.0673 | Senior Applied Scientist, 5.3 yrs, Kolkata - retrieval/ranking work at Sarvam AI | | |
| | 2 | `CAND_0068351` | 1.0476 | Lead AI Engineer, 6.4 yrs, Delhi - retrieval/ranking work at Sarvam AI | | |
| | 3 | `CAND_0002025` | 1.0272 | Senior AI Engineer, 5.9 yrs, Trivandrum - retrieval/ranking work at Apple | | |
| | 4 | `CAND_0008425` | 1.0240 | Senior NLP Engineer, 7.8 yrs, Kolkata - retrieval/ranking work at Ola | | |
| | 5 | `CAND_0018499` | 1.0181 | Senior ML Engineer, 7.2 yrs, Noida - retrieval/ranking work at Zomato | | |
| Run the CLI again at any time to refresh the table; the ranker is fully | |
| deterministic given the same `candidates.jsonl` + JD pair. | |
| ## How the engine ranks (summary) | |
| 1. **Stream-ingest** the 100K JSONL pool through a slotted-dataclass loader. | |
| 2. **Schema-validate** every record against `candidate_schema.json` (failures | |
| surface as a git-diff-style report in the UI). | |
| 3. **Parse the JD** into a `JobRequirements` DTO (role family, seniority | |
| band, must / nice / disqualifier skills). | |
| 4. **Score** every candidate on 6 explainable signals: title-career alignment | |
| (anti keyword-stuffer), hybrid BM25 + TF-IDF semantic JD fit, | |
| skill-evidence with endorsement trust, experience-band match, location | |
| & logistics, behavioural availability. | |
| 5. **Honeypot guard** down-ranks impossible profiles | |
| (e.g. 8 yrs at a 3-year-old company). | |
| 6. **Compose** a 1-2 sentence reasoning citing real facts from the profile. | |
| 7. **Write** the validator-clean CSV + XLSX. | |
| Runtime on a single CPU for the full 100K pool: **~3 min 23 sec** wall-clock. | |
| ## License | |
| MIT - see `../LICENSE`. | |