talentry-ai / data /README.md
williyam's picture
deploy: sync from talentry-ai @ 22f3ac3
2882028
|
Raw
History Blame Contribute Delete
5.19 kB
# 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`.