Skip to content

jober3/jober-AI

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

153 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

JOBER AI - μ•Œλ¦Όν†‘ ν…œν”Œλ¦Ώ 생성기 πŸš€

AI 기반 카카였 μ•Œλ¦Όν†‘ ν…œν”Œλ¦Ώ μžλ™ 생성 μ‹œμŠ€ν…œ

Python FastAPI Chroma DB OpenAPI

핡심 κΈ°λŠ₯

3단계 ν…œν”Œλ¦Ώ 선택 μ‹œμŠ€ν…œ

  1. κΈ°μ‘΄ 승인 ν…œν”Œλ¦Ώ: predata νŒ¨ν„΄ 기반 검색 (μž„κ³„κ°’ 0.85)
  2. 곡용 ν…œν”Œλ¦Ώ: 168개 곡용 ν…œν”Œλ¦Ώ 검색 (μž„κ³„κ°’ 0.8)
  3. μƒˆ ν…œν”Œλ¦Ώ 생성: AI 기반 μ‹ κ·œ 생성 + 4-Tool 병렬 검증

LangGraph 기반 κ³ μ„±λŠ₯ 처리

  • Google Gemini 2.5 Pro + OpenAI GPT-4: LLM Fallback μ‹œμŠ€ν…œ
  • 7개 λ…Έλ“œ μ›Œν¬ν”Œλ‘œμš°: 쑰건뢀 λΌμš°νŒ… + 병렬 처리
  • conversationContext: 재질문 κΈ°λŠ₯ 지원
  • Agent1 병렬화: 3개 검증 μž‘μ—… λ™μ‹œ μ‹€ν–‰ (60% 단좕)
  • Agent2 병렬화: 4-Tool λ™μ‹œ 처리 (8초 β†’ 2-3초)

μ‹€μ‹œκ°„ μ±„νŒ… 지원

  • μ„Έμ…˜ 기반 λ³€μˆ˜ μ—…λ°μ΄νŠΈ: μ‹€μ‹œκ°„ ν…œν”Œλ¦Ώ μˆ˜μ •
  • ν…œν”Œλ¦Ώ 미리보기: 단계별 완성도 확인
  • WebSocket μ€€λΉ„: λ°±μ—”λ“œ 연동 지원

μ™„λ²½ν•œ API λ¬Έμ„œν™”

  • 28개 응닡 μŠ€ν‚€λ§ˆ: μ™„μ „ν•œ νƒ€μž… μ•ˆμ •μ„±
  • νƒœκ·Έλ³„ λΆ„λ₯˜: Template Generation, Real-time Chat, Session Management, System
  • Swagger UI: μžλ™ μƒμ„±λœ API λ¬Έμ„œ

μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

LangGraph μ›Œν¬ν”Œλ‘œμš° (μ„±λŠ₯ 60-85% ν–₯상)

μ‚¬μš©μž μž…λ ₯ (conversationContext 지원)
    ↓
validate_input_node: 병렬 검증 (3개 μž‘μ—… λ™μ‹œ μ‹€ν–‰)
    ↓
extract_variables_node: Agent1 λ³€μˆ˜ μΆ”μΆœ + μ˜λ„ 뢄석
    ↓
check_policy_node: 쒅합적인 μ •μ±… 검사
    ↓
select_template_node: 3단계 선택 μ‹œμŠ€ν…œ
   1️⃣ BasicTemplateMatcher (κΈ°μ‘΄ 승인 ν…œν”Œλ¦Ώ)
   2️⃣ PublicTemplateManager (168개 곡용 ν…œν”Œλ¦Ώ)
   3️⃣ LangGraph β†’ generate_template_node
    ↓
generate_template_node: Agent2 병렬 처리 (4-Tool λ™μ‹œ)
    ↓
validate_compliance_node: μ΅œμ’… μ»΄ν”ŒλΌμ΄μ–ΈμŠ€ 검증
    ↓
format_response_node: λ°±μ—”λ“œ API ν˜•μ‹ λ³€ν™˜

LangGraph 핡심 μ»΄ν¬λ„ŒνŠΈ

StateGraph μ›Œν¬ν”Œλ‘œμš°

  • 7개 λ…Έλ“œ + 쑰건뢀 λΌμš°νŒ…
  • JoberState 기반 μƒνƒœ 관리
  • λ°±μ—”λ“œ API 100% ν˜Έν™˜μ„± μœ μ§€

병렬 처리 λ…Έλ“œλ“€

  • validate_input_node: 3개 검증 병렬 μ‹€ν–‰
  • generate_template_node: 4-Tool λ™μ‹œ 처리
  • 60-85% μ„±λŠ₯ ν–₯상 달성

Template Selector

  • 3단계 선택 둜직 관리
  • μœ μ‚¬λ„ μž„κ³„κ°’ μ„€μ • 및 μ΅œμ ν™”
  • LangGraph μ›Œν¬ν”Œλ‘œμš° 톡합

Public Template Manager

  • 168개 곡용 ν…œν”Œλ¦Ώ 관리 (Chroma DB)
  • ν‚€μ›Œλ“œ + 벑터 ν•˜μ΄λΈŒλ¦¬λ“œ 검색
  • μžλ™ λ³€μˆ˜ λ§€ν•‘ μ‹œμŠ€ν…œ

LLM Provider Manager

  • Gemini β†’ OpenAI μžλ™ Fallback
  • μ‹€νŒ¨ 횟수 좔적 및 μš°μ„ μˆœμœ„ 관리
  • λͺ¨λΈλ³„ retry 둜직

Session Manager

  • Thread-safe μ„Έμ…˜ 관리
  • μ‹€μ‹œκ°„ λ³€μˆ˜ μ—…λ°μ΄νŠΈ
  • μžλ™ 만료 및 정리

λΉ λ₯Έ μ‹œμž‘

1. μ„€μΉ˜ 및 ν™˜κ²½ μ„€μ •

# λ ˆν¬μ§€ν† λ¦¬ 클둠
git clone https://github.com/your-username/Jober_ai.git
cd Jober_ai

# Python 3.11.13 μ„€μΉ˜ (ꢌμž₯)
pyenv install 3.11.13
pyenv local 3.11.13

# Poetry둜 μ˜μ‘΄μ„± μ„€μΉ˜
poetry install

2. ν™˜κ²½λ³€μˆ˜ μ„€μ •

# .env 파일 생성 (ν•„μˆ˜)
cp .env.example .env

# .env 파일 νŽΈμ§‘
cat > .env << EOF
# LLM API ν‚€ (λ‘˜ 쀑 ν•˜λ‚˜λŠ” ν•„μˆ˜)
GEMINI_API_KEY=your_gemini_api_key_here
OPENAI_API_KEY=your_openai_api_key_here

# λ³΄μ•ˆ μ„€μ • (ν•„μˆ˜)
SECRET_KEY=your-super-secret-key-32-characters-long

# 선택적 μ„€μ •
DEBUG=false
HOST=0.0.0.0
PORT=8000
LOG_LEVEL=INFO
EOF

3. μ„œλ²„ μ‹€ν–‰

# FastAPI μ„œλ²„ μ‹€ν–‰
python app/main.py

# λ˜λŠ” Poetry둜 μ‹€ν–‰
poetry run python app/main.py

# λ˜λŠ” uvicorn 직접 μ‹€ν–‰
poetry run uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload

4. API ν…ŒμŠ€νŠΈ

# ν…œν”Œλ¦Ώ 생성 μš”μ²­
curl -X POST http://localhost:8000/ai/templates \
  -H "Content-Type: application/json" \
  -d '{
    "userId": 123,
    "requestContent": "λ…μ„œλͺ¨μž„ μ•ˆλ‚΄ λ©”μ‹œμ§€λ₯Ό λ§Œλ“€μ–΄μ£Όμ„Έμš”",
    "conversationContext": null
  }'

# μ„œλ²„ μƒνƒœ 확인
curl http://localhost:8000/ai/health

# Swagger UI 접속
open http://localhost:8000/docs

API μ—”λ“œν¬μΈνŠΈ

Template Generation

POST /ai/templates

AI 기반 ν…œν”Œλ¦Ώ 생성 (재질문 지원)

μš”μ²­:

{
  "userId": 12345,
  "requestContent": "λ…μ„œλͺ¨μž„ μ•ˆλ‚΄ λ©”μ‹œμ§€ λ§Œλ“€μ–΄μ£Όμ„Έμš”",
  "conversationContext": null
}

성곡 응닡 (200):

{
  "id": 1,
  "userId": 12345,
  "categoryId": "004001",
  "title": "μ•Œλ¦Όν†‘",
  "content": "μ•ˆλ…•ν•˜μ„Έμš” #{고객λͺ…}λ‹˜!\n\n#{업체λͺ…}μ—μ„œ #{μ„œλΉ„μŠ€λͺ…} κ΄€λ ¨ν•˜μ—¬ μ•ˆλ‚΄λ“œλ¦½λ‹ˆλ‹€...",
  "imageUrl": null,
  "type": "MESSAGE",
  "buttons": [],
  "variables": [
    {
      "id": 1,
      "variableKey": "고객λͺ…",
      "placeholder": "#{고객λͺ…}",
      "inputType": "text",
      "value": "홍길동"
    }
  ],
  "industry": ["ꡐ윑", "λ¬Έν™”"],
  "purpose": ["μ•ˆλ‚΄", "μ˜ˆμ•½ν™•μΈ"]
}

정보 λΆ€μ‘± 응닡 (400):

{
  "detail": {
    "error": {
      "code": "INCOMPLETE_INFORMATION",
      "message": "μΆ”κ°€ 정보가 ν•„μš”ν•©λ‹ˆλ‹€",
      "details": {
        "confirmed_variables": {"업체λͺ…": "ABCμ„œμ "},
        "missing_variables": ["μΌμ‹œ", "μž₯μ†Œ", "μ—°λ½μ²˜"],
        "contextual_question": "λ…μ„œλͺ¨μž„ μΌμ‹œμ™€ μž₯μ†Œ, 문의 μ—°λ½μ²˜λ₯Ό μ•Œλ €μ£Όμ„Έμš”.",
        "original_input": "λ…μ„œλͺ¨μž„ μ•ˆλ‚΄ λ©”μ‹œμ§€ λ§Œλ“€μ–΄μ€˜"
      }
    },
    "timestamp": "2024-09-22T10:30:00Z"
  }
}

Real-time Chat

POST /ai/templates/{session_id}/variables

μ„Έμ…˜ λ³€μˆ˜ μ—…λ°μ΄νŠΈ

GET /ai/templates/{session_id}/preview

ν…œν”Œλ¦Ώ 미리보기 쑰회

POST /ai/templates/{session_id}/complete

ν…œν”Œλ¦Ώ μ΅œμ’… μ™„μ„±

Session Management

GET /ai/sessions/stats

μ„Έμ…˜ 톡계 쑰회

GET /ai/sessions

μ„Έμ…˜ λͺ©λ‘ 쑰회

System

GET /ai/health

κΈ°λ³Έ ν—¬μŠ€μ²΄ν¬

GET /ai/health/detailed

상세 ν—¬μŠ€μ²΄ν¬

GET /ai/health/llm

LLM 제곡자 ν…ŒμŠ€νŠΈ


ν…ŒμŠ€νŠΈ

API 톡합 ν…ŒμŠ€νŠΈ

# κΈ°λ³Έ ν…œν”Œλ¦Ώ 생성
curl -X POST http://localhost:8000/ai/templates \
  -H "Content-Type: application/json" \
  -d '{"userId": 123, "requestContent": "카페 이벀트 μ•ˆλ‚΄ λ©”μ‹œμ§€ λ§Œλ“€μ–΄μ£Όμ„Έμš”"}'

# 재질문 ν…ŒμŠ€νŠΈ
curl -X POST http://localhost:8000/ai/templates \
  -H "Content-Type: application/json" \
  -d '{
    "userId": 123,
    "requestContent": "μΌμ‹œλŠ” 3μ›” 15일, μž₯μ†ŒλŠ” κ°•λ‚¨κ΅¬μž…λ‹ˆλ‹€",
    "conversationContext": "카페 이벀트 μ•ˆλ‚΄ λ©”μ‹œμ§€ λ§Œλ“€μ–΄μ£Όμ„Έμš”"
  }'

# 비속어 κ²€μΆœ ν…ŒμŠ€νŠΈ
curl -X POST http://localhost:8000/ai/templates \
  -H "Content-Type: application/json" \
  -d '{"userId": 123, "requestContent": "바보야"}'

개발 도ꡬ

# μ½”λ“œ ν…ŒμŠ€νŠΈ μ‹€ν–‰
poetry run pytest tests/

# μ½”λ“œ ν’ˆμ§ˆ 검사
poetry run ruff check app/
poetry run black app/

# νƒ€μž… 검사
poetry run mypy app/

πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰

Jober_ai/
β”œβ”€β”€ README.md                           # ν”„λ‘œμ νŠΈ μ„€λͺ…μ„œ 
β”œβ”€β”€ pyproject.toml                      # Poetry μ˜μ‘΄μ„± μ„€μ •
β”œβ”€β”€ poetry.lock                         # Poetry 락 파일
β”œβ”€β”€ app/                               # 메인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 
β”‚   β”œβ”€β”€ main.py                        # FastAPI μ§„μž…μ 
β”‚   β”œβ”€β”€ api/                           # API μ—”λ“œν¬μΈνŠΈ
β”‚   β”‚   β”œβ”€β”€ templates.py               # ν…œν”Œλ¦Ώ 생성 API
β”‚   β”‚   β”œβ”€β”€ sessions.py                # μ„Έμ…˜ 관리 API
β”‚   β”‚   └── health.py                  # ν—¬μŠ€μ²΄ν¬ API
β”‚   β”œβ”€β”€ agents/                        # AI μ—μ΄μ „νŠΈ
β”‚   β”‚   β”œβ”€β”€ agent1.py                  # λ³€μˆ˜ μΆ”μΆœ + μ˜λ„ 뢄석
β”‚   β”‚   └── agent2.py                  # 4-Tool 병렬 검증
β”‚   β”œβ”€β”€ core/                          # 핡심 μ—”μ§„
β”‚   β”‚   β”œβ”€β”€ template_selector.py       # 3단계 선택 μ‹œμŠ€ν…œ
β”‚   β”‚   β”œβ”€β”€ public_template_manager.py # 168개 곡용 ν…œν”Œλ¦Ώ 관리
β”‚   β”‚   β”œβ”€β”€ session_manager.py         # μ„Έμ…˜ 관리
β”‚   β”‚   β”œβ”€β”€ template_preview.py        # λ―Έμ™„μ„±λœ ν…œν”Œλ¦Ώ 좜λ ₯
β”‚   β”‚   └── session_models.py          # μ„Έμ…˜ λͺ¨λΈ
β”‚   β”œβ”€β”€ tools/                         # 검증 도ꡬ
β”‚   β”‚   β”œβ”€β”€ blacklist_tool.py          # κΈˆμ§€μ–΄ 검사
β”‚   β”‚   β”œβ”€β”€ whitelist_tool.py          # ν—ˆμš© νŒ¨ν„΄ 검사
β”‚   β”‚   β”œβ”€β”€ info_comm_law_tool.py      # 정보톡신망법 검사
β”‚   β”‚   └── variable_mapper.py         # λ³€μˆ˜ λ§€ν•‘
β”‚   └── utils/                         # μœ ν‹Έλ¦¬ν‹°
β”‚       └── llm_provider_manager.py    # LLM Fallback μ‹œμŠ€ν…œ
β”œβ”€β”€ config/                            # μ„€μ • 파일
β”‚   β”œβ”€β”€ settings.py                    # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ •
β”‚   └── llm_providers.py               # LLM 제곡자 μ„€μ •
β”œβ”€β”€ data/                              # 데이터
β”‚   β”œβ”€β”€ templates/                     # 168개 곡용 ν…œν”Œλ¦Ώ
β”‚   β”œβ”€β”€ presets/                       # μ „μ²˜λ¦¬λœ 데이터
β”‚   └── docs/                          # μ •μ±… λ¬Έμ„œ
β”œβ”€β”€ tests/                             # ν…ŒμŠ€νŠΈ
β”‚   β”œβ”€β”€ test_template_selector.py      # ν…œν”Œλ¦Ώ 선택 ν…ŒμŠ€νŠΈ
β”‚   β”œβ”€β”€ test_template_validator.py     # 검증 μ‹œμŠ€ν…œ ν…ŒμŠ€νŠΈ
β”‚   └── test_integration.py            # 톡합 ν…ŒμŠ€νŠΈ
└── scripts/                           # μœ ν‹Έλ¦¬ν‹° 슀크립트
    └── debug_agent1_variables.py      # Agent1 디버깅

πŸ› οΈ μ£Όμš” 기술 μŠ€νƒ

AI & ML

  • LangGraph: μƒνƒœ 기반 μ›Œν¬ν”Œλ‘œμš° μ—”μ§„ (μ„±λŠ₯ 60-85% ν–₯상)
  • Google Gemini 2.5 Pro: μ΅œμ‹  μƒμ„±ν˜• AI (μ£Ό LLM)
  • OpenAI GPT-4: Fallback LLM
  • KoNLPy: ν•œκ΅­μ–΄ μžμ—°μ–΄ 처리
  • Chroma DB: 벑터 λ°μ΄ν„°λ² μ΄μŠ€ (μž„λ² λ”© μΊμ‹œ)

λ°±μ—”λ“œ

  • Python 3.11.13: μ•ˆμ •μ μΈ 파이썬 버전
  • FastAPI: κ³ μ„±λŠ₯ 비동기 μ›Ή ν”„λ ˆμž„μ›Œν¬
  • Pydantic: 데이터 검증 (28개 응닡 μŠ€ν‚€λ§ˆ)
  • Poetry: λͺ¨λ˜ μ˜μ‘΄μ„± 관리
  • uvicorn: ASGI μ„œλ²„

데이터 & 캐싱

  • 168개 곡용 ν…œν”Œλ¦Ώ: μ „μ²˜λ¦¬λœ ν…œν”Œλ¦Ώ DB
  • Chroma DB: 벑터 검색 및 캐싱
  • 768차원 μž„λ² λ”©: Gemini μž„λ² λ”© λͺ¨λΈ
  • Thread-safe μ„Έμ…˜: λ©”λͺ¨λ¦¬ 기반 μ„Έμ…˜ 관리

λ³΄μ•ˆ & ν’ˆμ§ˆ

λ³΄μ•ˆ κ°•ν™”

  • SECRET_KEY ν•„μˆ˜: ν™˜κ²½λ³€μˆ˜ ν•„μˆ˜ μ„€μ •
  • API ν‚€ 검증: LLM 제곡자 ν‚€ μœ νš¨μ„± 검사
  • CORS μ •μ±…: ν”„λ‘œλ•μ…˜ ν™˜κ²½ 도메인 μ œν•œ ꢌμž₯
  • μ—λŸ¬ 정보 μ œν•œ: DEBUG=false μ‹œ 상세 정보 μˆ¨κΉ€

ν’ˆμ§ˆ 보증

  • 4-Tool 병렬 검증: BlackList, WhiteList, κ°€μ΄λ“œλΌμΈ, 정보톡신망법
  • 자체 ν’ˆμ§ˆ 검증: TemplateValidator μ‹œμŠ€ν…œ
  • μž¬μƒμ„± 둜직: ν’ˆμ§ˆ 미달 μ‹œ μžλ™ μž¬μ‹œλ„
  • 완성도 좔적: μ„Έμ…˜λ³„ μ§„ν–‰λ₯  관리

Fallback μ‹œμŠ€ν…œ

  • LLM Fallback: Gemini β†’ OpenAI μžλ™ μ „ν™˜
  • μ‹€νŒ¨ 카운트: 연속 μ‹€νŒ¨ μ‹œ μš°μ„ μˆœμœ„ μ‘°μ •
  • μžλ™ 볡ꡬ: 정상 μž‘λ™ μ‹œ μ›λž˜ μ„€μ • 볡원

LangGraph κ΅¬ν˜„ μ™„λ£Œ

κ΅¬ν˜„λœ LangGraph μ›Œν¬ν”Œλ‘œμš°

7개 λ…Έλ“œλ‘œ κ΅¬μ„±λœ μ™„μ „ν•œ μ›Œν¬ν”Œλ‘œμš°:

  • validate_input_node: 병렬 μž…λ ₯ 검증 (3개 μž‘μ—… λ™μ‹œ)
  • extract_variables_node: Agent1 λ³€μˆ˜ μΆ”μΆœ + μ˜λ„ 뢄석
  • check_policy_node: 쒅합적인 μ •μ±… 검사
  • select_template_node: 3단계 ν…œν”Œλ¦Ώ 선택 μ‹œμŠ€ν…œ
  • generate_template_node: Agent2 병렬 처리 (4-Tool λ™μ‹œ)
  • validate_compliance_node: μ΅œμ’… μ»΄ν”ŒλΌμ΄μ–ΈμŠ€ 검증
  • format_response_node: λ°±μ—”λ“œ API ν˜•μ‹ λ³€ν™˜

μ„±λŠ₯ ν–₯상 κ²°κ³Ό

병렬 처리 μ΅œμ ν™”:

  • Agent1 처리: 순차 λŒ€λΉ„ 60% 단좕
  • Agent2 처리: κΈ°μ‘΄ 8초 β†’ 2-3초 (60-75% 단좕)
  • 전체 μ›Œν¬ν”Œλ‘œμš°: 60-85% μ„±λŠ₯ ν–₯상

μƒνƒœ 기반 λΌμš°νŒ…:

# 쑰건뢀 λΌμš°νŒ…μœΌλ‘œ 효율적인 λΆ„κΈ° 처리
workflow.add_conditional_edges(
    "validate_input",
    check_validation_status,
    {
        "valid": "extract_variables",
        "invalid": "format_response"  # 검증 μ‹€νŒ¨ μ‹œ μ¦‰μ‹œ 응닡
    }
)

μ•„ν‚€ν…μ²˜ κ°œμ„ μ‚¬ν•­

κΈ°μ‘΄ 문제점 ν•΄κ²°:

  • 순차 처리 β†’ 병렬 처리: Agent1, Agent2 λ‚΄λΆ€ 병렬화
  • λ³΅μž‘ν•œ μƒνƒœ 관리: LangGraph StateGraph둜 체계화
  • 였λ₯˜ 처리: 각 λ…Έλ“œλ³„ 체계적인 μ˜ˆμ™Έ 처리
  • λ°±μ—”λ“œ ν˜Έν™˜μ„±: 100% API ν˜Έν™˜μ„± μœ μ§€

LangGraph νŒ¨ν„΄ 적용:

  • StateGraph 기반 μ›Œν¬ν”Œλ‘œμš° μ •μ˜
  • TypedDict μƒνƒœ 관리 (JoberState)
  • 쑰건뢀 λΌμš°νŒ… 및 λΆ„κΈ° 처리
  • 비동기 λ…Έλ“œ μ‹€ν–‰

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 99.3%
  • Shell 0.7%