JAA-ATS-Tool / scripts /verify_weak_llm_recovery.py
saitejatirunagari's picture
fix(ui+ats): remove title, fix dark-on-dark inputs, aggressive injection for 90%+
386446e
Raw
History Blame
3.78 kB
"""Test ATS recovery when the LLM produces a weak/sparse v2 output (mimics real production)."""
import os, sys, io, pdfplumber
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
def read_pdf(p):
text = ''
with pdfplumber.open(p) as pdf:
for page in pdf.pages:
t = page.extract_text()
if t:
text += t + '\n'
return text
orig = read_pdf(r'C:\Users\Nxtwave\Desktop\resume\Saiteja_Tirunagari_Resume A 26 - Copy.pdf')
from src.resume_customizer import ResumeCustomizer, _read_docx_text
from src.ats_scorer import score_resume
from src.resume_parser import ResumeParser
rc = ResumeCustomizer.__new__(ResumeCustomizer)
rc.resume_text = orig
rc.output_dir = 'data/output/resumes/_weak_llm_test'
os.makedirs(rc.output_dir, exist_ok=True)
rc.fast_model_cfg = None
parser = ResumeParser.__new__(ResumeParser)
parser.pdf_path = ''
contact = parser.get_contact_info(orig)
# Simulate a WEAK LLM that follows v1 schema (older model) β€” most production runs
# look like this: just summary + a flat experience_bullets dict, no rewritten_bullets
def weak_llm_v1(jd_label, summary_text):
return {
"professional_summary": summary_text,
# v1 schema β€” backwards compat path
"core_competencies": ["Product Strategy", "Roadmap Planning", "A/B Testing"],
"experience_bullets": {
"internal_product_manager": [
"Led NIAT Application Portal revamp",
"Built AI chatbot funnel",
"Drove payment conversion optimization",
],
},
"key_achievements": ["141,269 verified leads", "+35.87 pp payment lift"],
}
jds = [
("Airtel PM", "tests/fixtures/jds/airtel_pm.txt"),
("Sumo Logic PM", "tests/fixtures/jds/sumo_logic_pm.txt"),
("EdgeVerve PM", "tests/fixtures/jds/edgeverve_pm.txt"),
("Aditya Birla APM", "tests/fixtures/jds/aditya_birla_apm.txt"),
]
print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
print(f'{"JD":<22} {"Before inj":<14} {"After inj":<14} {"Missing":<6}')
print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
for label, jd_path in jds:
with open(jd_path, encoding='utf-8') as f:
jd = f.read()
# Weak LLM with a minimal summary
weak_summary = (
f"Product Manager with 5+ years of experience driving 0-1 product "
f"development in fast-paced startups."
)
cust = weak_llm_v1(label, weak_summary)
filepath = os.path.join(rc.output_dir, f'{label.replace(" ", "_")}.docx')
job = {'title': 'PM', 'company': label, 'relevance_score': 7}
rc._write_docx(filepath, job, cust, contact)
# Score before injection
r_before = score_resume(_read_docx_text(filepath), jd)
# Apply injection
rc._inject_missing_keywords(filepath, jd)
# Score after injection
r_after = score_resume(_read_docx_text(filepath), jd)
print(f'{label:<22} {r_before["ats_score"]:>3}/100 ({r_before["jd_match_score"]}%kw) '
f'{r_after["ats_score"]:>3}/100 ({r_after["jd_match_score"]}%kw) '
f'{len(r_after["missing_kw"]):<6}')
print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
print('\nNote: "Before inj" = weak v1-schema LLM result (typical production case)')
print(' "After inj" = after the new aggressive keyword injection into summary')