AI ๊ธฐ๋ฐ ์ฑ์ฉ๊ณต๊ณ ๋ถ์ ๋ฐ ๋ฉด์ ์ค๋น ์์คํ ์ ๋๋ค. ์ฑ์ฉ๊ณต๊ณ URL๊ณผ GitHub ํ๋กํ์ ๋ถ์ํ์ฌ ์คํฌ ๊ฐญ์ ํ์ ํ๊ณ , ๋ง์ถคํ ๋ฉด์ ์ง๋ฌธ์ ์์ฑํฉ๋๋ค.
| ๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
| ์ฑ์ฉ๊ณต๊ณ ์์ฝ | URL์์ ์ฑ์ฉ๊ณต๊ณ ์คํฌ๋ํ ๋ฐ AI ์์ฝ |
| GitHub ๋ถ์ | ๊ณต๊ฐ ๋ ํฌ์งํ ๋ฆฌ ๋ถ์ ๋ฐ ๊ธฐ์ ์คํ ์ถ์ถ |
| ์คํฌ ๊ฐญ ๋ถ์ | ์ฑ์ฉ ์๊ตฌ์ฌํญ๊ณผ ๋ณด์ ๊ธฐ์ ๋น๊ต ๋ถ์ |
| ๋ฉด์ ์ง๋ฌธ ์์ฑ | ํ๊ตญ์ด/์์ด ๋ง์ถคํ ๋ฉด์ ์ง๋ฌธ ์์ฑ |
| ์ด๋ฉ์ผ ๋ฐ์ก | ๋ถ์ ๊ฒฐ๊ณผ ์ด๋ฉ์ผ ์๋ ๋ฐ์ก |
| Discord ์ฐ๋ | ์์ฝ ๊ฒฐ๊ณผ Discord ์ฑ๋ ์ ์ก |
[์ด๋ฉ์ผ/GitHub ์
๋ ฅ] โ [์ฑ์ฉ๊ณต๊ณ URL ์
๋ ฅ] โ [์ฑ์ฉ๊ณต๊ณ ์์ฝ]
โ
[GitHub ํ๋กํ ๋ถ์]
โ
[์คํฌ ๊ฐญ ๋ถ์]
โ
[๋ฉด์ ์ง๋ฌธ ์์ฑ (ํ/์)]
โ
[ํ์ผ ์ ์ฅ + ์ด๋ฉ์ผ/Discord ๋ฐ์ก]
| ๋ถ๋ฅ | ๊ธฐ์ |
|---|---|
| Core | LangChain 0.3.25+ / LangChain-Ollama 0.3.3+ |
| LLM | Ollama (llama3.2) |
| ์คํฌ๋ํ | BeautifulSoup4 / requests |
| ์ด๋ฉ์ผ | Gmail SMTP (smtplib) |
| ์ฐ๋ | discord.py 2.5.2+ |
| ์ค์ ๊ด๋ฆฌ | python-dotenv |
| ํจํค์ง๊ด๋ฆฌ | uv |
| Python | 3.11+ |
JD-Scanner/
โโโ main.py # GUI ์ง์
์
โโโ pyproject.toml # ํ๋ก์ ํธ ๋ฉํ๋ฐ์ดํฐ
โโโ makefile # ์ค์น/์คํ ์๋ํ
โโโ .env # ํ๊ฒฝ์ค์
โโโ src/
โ โโโ __init__.py # ํจํค์ง ์ด๊ธฐํ
โ โโโ ui/ # UI ๋ ์ด์ด (Presentation)
โ โ โโโ __init__.py
โ โ โโโ main_ui.py # ๋ฉ์ธ ๋ถ์ ํ๋ฉด
โ โ โโโ settings_ui.py # ์ค์ ํ๋ฉด
โ โโโ core/ # Core ๋ ์ด์ด (Domain)
โ โ โโโ __init__.py
โ โ โโโ chain.py # LangChain ์ฒด์ธ (์์ฝ + ์คํฌ๊ฐญ)
โ โ โโโ mapreduce_chain.py # Map-Reduce ๋์ฉ๋ ์ฒ๋ฆฌ
โ โ โโโ lang_prompt.py # ํ๋กฌํํธ ์ค์
โ โ โโโ lang_template.py # ํ๋กฌํํธ ํ
ํ๋ฆฟ
โ โโโ services/ # Services ๋ ์ด์ด (Infrastructure)
โ โ โโโ __init__.py
โ โ โโโ discord_sender.py # Discord ๋ฉ์์ง ์ ์ก
โ โ โโโ email_sender.py # ์ด๋ฉ์ผ ๋ฐ์ก
โ โ โโโ github_analyzer.py # GitHub ํ๋กํ ๋ถ์
โ โโโ utils/ # Utils ๋ ์ด์ด (Shared)
โ โโโ __init__.py
โ โโโ config_manager.py # ํ๊ฒฝ๋ณ์ ๊ด๋ฆฌ
โ โโโ user_manager.py # ์ฌ์ฉ์ ์ ๋ณด ๊ด๋ฆฌ
โ โโโ token_counter.py # ํ ํฐ ์นด์ดํฐ
โ โโโ text_splitter.py # ํ
์คํธ ์ฒญํน
โโโ output/
โ โโโ users/ # ์ฌ์ฉ์ ๋ฐ์ดํฐ ์ ์ฅ
โ โโโ *.md # ๋ถ์ ๊ฒฐ๊ณผ ํ์ผ
โโโ test/ # ํ
์คํธ ํ์ผ
- Python 3.11+ ์ค์น
- Ollama ์ค์น ๋ฐ ์คํ
# ํ๋ก์ ํธ ํด๋ก
git clone https://github.com/HelloPy-Korea/JD-Scanner.git
cd JD-Scanner
# ์์กด์ฑ ์ค์น
make install.env ํ์ผ:
# Discord (์ ํ)
DISCORD_BOT_TOKEN=your_bot_token
DISCORD_CHANNEL_IDS=channel_id_1,channel_id_2
# ์ด๋ฉ์ผ (Gmail SMTP)
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SENDER_EMAIL=your_email@gmail.com
SENDER_PASSWORD=your_app_password
# GitHub API (์ ํ - ๋์ API ์ ํ)
GITHUB_TOKEN=your_github_tokenGmail ์ฑ ๋น๋ฐ๋ฒํธ ์ค์ :
- Google ๊ณ์ โ ๋ณด์ โ 2๋จ๊ณ ์ธ์ฆ ํ์ฑํ
- ์ฑ ๋น๋ฐ๋ฒํธ ์์ฑ โ ์์ฑ๋ 16์๋ฆฌ ๋น๋ฐ๋ฒํธ๋ฅผ
SENDER_PASSWORD์ ์ ๋ ฅ
make run============================================================
JD-Scanner - AI ๊ธฐ๋ฐ ์ฑ์ฉ๊ณต๊ณ ๋ถ์ ๋ฐ ๋ฉด์ ์ค๋น ์์คํ
============================================================
[Step 1/6] ์ฌ์ฉ์ ์ ๋ณด ์
๋ ฅ
==================================================
์ฌ์ฉ์ ์ ๋ณด ์
๋ ฅ
==================================================
์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์
๋ ฅํ์ธ์: user@example.com
GitHub ํ๋กํ์ ์ถ๊ฐํ์๊ฒ ์ต๋๊น? (y/n): y
GitHub ํ๋กํ URL์ ์
๋ ฅํ์ธ์: https://github.com/username
ํ์ํฉ๋๋ค, user@example.com!
[Step 2/6] ์ฑ์ฉ๊ณต๊ณ ์
๋ ฅ
----------------------------------------
์ฑ์ฉ๊ณต๊ณ URL์ ์
๋ ฅํ์ธ์: https://example.com/job
[Step 3/6] ์ฑ์ฉ๊ณต๊ณ ๋ถ์
...
[Step 4/6] GitHub ํ๋กํ ๋ถ์
...
[Step 5/6] ์คํฌ ๊ฐญ ๋ถ์
...
[Step 6/6] ๋ฉด์ ์ง๋ฌธ ์์ฑ
...
============================================================
๋ถ์ ์๋ฃ!
============================================================
## ๊ณต๊ณ ๋ช
: [๊ณต๊ณ ๋ช
]
### ํ์ฌ๋ช
: [ํ์ฌ๋ช
]
**๋ง๊ฐ๊ธฐํ**
- [๋ง๊ฐ์ผ]
### A. ํ์ฌ์๊ฐ & ์ง๋ฌด ์๊ฐ
### B. ์๊ฒฉ์๊ฑด & ์ฐ๋์ฌํญ
### C. ํํ ๋ฐ ๋ณต์ง### 1. ๊ธฐ์ ์คํฌ ๋งค์นญ ๋ถ์
- ์ผ์นํ๋ ๊ธฐ์
- ๋ถ์กฑํ ํ์ ๊ธฐ์
- ์ง์์์ ์ถ๊ฐ ๊ธฐ์
### 2. ํ๋ก์ ํธ ๊ฒฝํ ๋ถ์
### 3. ๊ธฐ์ ์ฑ์๋ ํ๊ฐ
### 4. ์ข
ํฉ ๋งค์นญ ์ ์### A. ๋ถ์กฑํ ๊ธฐ์ ์ ๋ํ ์ง๋ฌธ
### B. ๋์ ๊ธฐ์ ์ ํ์ ๋ํ ์ง๋ฌธ
### C. ๊ธฐ์ ๊ฐญ ๊ทน๋ณต ๊ณํ ์ง๋ฌธ
### D. ํ๋ก์ ํธ ์ฌํ ์ง๋ฌธ
### E. ์ค์ ์
๋ฌด ์๋๋ฆฌ์ค ์ง๋ฌธ| ๋ ์ด์ด | ์ญํ | ์์กด ๊ฐ๋ฅ |
|---|---|---|
ui/ |
์ฌ์ฉ์ ์ธํฐํ์ด์ค | core, services, utils |
core/ |
ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง | utils |
services/ |
์ธ๋ถ ์๋น์ค ์ฐ๋ | utils |
utils/ |
๊ณตํต ์ ํธ๋ฆฌํฐ | ์์ |
| ๋ชจ๋ | ์ค๋ช |
|---|---|
main.py |
GUI ์ง์ ์ , ์ค์ ํ์ธ ํ ์๋์ฐ ์คํ |
src/ui/main_ui.py |
๋ฉ์ธ ๋ถ์ ํ๋ฉด, ๋ถ์ ํ์ดํ๋ผ์ธ ์คํ |
src/ui/settings_ui.py |
์ค์ ํ๋ฉด (Discord, Email, GitHub) |
src/core/chain.py |
JobSummaryChain, SkillGapChain |
src/core/mapreduce_chain.py |
๋์ฉ๋ ํ ์คํธ Map-Reduce ์ฒ๋ฆฌ |
src/core/lang_template.py |
์์ฝ/์คํฌ๊ฐญ/๋ฉด์ ์ง๋ฌธ ํ ํ๋ฆฟ |
src/services/github_analyzer.py |
GitHub API ์ฐ๋, ํ๋กํ ๋ถ์ |
src/services/email_sender.py |
Gmail SMTP ์ด๋ฉ์ผ ๋ฐ์ก |
src/services/discord_sender.py |
Discord ๋ฉ์์ง ์ ์ก |
src/utils/config_manager.py |
.env ํ๊ฒฝ๋ณ์ ๊ด๋ฆฌ |
src/utils/user_manager.py |
์ฌ์ฉ์ ์ ๋ณด ์์ง ๋ฐ ์ ์ฅ |
| ๊ตฌ๋ถ | ๊ท์น | ์์ |
|---|---|---|
| ํด๋์ค๋ช | PascalCase | JobSummaryChain, ConfigManager |
| ํจ์/๋ฉ์๋๋ช | snake_case | run_summary, validate_inputs |
| ์์ | UPPER_SNAKE_CASE | BASE_URL, SCHEMA |
| private ๋ฉ์๋ | underscore prefix | _initialize_llm, _create_chain |
"""
๋ชจ๋ ์ค๋ช
docstring
- ์ฃผ์ ๊ธฐ๋ฅ 1
- ์ฃผ์ ๊ธฐ๋ฅ 2
"""
# ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
import os
import sys
# ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from langchain_ollama.llms import OllamaLLM
# ๋ก์ปฌ ๋ชจ๋
from ..utils.config_manager import ConfigManagerfrom typing import Optional, Dict, List, Literal
def analyze_profile(self, github_url: str) -> Optional[GitHubProfile]:
"""GitHub ํ๋กํ ๋ถ์"""
...
def generate_questions(
self,
language: Literal["ko", "en"] = "ko"
) -> str:
...ui/ โ core/, services/, utils/ (ํ์ฉ)
core/ โ utils/ (ํ์ฉ)
services/ โ utils/ (ํ์ฉ)
ํ์ ๋ ์ด์ด โ ์์ ๋ ์ด์ด (๊ธ์ง)
ollama list
ollama serveollama pull llama3.2- 2๋จ๊ณ ์ธ์ฆ ํ์ฑํ ํ์ธ
- ์ฑ ๋น๋ฐ๋ฒํธ ์ฌ์ฉ (์ผ๋ฐ ๋น๋ฐ๋ฒํธ X)
GITHUB_TOKEN์ค์ ์ผ๋ก ์ ํ ์ํ
ํ์ฌ ๋ฒ์ : 0.1.0
- ์ด๋ฉ์ผ ์์ง ๋ฐ ๋ฐ์ก ๊ธฐ๋ฅ
- GitHub ํ๋กํ ๋ถ์ ๊ธฐ๋ฅ
- ์คํฌ ๊ฐญ ๋ถ์ ๊ธฐ๋ฅ
- ๋ง์ถคํ ๋ฉด์ ์ง๋ฌธ ์์ฑ (ํ๊ตญ์ด/์์ด)
- ์ฌ์ฉ์ ๋ฐ์ดํฐ ๋ก์ปฌ ์ ์ฅ
- LangChain API ๋ง์ด๊ทธ๋ ์ด์ (LCEL)
- Discord ๋ฉ์์ง ๊ธฐ๋ฅ
- ํ๋กฌํํธ ๊ฐ์
MIT License