AI API 활용

AI로 이력서/자소서 자동 생성기 만들기 - Claude API + Streamlit 30분 완성

소개왕 탑백귀 2026. 4. 22. 17:34

AI로 이력서/자소서 자동 생성기 만들기 - Claude API + Streamlit 30분 완성

2026년 4월 기준 | AI API 활용

요약: 지원 직무와 본인 경력을 입력하면 맞춤형 이력서·자소서 초안을 뽑아주는 웹앱을 Claude API + Streamlit으로 만듭니다. 채용 공고 분석, STAR 기법 자동 적용, 키워드 매칭까지 포함된 실전 파이프라인입니다. 전체 코드와 프롬프트 엔지니어링 노하우를 공유합니다.

왜 AI 이력서 생성기를 만드는가

이직이나 취업을 준비해 본 사람이라면 공통으로 느끼는 피로가 있습니다. 같은 경력을 회사마다 조금씩 다르게 각색해야 하고, 회사 공고에 맞춰 키워드를 다듬어야 하고, 자소서는 매번 처음부터 쓰는 기분이 든다는 것입니다.

AI를 쓰면 이 중복 작업을 크게 줄일 수 있습니다. 다만 ChatGPT 창에 대충 붙여 넣는 수준으로는 품질이 들쭉날쭉합니다. 공고를 분석해 핵심 역량을 뽑고, 본인 경력에서 매칭되는 부분을 골라, 정해진 형식에 맞춰 출력하는 파이프라인을 짜 두면 훨씬 안정적이고 재사용 가능한 도구가 됩니다. 이 글에서 만들 앱이 바로 그런 도구입니다.

전체 설계

[채용 공고 텍스트] + [내 경력 프로필]
        ↓
   (1) 공고 분석: 핵심 역량/키워드/우대 사항 추출
        ↓
   (2) 이력서 생성: 경력에서 매칭 포인트만 재구성
        ↓
   (3) 자소서 생성: STAR 기법으로 지원동기/경험 작성
        ↓
[PDF 또는 Markdown 출력]

한 번에 다 시키지 않고 "분석 → 이력서 → 자소서" 3단계로 나누는 게 핵심입니다. 단계를 나누면 각 단계의 프롬프트를 명확하게 잡을 수 있고, 중간 결과를 사용자에게 보여주며 검토할 수 있습니다.

환경 설정

pip install anthropic streamlit python-dotenv markdown2

# .env
# ANTHROPIC_API_KEY=sk-ant-xxxxx

# 파일 구조
# app.py              (Streamlit 엔트리)
# agents.py           (Claude 호출 함수)
# prompts.py          (프롬프트 템플릿)
# .env

1단계: 채용 공고 분석

공고를 통째로 던져 주고 JSON 구조로 요구 역량을 뽑아냅니다. 이 결과가 다음 단계의 입력이 됩니다.

# agents.py
import anthropic, json
client = anthropic.Anthropic()

JD_PROMPT = """다음 채용 공고를 분석해 JSON으로만 답해줘.
스키마:
{
  "role_summary": "한 문장 요약",
  "must_skills": ["필수 역량 배열"],
  "nice_skills": ["우대 역량 배열"],
  "keywords": ["공고에서 반복되는 핵심 키워드"],
  "culture": "조직 문화/업무 방식 요약",
  "red_flags": ["지원자가 유의해야 할 문구"]
}
"""

def analyze_jd(job_post: str) -> dict:
    msg = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1200,
        system=JD_PROMPT,
        messages=[{"role": "user", "content": job_post}],
    )
    raw = msg.content[0].text.strip()
    if raw.startswith("```"):
        raw = raw.split("```")[1].lstrip("json").strip()
    return json.loads(raw)

red_flags 필드는 의외로 유용합니다. "주 52시간 초과 빈번", "자사 제품 열정 필수" 같은 문구를 AI가 알아서 플래그해 주면 지원 전에 한 번 더 생각해 볼 기회가 됩니다.

2단계: 이력서 생성

분석 결과와 본인 경력을 함께 넣어 맞춤형 이력서를 생성합니다. 중요한 건 본인이 실제 한 일만 재구성하도록 제약을 거는 것입니다. 없는 경력을 만들어내면 면접에서 바로 들통납니다.

RESUME_PROMPT = """너는 채용 지원용 이력서 편집자다.
입력된 '내 경력 프로필'에 없는 내용은 절대 만들어내지 마라.
있는 경험 중에서 공고 분석 결과와 매칭되는 부분만 골라 재구성하고,
수치와 임팩트를 강조해 한국어 이력서 Markdown으로 출력한다.

출력 형식:
# 이름 | 직무
## 요약 (3~4줄, 공고 필수 역량 반영)
## 핵심 역량 (공고 키워드 중심 5~7개)
## 경력 (시간 역순, bullet 3~4개씩, 수치 포함)
## 프로젝트 (있다면)
## 교육/자격
"""

def build_resume(profile: str, jd_analysis: dict) -> str:
    user_msg = f"""
[공고 분석]
{json.dumps(jd_analysis, ensure_ascii=False, indent=2)}

[내 경력 프로필]
{profile}
"""
    msg = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=2500,
        system=RESUME_PROMPT,
        messages=[{"role": "user", "content": user_msg}],
    )
    return msg.content[0].text

"수치와 임팩트 강조"가 프롬프트 핵심입니다. "사용자 경험 개선"보다 "전환율 18% 향상"이, "API 최적화"보다 "평균 응답 480ms → 120ms"가 서류 통과율을 확실히 높입니다. 본인 경력 프로필을 입력할 때부터 숫자가 들어 있으면 AI가 잘 활용합니다.

3단계: 자소서 생성 (STAR)

자소서는 STAR(Situation, Task, Action, Result) 기법을 프롬프트에 명시합니다. 문항별로 다른 경험을 매칭하도록 지시하는 게 포인트입니다.

COVER_PROMPT = """너는 지원 자소서 코치다. STAR 기법으로 문항별 답변을 작성한다.
STAR: Situation(상황), Task(과제), Action(행동), Result(결과-수치 포함).
입력된 경력에서만 에피소드를 가져오고 없으면 '해당 경험 부족'이라고 적는다.
문항마다 800~1200자. 같은 에피소드를 문항끼리 중복 사용하지 말 것.
출력은 Markdown, 문항당 제목 + 본문.
"""

def build_cover_letter(profile: str, jd_analysis: dict, questions: list[str]) -> str:
    user_msg = f"""
[공고 분석]
{json.dumps(jd_analysis, ensure_ascii=False, indent=2)}

[내 경력 프로필]
{profile}

[자소서 문항]
{chr(10).join(f'{i+1}. {q}' for i, q in enumerate(questions))}
"""
    msg = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=4000,
        system=COVER_PROMPT,
        messages=[{"role": "user", "content": user_msg}],
    )
    return msg.content[0].text

자소서 품질은 입력한 경력 프로필의 디테일이 좌우합니다. 본인 경력을 저장해 두는 "프로필 파일"을 따로 두고 점점 더 자세한 에피소드(상황-문제-내 역할-결과-수치)를 축적해 두면 갈수록 결과물 품질이 올라갑니다.

4단계: Streamlit UI

이제 모든 단계를 하나의 웹앱으로 묶습니다.

# app.py
import streamlit as st
from agents import analyze_jd, build_resume, build_cover_letter

st.set_page_config(page_title="AI 이력서/자소서 생성기", layout="wide")
st.title("AI 이력서/자소서 생성기")

with st.sidebar:
    st.header("입력")
    profile = st.text_area(
        "내 경력 프로필 (최대한 자세히)", height=350,
        placeholder="- 2022~2024: OO사 백엔드 엔지니어...\n- 프로젝트: 결제 시스템 개선 (MAU 300만...)",
    )
    job_post = st.text_area("채용 공고 전체 텍스트", height=250)
    cover_qs = st.text_area(
        "자소서 문항 (줄바꿈으로 구분)", height=150,
        placeholder="지원 동기\n가장 큰 성취 경험\n협업 중 갈등 극복 사례",
    )
    run = st.button("초안 생성하기", type="primary", use_container_width=True)

if run and profile and job_post:
    with st.spinner("공고 분석 중..."):
        jd = analyze_jd(job_post)

    col1, col2 = st.columns(2)
    with col1:
        st.subheader("공고 분석 결과")
        st.json(jd)
        st.subheader("이력서 초안")
        with st.spinner("이력서 작성 중..."):
            resume_md = build_resume(profile, jd)
        st.markdown(resume_md)
        st.download_button("이력서 .md 다운로드", resume_md, "resume.md")
    with col2:
        if cover_qs.strip():
            st.subheader("자소서 초안")
            qs = [q.strip() for q in cover_qs.splitlines() if q.strip()]
            with st.spinner("자소서 작성 중..."):
                cover_md = build_cover_letter(profile, jd, qs)
            st.markdown(cover_md)
            st.download_button("자소서 .md 다운로드", cover_md, "cover.md")

실행은 streamlit run app.py 한 줄입니다. 브라우저가 열리면 왼쪽 사이드바에 프로필·공고·문항을 넣고 버튼만 누르면 끝입니다.

품질을 높이는 프롬프트 팁

실제로 몇 번 돌려보면 바로 느끼는 개선 포인트들입니다.

  • 경력 프로필을 마크다운 헤더로 구조화: "## 프로젝트", "### 사용 스택" 등으로 섹션을 나눠 두면 AI가 섹션별로 매칭합니다.
  • 수치는 무조건 명시: MAU, 전환율, 응답 속도, 팀 규모, 예산 등 숫자가 들어 있는 경력만 이력서에 올라옵니다. 없으면 AI도 못 만들어냅니다.
  • 금지어 목록 포함: 시스템 프롬프트 끝에 "절대 쓰지 말 것: '열정적인', '커뮤니케이션 능력이 뛰어난'" 같은 클리셰를 차단하면 톤이 확 개선됩니다.
  • 길이 제약 수치로: "800~1200자"처럼 범위를 주면 AI가 잘 지킵니다. "적절히"는 무시됩니다.
  • 최종 교정은 사람이: AI가 만든 초안을 그대로 제출하지 말고, 문장 두세 곳은 본인 어투로 고쳐야 진짜처럼 읽힙니다.

추가로 공고 URL을 붙여 넣으면 자동으로 크롤링하는 기능을 더하면 UX가 더 좋아집니다. requests + BeautifulSoup으로 Wanted·잡플래닛·사람인 등 주요 사이트의 공고 본문을 추출해 analyze_jd에 넘겨 주면 됩니다.

마무리

이력서·자소서 작성은 시간을 가장 많이 잡아먹는 취업 준비 업무 중 하나입니다. 한 번 이 파이프라인을 만들어 두면 공고 10개에 지원하는 데 드는 시간이 절반 이하로 줄어듭니다. 대신 초안만 AI에게 맡기고 검토·수정은 반드시 본인이 해야 한다는 원칙은 지켜주세요. AI가 놓치는 뉘앙스나 사실관계가 있기 마련이고, 최종 책임은 본인이 져야 하는 문서이기 때문입니다.

건당 API 비용은 Claude Sonnet 기준 이력서+자소서 한 세트에 수백 원 수준입니다. 공고 수십 건에 지원하더라도 커피 한두 잔 값에 맞먹는 비용으로 시간을 크게 아낄 수 있습니다.