Author: Christina Joslin
Are you a college student interested in getting involved in machine learning (ML) but donβt know where to start? Early in your ML career and want to prepare for mid-level roles? Or aiming at senior/executive-track ML positions? ML Job Compass helps you chart the path to your desired ML role. Using Natural Language Processing (NLP), Data Visualization, Large Language Models (LLMs), and Retrieval-Augmented Generation (RAG), the app lets you:
2. Choose a target domain, career level, and optional ML specialization to get a tailored skills checklist or phased roadmap.
- Exploration (by domain): Top programming languages, frameworks/tools & cloud platforms, ML specializations.
- Personalization: Pick your target domain, level (Early/Mid/Senior), and optional specialization; get either:
- Skills checklist (3β5 items with what/why/mini-project/resources), or
- Phased roadmap (foundations β core projects β portfolio/interview, with named resources).
- RAG-backed guidance: Uses a local Chroma vector store of real job snippets to ground suggestions.
Step 1: Install Ollama on your local machine.
- GPU recommended:
ollama pull granite3.3:8b(Granite-3.3-8B-Instruct).
Inference speed and instruction-following quality were evaluated across several models (including the latest GPT OSS 20B model). Empirically, Granite-3.3-8B-Instruct was a solid default for this application.
- CPU-only option:
ollama pull granite3.3:2b(smaller model, slower but workable).
Step 3 (if using containers): Install Docker Desktop
- Copy
sample.envinto.envand set values for:MODEL_ID=granite3.3:8b OLLAMA_BASE_URL=http://localhost:11434
Hardware note: Aim for ~16 GB RAM and, ideally, a NVIDIA GeForce RTX GPU (author tested on RTX 4070).
β οΈ Image size note: The base CUDA/PyTorch image used for RAG (i.e., top-k similarity search during inference) is large ($\approx$ 15.35 GB). Ensure sufficient disk space.
There are two ways to run the app, both relying on Ollama running locally:
-
Option 1 (Docker Compose):
Runs a single container hosting the Streamlit app. The app makes HTTP calls to the local Ollama server (OLLAMA_BASE_URL=http://localhost:11434) on your machine. -
Option 2 (Local Python):
Runs the Streamlit app locally on your host machine (viastreamlit run app.py). The app still makes HTTP calls to the local Ollama server.
In both cases, the Streamlit app and Ollama communicate over HTTP; the only difference is whether Streamlit runs in a container or directly on your machine.
βEnsure Ollama is running locally, your model is pulled, and
.envis set up before starting.
Build & start:
docker compose up --buildRerun using the existing image
docker compose up Environment
- Local default:
OLLAMA_BASE_URL=http://localhost:11434 - Set MODEL_ID to your chosen model (e.g.,
granite3.3:8b).
βEnsure Ollama is running locally, your model is pulled, and
.envis set up before starting.
pip install -r requirements.txtstreamlit run app.pyUse sliders to view up to the top 10 programming languages, tools & cloud platforms, and ML specializations by domain (or across all domains). Interactive Plotly visuals show counts from current postings.
- Industry domain
- Target career level (Early Career/Mid-Level/Senior)
- Optional ML specialization (e.g., Natural Language Processing (NLP), Machine Learning Operations (MLOps))
- Output style (Skills checklist vs. Roadmap with a preparation window (up to 24 months))
After making your desired selections, click Generate Output. The app uses the vector store (RAG) & your selections to produce actionable, domain-specific guidance.
βHave any questions while making a selection? Check the help icon for additional information.
- Ensure
OLLAMA_BASE_URLis reachable, your model is pulled (check usingollama list) and the Ollama server is running.
- Prune unused images/containers and ensure >20 GB free space:
βββ .streamlit_/
β βββ config.toml # Streamlit theme & UI settings
βββ chroma_store_/ # Persistent Chroma DB artifacts (created by ingest)
βββ data_prep_/ # One-off data prep & evaluation assets
β βββ parse_job_info.py # LLM parser for structured fields from raw job text
β βββ parsed_test_ml_jobs_us.csv # Sample parsed output (test subset)
β βββ sentiment_similarity_test_v_true.png
β βββ test_ml_jobs_us.csv # Small raw test subset (CSV)
β βββ test_ml_jobs_us.xlsx # Same test subset (Excel)
β βββ Test_Parsing_Job_Info.ipynb # Notebook for initial parsing/evaluation
βββ .dockerignore
βββ .gitignore
βββ 1000_ml_jobs_us.csv # Raw jobs dataset (~1k postings)
βββ app.py # Streamlit app: ML Job Compass UI
βββ chroma_store.py # Build/query Chroma vector store (ingest + helpers)
βββ docker-compose.yml # Dev stack (app + Ollama, etc.)
βββ Dockerfile # App container image
βββ parsed_1000_ml_jobs_us.csv # Cleaned dataset consumed by the app
βββ sample.env # Example environment variables
βββ requirements.txt # Python dependencies
The original dataset used in this app, βMachine Learning Job Postings in the USβ by Ivan Kumeyko, is available on Kaggle:
https://www.kaggle.com/datasets/ivankmk/thousand-ml-jobs-in-usa
The dataset is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0).
- Model choice:
granite3.3:8bis the default. Smaller models (e.g.,granite3.1:2b) can run on CPU-only machines. - Hardware: A modern NVIDIA GPU with ~16 GB VRAM is recommended for responsive generation.
- RAG pipeline: If you change the dataset, re-run
python chroma_store.py




