← Master Index
Vol. 23 Module 23.1 Lecture

AI Interview Assistant

Capstone Projects

How This Lesson Fits the Module & Volume

The travel planner gated irreversible bookings. This capstone gates judgments about people. Vol. 21 Education AI split tutor vs assessment; Vol. 20 bias, fairness, and responsible AI apply immediately. MVP = practice interviewer (candidate rehearses against a rubric). Stretch may add interviewer-aid notes for a human interviewer. Neither mode is a hiring oracle.

The curriculum closer is next: document analyzer—multi-doc ingest, schema, diff, redaction, and a full-stack recap of Volumes 11–22.

Learning Objectives

By the end of this lesson, students should be able to:

  • State the MVP explicitly: practice interviewer, not automated hiring.
  • Author a visible scoring rubric (dimensions + scale + evidence quotes).
  • Show a bias / fairness warning in the UI; refuse protected-class inferences.
  • Label every score “practice feedback, not a hiring decision.”
  • Eval rubric consistency on gold answers—not “predict who gets the job.”
  • Describe interviewer-aid as stretch-only, still HITL, still not an oracle.
Definition

An AI interview assistant in this lecture’s MVP is a practice interviewer: given a job description and a declared rubric, it asks questions, accepts answers, and returns dimension scores plus evidence spans and coaching notes. It is not a hiring oracle—it must not rank candidates for an offer, infer protected attributes, or auto-reject. Interviewer-aid (stretch) helps a human interviewer take structured notes against the same rubric; the human still owns the hiring decision (Vol. 15 HITL + Vol. 20 fairness).

MVP Mode: Practice Interviewer

Build candidate practice first. Do not ship a silent scoring API that a recruiter could paste into an ATS as a decision. If you add interviewer-aid later, keep the disclaimer, log that a human must confirm, and never emit a single “hire/no-hire” token as the product output.

Problem, MVP, and Stretch

MVP — practice interviewerStretch — interviewer-aid
UserCandidate rehearsingHuman interviewer + candidate (live notes)
InputsJD + rubric + answer text (or STT optional)Same + interviewer timestamps
OutputsQuestions, per-dimension scores, evidence, coachingNote draft + rubric assist for the human
DecisionNone. Explicit non-hiring labelHuman-only hire/no-hire; AI never writes the offer
Bias controlsWarning UI; no demographic questions; no accent/name scoringSame + Vol. 20 fairness review sample
Out of scopeATS auto-reject; personality “psychometrics”; deepfake avatars as truthSurveillance, emotion recognition as hire signal

Practice interviewer (MVP)

  • Helps the learner improve answers
  • Rubric is a coaching contract
  • Scores are feedback, not offers
  • Safe classroom / portfolio default

Interviewer-aid (stretch)

  • Helps the interviewer stay consistent
  • Notes + evidence for human review
  • Still not an oracle
  • Higher Vol. 20 scrutiny

Hiring oracle (forbidden)

  • Single hire/no-hire score
  • Hidden rubric
  • Demographic or proxy features
  • Auto-reject without a human

Visible rubric buys

  • Evalable dimensions (STAR, correctness, clarity)
  • Candidate can contest a score with evidence
  • Easier bias review than a black-box “fit” number

Holistic vibe score costs

  • Unstable across paraphrases
  • Easy to smuggle accent/name bias
  • Looks like a hiring decision in a dashboard

Architecture

LayerMVP choiceNotes
UIJD paste, rubric editor, chat questions, score cards, disclaimer bannerBanner always visible on score views
APIFastAPI: /session/start, /turn, /scoremode=practice required
RubricJSON: dimensions, 1–5 scale, descriptorsVersion the rubric like an API
ModelChat completion + structured scoresVol. 13 JSON; Vol. 22 vendor pick
Optional STTOff in MVP; text answersVol. 16 if added; do not score accent
StorageSession transcript + rubric_id + scores + disclaimer_ackNo protected-class fields
EvalAgreement vs gold rubric on fixtures; banned-inference testsNot “who would be hired”
JD + rubric + disclaimer ack
Ask question (practice interviewer)
Candidate answer (text)
Per-dimension score + evidence + coaching
Label: practice feedback, not a hiring decision

FastAPI Sketch: Rubric Scoring (Practice Mode)

# interview_assistant.py — Vol. 23 capstone (educational) # MVP = practice interviewer. Not a hiring oracle. from fastapi import FastAPI, HTTPException from pydantic import BaseModel, Field app = FastAPI(title="Vol23 Interview Assistant") DISCLAIMER = "Practice feedback only. Not a hiring decision. Not an assessment of a protected class." BANNED = ("race", "ethnicity", "religion", "gender", "age", "disability", "pregnancy", "national origin") class RubricDim(BaseModel): id: str name: str description: str scale_min: int = 1 scale_max: int = 5 class StartIn(BaseModel): session_id: str mode: str = Field(pattern="^practice$") # stretch may add interviewer_aid later job_description: str = Field(min_length=20, max_length=8000) rubric: list[RubricDim] = Field(min_length=2, max_length=8) disclaimer_ack: bool class AnswerIn(BaseModel): session_id: str question: str answer: str = Field(min_length=1, max_length=8000) class DimScore(BaseModel): dim_id: str score: int evidence: str coaching: str class ScoreOut(BaseModel): disclaimer: str dimensions: list[DimScore] overall_note: str hiring_decision: None = None # always null in MVP SESSIONS: dict[str, dict] = {} def llm_score(jd: str, rubric: list[RubricDim], question: str, answer: str) -> list[dict]: # Replace with structured-output chat. Must quote evidence from the answer. return [ { "dim_id": d.id, "score": 3, "evidence": answer[:180], "coaching": "Replace with model coaching tied to the rubric descriptor.", } for d in rubric ] @app.post("/v1/interview/start") def start(body: StartIn): if not body.disclaimer_ack: raise HTTPException(403, "Disclaimer acknowledgment required.") SESSIONS[body.session_id] = {"jd": body.job_description, "rubric": body.rubric, "mode": body.mode} return {"session_id": body.session_id, "mode": "practice", "disclaimer": DISCLAIMER} @app.post("/v1/interview/score", response_model=ScoreOut) def score(body: AnswerIn): sess = SESSIONS.get(body.session_id) if not sess: raise HTTPException(404, "unknown session") blob = (body.question + " " + body.answer).lower() if any(term in blob for term in BANNED) and "job requirement" not in blob: # Heuristic demo only: do not score demographics; refuse. raise HTTPException(422, "Refusing demographic / protected-class inference. Re-answer the work sample.") raw = llm_score(sess["jd"], sess["rubric"], body.question, body.answer) dims = [] for d, row in zip(sess["rubric"], raw): sc = int(row["score"]) if not d.scale_min <= sc <= d.scale_max: raise HTTPException(422, "Score outside rubric scale.") dims.append(DimScore(dim_id=d.id, score=sc, evidence=str(row["evidence"]), coaching=str(row["coaching"]))) return ScoreOut( disclaimer=DISCLAIMER, dimensions=dims, overall_note="Use these notes to practice. A human hiring process is separate.", hiring_decision=None, )

Acceptance Criteria (“Done When…”)

#CriterionHow you prove it
1Mode is practiceAPI/UI says practice interviewer; no hire/no-hire enum
2Rubric visibleEvery score maps to a named dimension + scale
3Disclaimer ackStart without ack → 403; disclaimer on every score payload
4Evidence from the answerEvidence string is a substring of the answer (normalized)
5No protected-class scoringFixture with demographic bait → 422 or ignore + warn, never a dim score on identity
6hiring_decision is always nullSchema + test
7Gold consistencyTwo gold answers: strong vs weak differ in the expected direction on at least one dim

Eval, HITL, and Safety

Eval rubric reliability (same answer scored twice should not wildly flip) and sensitivity (weak vs strong gold). Do not eval “accuracy vs who was hired historically”—that encodes past bias (Vol. 20). Human evaluation on coaching usefulness. Interviewer-aid stretch: human must confirm notes before they enter a hiring file.

RiskControl
Treated as a hiring oracleDisclaimer, null hiring_decision, practice mode only in MVP
Bias / proxy discriminationNo demographic fields; refuse identity bait; Vol. 20 fairness sample
Accent / voice as competenceText MVP; if STT added, do not score fluency-as-intelligence
Hidden rubricDimensions always returned to the user
Prompt injection in JDWrap JD + answer as untrusted data

Related Lectures

LectureRole
Education AITutor vs assessment integrity analog
Bias / fairness / responsible AINon-oracle + non-discrimination
Structured outputRubric JSON
HITLHuman owns real hiring
Human evaluationCoaching quality
Travel planner / Document analyzerPrev / curriculum closer
Common Misconception

“A 1–5 score is objective if the model is large.” Rubrics still encode values; models still drift. Second: matching historical hire labels is a good eval (it often replays bias). Third: asking the model for race/gender “only to debias” in the MVP. Fourth: interviewer-aid can auto-reject to save time. Fifth: scoring accent or “confidence” from audio is a harmless extra. Sixth: hiding the rubric from the candidate makes scores more valid—it mostly makes them less contestable.

Knowledge Check

  1. Short Answer: What is the explicit MVP mode for this lecture? Answer: Practice interviewer (candidate rehearsal), not hiring automation.
  2. True/False: The MVP may return a hire/no-hire decision. Answer: False—hiring_decision stays null.
  3. Multiple Choice: Interviewer-aid belongs in: (a) stretch with HITL, (b) MVP auto-reject, (c) CUDA kernels. Answer: (a).
  4. Short Answer: Name two Vol. 20 topics that constrain this product. Answer: Any two of: bias, fairness, responsible AI, privacy, transparency.
  5. True/False: Historical “who was hired” accuracy is the recommended eval. Answer: False—it can encode past bias.
  6. Multiple Choice: Scores without a visible rubric are: (a) a product failure for this capstone, (b) more scientific, (c) required by softmax. Answer: (a).
  7. Short Answer: What must every score payload include besides numbers? Answer: Disclaimer + dimension evidence/coaching (and no hiring decision).
  8. True/False: Protected-class inference is in scope if it improves “culture fit.” Answer: False.
  9. Multiple Choice: Closest Vol. 21 analog for tutor vs high-stakes judgment: (a) Education AI, (b) image generators, (c) n8n. Answer: (a).
  10. Short Answer: Which lecture closes the entire curriculum after this one? Answer: AI Document Analyzer.

Key Takeaways

  • MVP is a practice interviewer with a visible rubric—not a hiring oracle.
  • Disclaimer, null hiring_decision, and banned demographic scoring are acceptance tests.
  • Eval rubric consistency on gold answers; do not optimize against historical hire labels.
  • Interviewer-aid is stretch + HITL only; humans still own offers.
  • Final lecture: AI Document Analyzer (curriculum capstone).
Trainer’s Guide

Lab: Provide a toy JD (backend intern) and a 4-dimension rubric (correctness, structure, communication, tradeoff reasoning). Two gold answers: strong STAR vs vague. Students must show disclaimer, null hiring field, and directional score difference. Add a demographic-bait answer that must 422.

Discussion: Why “culture fit” is a bias magnet. If a student wants interviewer-aid, require a written HITL policy before any code.

Recap: The interview assistant MVP is practice-only rubric coaching with bias warnings—not automated hiring. Close the course with AI Document Analyzer.