data science/AI Agents

Multi-Agents : 채용 에이전트

꼰대코더 2025. 10. 12. 00:48

인스톨

# Core dependencies
pip install phidata
pip install agno
pip install PyPDF2==3.0.1
pip install requests==2.32.3
pip install pytz==2023.4
pip install typing-extensions>=4.9.0

# Optional but recommended
pip install black>=24.1.1  # for code formatting
pip install python-dateutil>=2.8.2  # for date parsing

 

import 

from typing import Literal, Tuple, Dict, Optional
import os
import time
import json
import requests
import PyPDF2
from datetime import datetime, timedelta
import pytz

import streamlit as st
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.email import EmailTools
from phi.tools.zoom import ZoomTool
from phi.utils.log import logger

 

agent_resume_analyzer

agent_resume_analyzer = Agent(
    model=OpenAIChat(
        id="gpt-4o",
        api_key="your key here"
    ),
    description="You are an expert technical recruiter who analyzes resumes.",
    instructions=[
    "제공된 채용 요건에 따라 이력서를 분석하세요",
    "잠재력이 높은 AI/ML 지원자에게는 관대하게 평가하세요",
    "프로젝트 경험을 실제 경력으로 간주하세요",
    "핵심 기술에 대한 실무 경험을 높이 평가하세요",
    "선택 결정 및 피드백을 JSON 형식으로 반환하세요"
    ],
    markdown=True
)
 

 

agent_email

agent_email = Agent(
        model=OpenAIChat(
            id="gpt-4o",
            api_key="your key here"
        ),
        tools=[EmailTools(
            receiver_email="응모자 이메일 주소",
            sender_email="담당자 gmal 주소",
            sender_name="회사명",
            sender_passkey="구글 이메일 패스워드"
        )],
        description="You are a professional recruitment coordinator handling email communications.",
        instructions=[
        "전문적인 채용 이메일을 작성하고 발송하세요",
        "사람이 이메일을 쓰는 것처럼 행동하고 모든 글자를 소문자로 사용하세요",
        "친근하면서도 전문적인 어조를 유지하세요",
        "이메일의 끝에는 항상 정확히 다음 문구로 마무리하세요: '감사합니다.,\nAI 인재채용 팀'",
        "서명에는 발신자나 수신자의 이름을 절대 포함하지 마세요",
        "회사의 이름은 'abc system'입니다"
        ],
        markdown=True,
        show_tool_calls=True
    )
 

 

zoom_tools

zoom_tools = CustomZoomTool(
    account_id="zoom Account here",
    client_id="zoom client id here"
    client_secret="zoom client secret key here"
)

 

agent_scheduler

agent_scheduler = Agent(
    name="Interview Scheduler",
    model=OpenAIChat(
        id="gpt-4o",
        api_key="your key here"
    ),
    tools=[zoom_tools],
    description="You are an interview scheduling coordinator.",
    instructions=[
    "당신은 Zoom을 사용하여 기술 면접을 일정 잡는 전문가입니다.",
    "면접은 근무 시간(서울 시간 기준 오전 9시부터 오후 5시 사이)에 일정하세요.",
    "적절한 제목과 설명을 포함하여 미팅을 생성하세요.",
    "응답에 모든 미팅 세부 정보를 포함하도록 하세요.",
    "날짜는 ISO 8601 형식을 사용하세요.",
    "일정 조정 중 오류가 발생하면 우아하게 처리하세요."
    ],
    markdown=True,
    show_tool_calls=True
)

 

응모분야와 필요한 스킬 Dict

ROLE_REQUIREMENTS: Dict[str, str] = {
    "ai_ml_engineer": """
        Required Skills:
        - Python, PyTorch/TensorFlow
        - Machine Learning algorithms and frameworks
        - Deep Learning and Neural Networks
        - Data preprocessing and analysis
        - MLOps and model deployment
        - RAG, LLM, Finetuning and Prompt Engineering
    """,

    "frontend_engineer": """
        Required Skills:
        - React/Vue.js/Angular
        - HTML5, CSS3, JavaScript/TypeScript
        - Responsive design
        - State management
        - Frontend testing
    """,

    "backend_engineer": """
        Required Skills:
        - Python/Java/Node.js
        - REST APIs
        - Database design and management
        - System architecture
        - Cloud services (AWS/GCP/Azure)
        - Kubernetes, Docker, CI/CD
    """
}

 

응모자의 이력서 PDF를 파서

pdf_reader = PyPDF2.PdfReader(pdf_file)
text = ""
for page in pdf_reader.pages:
    text += page.extract_text()
 

 

응모 분야 role = 택1 (ai_ml_engineer / frontend_engineer / backend_engineer)

 

응모자의 이력서 분석

response = agent_resume_analyzer.run(
    f"""Please analyze this resume against the following requirements and provide your response in valid JSON format:
    Role Requirements:
    {ROLE_REQUIREMENTS[role]}
    Resume Text:
    {resume_text}
    Your response must be a valid JSON object like this:
    {{
        "selected": true/false,
        "feedback": "Detailed feedback explaining the decision",
        "matching_skills": ["skill1", "skill2"],
        "missing_skills": ["skill3", "skill4"],
        "experience_level": "junior/mid/senior"
    }}
    평가 기준:
    1. 요구되는 기술의 최소 70% 이상이 일치해야 합니다.
    2. 이론적 지식과 실무 경험을 모두 고려하세요.
    3. 프로젝트 경험과 실제 적용 사례를 중요하게 평가하세요.
    4. 유사한 기술에서 전이 가능한 역량도 고려하세요.
    5. 지속적인 학습과 적응력의 증거를 찾으세요.
    중요: 결과는 마크다운 형식이나 백틱(`) 없이 JSON 객체만 반환하세요.
    """
)

 

이력서 분석 결과

assistant_message = next((msg.content for msg in response.messages if msg.role == 'assistant'), None)
if not assistant_message:
    raise ValueError("No assistant message found in response.")

result = json.loads(assistant_message.strip())
if not isinstance(result, dict) or not all(k in result for k in ["selected", "feedback"]):
    raise ValueError("Invalid response format")

is_selected = result["selected"]
feedback = result["feedback"]

 

불합격(is_selected == false) 통지

agent_ email.run(
    f"""{to_email}에게 {role} 포지션 지원과 관련된 이메일을 보내세요.
    다음 스타일을 반드시 따르세요:
    1. 모든 글자는 소문자로 작성하세요.
    2. 공감 있고 인간적인 어조를 사용하세요.
    3. 다음 내용에서 제공된 구체적인 피드백({feedback})을 언급하세요.
    4. 역량 향상(upskill)을 권장하고 다시 지원하도록 격려하세요.
    5. 부족한 기술에 기반하여 학습 리소스를 제안하세요.
    6. 이메일의 마지막은 반드시 다음 문구로 끝내세요:
        AI 인크르트 팀

        서명에는 어떤 이름도 포함하지 마세요.
       사람이 쓴 톤과 간결하게 진심을 담아 쓴 이메일처럼 자연스럽게 하세요.
    """
)

 

합격통지

agent_email.run(
    f"""
    {to_email}에게 {role} 포지션 합격과 관련된 이메일을 보내세요.
    이메일에는 다음 내용을 포함해야 합니다:
    1. 선발된 것에 대해 축하의 말을 전하세요.
    2. 이후 절차(다음 단계)를 설명하세요.
    3. 곧 면접 세부 정보를 전달할 예정임을 언급하세요.
    4. 회사 이름은 'AI 인재채용 팀 입니다.
    """
)

 

한국 시간 내일 11시로 zoom 스케줄을 설정

ist_tz = pytz.timezone('Asia/Seoul')
current_time_ist = datetime.now(ist_tz)

tomorrow_ist = current_time_ist + timedelta(days=1)
interview_time = tomorrow_ist.replace(hour=11, minute=0, second=0, microsecond=0)
formatted_time = interview_time.strftime('%Y-%m-%dT%H:%M:%S')

meeting_response = scheduler.run(
    f"""다음 조건에 따라 60분짜리 기술 면접을 일정하세요:
    - 제목: '{role} Technical Interview'
    - 날짜: {formatted_time}
    - 시간대: KST (한국 표준시)
    - 참석자: {candidate_email}
   
    중요 사항:

    - 면접은 KST 기준 오전 9시부터 오후 5시 사이에 진행되어야 합니다.
    - 모든 커뮤니케이션은 KST (UTC+9) 시간대를 기준으로 하세요.
    - 미팅 세부 정보에 시간대 정보를 반드시 포함하세요.
    """
)

 

스케쥴 내용을 응모자에 메일 송신

agent_email.run(
    f"""다음 세부 정보를 포함하여 면접 확정 이메일을 보내세요:
    역할: {role} 포지션
    미팅 세부사항: {meeting_response}
   
    중요 지침:
    - 시간은 KST(한국 표준시) 기준임을 명확히 명시하세요.
    - 지원자에게 5분 일찍 접속하도록 요청하세요.
    - 가능하다면 시간대 변환 링크를 포함하세요.
    - 자신감을 가지고 너무 긴장하지 말며, 면접 준비를 잘 하도록 격려하세요.
    """
)