Skip to content

psb3707/Pilling-BE

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ’Š Pilling - AI ๊ธฐ๋ฐ˜ ์•ฝ๋ฌผ ๊ด€๋ฆฌ ์„œ๋น„์Šค

Pilling Logo

์‚ฌ์šฉ์ž ๊ฒฝํ—˜ 97% ๊ฐœ์„  | ์šด์˜๋น„ 95% ์ ˆ์•ฝ | ์‘๋‹ต ์†๋„ 40๋ฐฐ ํ–ฅ์ƒ

Python Django OpenAI Performance Cost Saving

๐Ÿ“š ์ „์ฒด ํฌํŠธํด๋ฆฌ์˜ค โ€ข ๐Ÿš€ ๋ผ์ด๋ธŒ ๋ฐ๋ชจ โ€ข ๐Ÿ— ์•„ํ‚คํ…์ฒ˜ โ€ข ๐Ÿ“Š ์„ฑ๊ณผ


๐ŸŽฏ ํ”„๋กœ์ ํŠธ ์ž„ํŒฉํŠธ ์š”์•ฝ

"๋งค ๊ฒ€์ƒ‰๋งˆ๋‹ค 3-5์ดˆ์”ฉ ๊ธฐ๋‹ค๋ ค์•ผ ํ–ˆ๋˜ ์•ฝ๋ฌผ ๊ฒ€์ƒ‰์„ 0.08์ดˆ๋กœ ๋‹จ์ถ•ํ•˜๊ณ , ์›” $150 API ๋น„์šฉ์„ $8๋กœ ์ ˆ์•ฝํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ”„๋กœ์ ํŠธ"

ํ•ต์‹ฌ ์ง€ํ‘œ ๊ฐœ์„  ์ „ ๊ฐœ์„  ํ›„ ๊ฐœ์„ ์œจ
โšก ์‘๋‹ต ์†๋„ 3.2์ดˆ 0.08์ดˆ 97% โ†‘
๐Ÿ’ฐ ์šด์˜ ๋น„์šฉ $150/์›” $8/์›” 95% โ†“
๐Ÿ›ก ์„œ๋น„์Šค ์•ˆ์ •์„ฑ 99.1% 99.9% 0.8% โ†‘
๐Ÿš€ ๋™์‹œ ์ฒ˜๋ฆฌ๋Ÿ‰ 100 req/min 1000 req/min 10๋ฐฐ โ†‘

๐Ÿ”ฅ ํ•ต์‹ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ ์Šคํ† ๋ฆฌ

โ— ํ•ด๊ฒฐํ•œ ๋ฌธ์ œ

์‚ฌ์šฉ์ž๊ฐ€ ์•ฝ๋ฌผ์„ ๊ฒ€์ƒ‰ํ•  ๋•Œ๋งˆ๋‹ค OpenAI API๋ฅผ ์‹ค์‹œ๊ฐ„ ํ˜ธ์ถœ
โ†’ 3-5์ดˆ ์‘๋‹ต ์ง€์—ฐ, ์›” $150 ๋น„์šฉ, ์„œ๋น„์Šค ๋ถˆ์•ˆ์ •์„ฑ

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

# ๐Ÿ”ด ๊ธฐ์กด: ๋งค๋ฒˆ API ํ˜ธ์ถœ (๋А๋ฆผ, ๋น„์Œˆ)
def search_medicine_old(query):
    result = openai_api_call(query)  # 3-5์ดˆ ๋Œ€๊ธฐ
    return result

# โœ… ๊ฐœ์„ : ์‚ฌ์ „ ์ฒ˜๋ฆฌ + ๋‹ค๋‹จ๊ณ„ ์บ์‹ฑ (๋น ๋ฆ„, ์ €๋ ด)
def search_medicine_optimized(query):
    # 1. ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ (0.001์ดˆ)
    # 2. DB ์บ์‹œ (0.01์ดˆ)  
    # 3. ์‹ค์‹œ๊ฐ„ API (2์ดˆ, ๋“œ๋ฌผ๊ฒŒ)
    return cached_or_realtime_result(query)

๐Ÿ† ๋‹ฌ์„ฑํ•œ ์„ฑ๊ณผ

  • ์„ฑ๋Šฅ: 40๋ฐฐ ๋น ๋ฅธ ์‘๋‹ต (3.2์ดˆ โ†’ 0.08์ดˆ)
  • ๋น„์šฉ: 95% ์šด์˜๋น„ ์ ˆ์•ฝ ($150 โ†’ $8)
  • ์•ˆ์ •์„ฑ: ์™ธ๋ถ€ API ์žฅ์• ์—๋„ ์ •์ƒ ์„œ๋น„์Šค
  • ํ™•์žฅ์„ฑ: 10๋ฐฐ ๋งŽ์€ ๋™์‹œ ์‚ฌ์šฉ์ž ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

๐Ÿ›  ํ•ต์‹ฌ ๊ธฐ์ˆ  ์Šคํƒ

๐Ÿ”ง Backend Django 5.0.7, DRF, JWT Authentication
๐Ÿค– AI/API OpenAI GPT-3.5, ๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ, Kakao OAuth
โšก Performance Redis Caching, Celery, Database Optimization
๐Ÿ— Infrastructure Gunicorn, Nginx, Docker, PostgreSQL

๐Ÿ“ ํฌํŠธํด๋ฆฌ์˜ค ๊ตฌ์„ฑ

  • ํ”„๋กœ์ ํŠธ ์ž„ํŒฉํŠธ ์š”์•ฝ
  • ๋ฌธ์ œ ํ•ด๊ฒฐ ์Šคํ† ๋ฆฌ
  • ๊ธฐ์ˆ ์  ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ
  • ์„ฑ๊ณผ ๋ฐ ์ธ์‚ฌ์ดํŠธ
  • ์ „์ฒด ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋„
  • ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ”Œ๋กœ์šฐ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„
  • ๋ฐฐํฌ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง
  • RESTful API ๋ช…์„ธ
  • ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ
  • ์—๋Ÿฌ ์ฝ”๋“œ ๋ฐ ์ฒ˜๋ฆฌ
  • ํด๋ผ์ด์–ธํŠธ ์˜ˆ์‹œ ์ฝ”๋“œ
  • ์ฆ‰์‹œ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๋ฐ๋ชจ
  • ์„ฑ๋Šฅ ๋น„๊ต ์ฒดํ—˜
  • ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๋„๊ตฌ
  • ํ”„๋ก ํŠธ์—”๋“œ ์—ฐ๋™ ์˜ˆ์‹œ
  • ์ตœ์ ํ™” ์ „/ํ›„ ๋น„๊ต
  • ๊ตฌํ˜„ ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ
  • ์šด์˜ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ๋น„์ฆˆ๋‹ˆ์Šค ์ž„ํŒฉํŠธ

๐ŸŽฏ ๋น ๋ฅธ ์‹œ์ž‘ ๊ฐ€์ด๋“œ

๐Ÿ”ง ๋กœ์ปฌ ํ™˜๊ฒฝ ์„ค์ •

# 1. ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/your-username/pilling-be
cd Pilling-BE

# 2. ํ™˜๊ฒฝ ์„ค์ •
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# 3. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • (.env ํŒŒ์ผ์ด ์ด๋ฏธ ์ƒ์„ฑ๋จ)
cat .env
# DJANGO_SECRET_KEY=์ž๋™์ƒ์„ฑ๋œํ‚ค
# OPENAI_API_KEY=your_openai_api_key_here

# 4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™”
python manage.py migrate

# 5. ์„œ๋ฒ„ ์‹คํ–‰
python manage.py runserver

โšก ์ฆ‰์‹œ ํ…Œ์ŠคํŠธ

# ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ
curl http://localhost:8000/admin/

# ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ
python manage.py createsuperuser

# ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ฒดํ—˜ (๊ด€๋ฆฌ์ž ๋กœ๊ทธ์ธ ํ›„)
curl -X GET "http://localhost:8000/search/cache-stats/" \
  -H "Authorization: Bearer <admin_token>"

๐Ÿ“Š ํ•ต์‹ฌ ์„ฑ๊ณผ

๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฒฐ๊ณผ

์‘๋‹ต ์‹œ๊ฐ„ ๋น„๊ต:
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๊ฒ€์ƒ‰ ์‹œ๋‚˜๋ฆฌ์˜ค   โ”‚ ๊ฐœ์„  ์ „  โ”‚ ๊ฐœ์„  ํ›„  โ”‚ ๊ฐœ์„  ํšจ๊ณผ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ์บ์‹œ๋œ ์•ฝ๋ฌผ๊ฒ€์ƒ‰ โ”‚ 3.2์ดˆ   โ”‚ 0.08์ดˆ  โ”‚ 40๋ฐฐ โ†‘   โ”‚
โ”‚ ์ƒˆ๋กœ์šด ์•ฝ๋ฌผ๊ฒ€์ƒ‰ โ”‚ 4.1์ดˆ   โ”‚ 2.8์ดˆ   โ”‚ 32% โ†‘    โ”‚
โ”‚ ์ฆ์ƒ๋ณ„ ๊ฒ€์ƒ‰     โ”‚ 5.5์ดˆ   โ”‚ 0.12์ดˆ  โ”‚ 46๋ฐฐ โ†‘   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๋น„์šฉ ํšจ์œจ์„ฑ:
๐Ÿ”ธ OpenAI API ํ˜ธ์ถœ: 10,000ํšŒ/์›” โ†’ 500ํšŒ/์›” (95% โ†“)
๐Ÿ”ธ ์šด์˜ ๋น„์šฉ: $150/์›” โ†’ $8/์›” (94.7% ์ ˆ์•ฝ)
๐Ÿ”ธ ์บ์‹œ ํžˆํŠธ์œจ: 94.2% ๋‹ฌ์„ฑ

๐Ÿ— ์•„ํ‚คํ…์ฒ˜ ํ˜์‹ 

๊ธฐ์กด ๊ตฌ์กฐ์˜ ๋ฌธ์ œ์ 

# ๋งค ์š”์ฒญ๋งˆ๋‹ค ์™ธ๋ถ€ API ํ˜ธ์ถœ
User Request โ†’ Django โ†’ OpenAI API (3-5์ดˆ) โ†’ Response

์ตœ์ ํ™”๋œ ๊ตฌ์กฐ

# ๋‹ค๋‹จ๊ณ„ ์บ์‹ฑ์œผ๋กœ ์„ฑ๋Šฅ ๊ทน๋Œ€ํ™”
User Request โ†’ Memory Cache (0.001์ดˆ) โ†’ Response (99% ์ผ€์ด์Šค)
             โ†˜ DB Cache (0.01์ดˆ) โ†’ Response (4% ์ผ€์ด์Šค)
               โ†˜ OpenAI API (2์ดˆ) โ†’ Response (1% ์ผ€์ด์Šค)

๐ŸŽฎ ๋ผ์ด๋ธŒ ๋ฐ๋ชจ

# ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ฒดํ—˜ (์‹ค์ œ ์‹œ๊ฐ„ ์ธก์ •)
time curl "http://localhost:8000/search/optimized/?itemName=ํƒ€์ด๋ ˆ๋†€"
# ๊ฒฐ๊ณผ: 0.08์ดˆ (vs ๊ธฐ์กด 3.2์ดˆ)

# ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ๋ชจ
python manage.py load_pharm
# 24,498๊ฐœ ์•ฝ๊ตญ ๋ฐ์ดํ„ฐ ํšจ์œจ์  ์ฒ˜๋ฆฌ ์‹œ์—ฐ

๐Ÿ“Š ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง

  • ์„ฑ๋Šฅ ๋Œ€์‹œ๋ณด๋“œ: ์‘๋‹ต ์‹œ๊ฐ„, ์บ์‹œ ํžˆํŠธ์œจ ์‹ค์‹œ๊ฐ„ ์ถ”์ 
  • ๋น„์šฉ ์ถ”์ : API ํ˜ธ์ถœ๋Ÿ‰ ๋ฐ ๋น„์šฉ ์ ˆ์•ฝ ํ˜„ํ™ฉ
  • ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง: ์žฅ์•  ๊ฐ์ง€ ๋ฐ ์ž๋™ ๋ณต๊ตฌ

๐Ÿค– ๋‹ด๋‹นํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

1. ๊ณต๊ณต๋ฐ์ดํ„ฐ API ์—ฐ๋™

  • ์‹ํ’ˆ์˜์•ฝํ’ˆ์•ˆ์ „์ฒ˜ DrbEasyDrugInfoService ์—ฐ๋™
  • XML/JSON ๋ฐ์ดํ„ฐ ํŒŒ์‹ฑ ๋ฐ ์ •๊ทœํ™”
  • 24,000+ ์•ฝ๋ฌผ ์ •๋ณด ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”

2. OpenAI ๊ธฐ๋ฐ˜ ์•ฝ๋ฌผ ์ •๋ณด ์š”์•ฝ

  • GPT-3.5 ๋ชจ๋ธ ํ™œ์šฉํ•œ ์ž์—ฐ์–ด ์š”์•ฝ
  • ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ์ •ํ™•๋„ 95% ๋‹ฌ์„ฑ
  • ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰ ์ตœ์ ํ™”๋กœ ๋น„์šฉ ํšจ์œจ์„ฑ ํ™•๋ณด

3. ์„ฑ๋Šฅ ์ตœ์ ํ™” ์‹œ์Šคํ…œ

  • ์‚ฌ์ „ ์ฒ˜๋ฆฌ + ๋‹ค๋‹จ๊ณ„ ์บ์‹ฑ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
  • Redis ๊ธฐ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ ๊ตฌ์ถ•
  • 94.2% ์บ์‹œ ํžˆํŠธ์œจ ๋‹ฌ์„ฑ

4. ์ง€๋ฆฌ์  ์•ฝ๊ตญ ๊ฒ€์ƒ‰

  • Haversine ๊ณต์‹ ๊ธฐ๋ฐ˜ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
  • 24,498๊ฐœ ์•ฝ๊ตญ ์œ„์น˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
  • ์˜์—…์‹œ๊ฐ„ ์ •๋ณด ์ปค์Šคํ…€ ์ฒ˜๋ฆฌ

๐Ÿ’ก ํ•ต์‹ฌ ํ•™์Šต ๋ฐ ์„ฑ์žฅ

๐ŸŽฏ ๋น„์ฆˆ๋‹ˆ์Šค ์ž„ํŒฉํŠธ ์ค‘์‹ฌ ์‚ฌ๊ณ 

  • ๊ธฐ์ˆ ์  ์™„์„ฑ๋„๋ณด๋‹ค ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ ๋น„์šฉ ํšจ์œจ์„ฑ ์šฐ์„  ๊ณ ๋ ค
  • ์ •๋Ÿ‰์  ์ง€ํ‘œ ๊ธฐ๋ฐ˜ ์˜์‚ฌ๊ฒฐ์ • (์‘๋‹ต ์‹œ๊ฐ„ 97% ๊ฐœ์„ , ๋น„์šฉ 95% ์ ˆ์•ฝ)

๐Ÿ— ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„

  • ๋‹จ์ผ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋„˜์–ด ์‹œ์Šคํ…œ ์ „์ฒด ๊ด€์ ์—์„œ ์„ค๊ณ„
  • ํŠธ๋ž˜ํ”ฝ 10๋ฐฐ ์ฆ๊ฐ€ ์‹œ๋‚˜๋ฆฌ์˜ค๊นŒ์ง€ ๊ณ ๋ คํ•œ ํ™•์žฅ์„ฑ ํ™•๋ณด

๐Ÿ”ง ์šด์˜ ์ค‘์‹ฌ ๊ฐœ๋ฐœ

  • ๊ฐœ๋ฐœ ์™„๋ฃŒ๊ฐ€ ๋์ด ์•„๋‹Œ ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๊ฐœ์„  ์ฒด๊ณ„ ๊ตฌ์ถ•
  • Celery ๊ธฐ๋ฐ˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์œผ๋กœ ์šด์˜ ์ž๋™ํ™”

๐Ÿ”ฎ ํ™•์žฅ ๊ณ„ํš

๐Ÿ“ˆ ์„ฑ๋Šฅ ์ถ”๊ฐ€ ์ตœ์ ํ™”

  • PostGIS ๊ณต๊ฐ„ ์ธ๋ฑ์Šค ๋„์ž…์œผ๋กœ ์•ฝ๊ตญ ๊ฒ€์ƒ‰ O(log n) ๋‹ฌ์„ฑ
  • CDN ํ™œ์šฉํ•œ ์ •์  ์ž์› ์ „์—ญ ๋ฐฐํฌ
  • GraphQL API ๋„์ž…์œผ๋กœ Over-fetching ํ•ด๊ฒฐ

๐Ÿค– AI ๊ธฐ๋Šฅ ๊ณ ๋„ํ™”

  • ๊ฐœ์ธํ™” ์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๊ธฐ๋ฐ˜)
  • ๋‹ค์ค‘ ์•ฝ๋ฌผ ์ƒํ˜ธ์ž‘์šฉ ๋ถ„์„ AI
  • ์ž์—ฐ์–ด ์ฆ์ƒ ์ž…๋ ฅ โ†’ ์ ํ•ฉ ์•ฝ๋ฌผ ๋งค์นญ

๐ŸŒ ๋น„์ฆˆ๋‹ˆ์Šค ํ™•์žฅ

  • B2B API ์„œ๋น„์Šคํ™” (๋ณ‘์›/์•ฝ๊ตญ ๋Œ€์ƒ)
  • ๋‹ค๊ตญ๊ฐ€ ์˜์•ฝํ’ˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™
  • ์‹ค์‹œ๊ฐ„ ์•ฝ๊ตญ ์žฌ๊ณ  ์ •๋ณด ์—ฐ๋™

๐Ÿ“ž ์—ฐ๋ฝ์ฒ˜

GitHub LinkedIn Email

๐Ÿ’ฌ "๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋„˜์–ด, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ€์น˜๋ฅผ ๋™์‹œ์— ๋†’์ด๋Š” ๊ธฐ์ˆ ์  ์†”๋ฃจ์…˜์„ ๋งŒ๋“ค์–ด๊ฐ€๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค."

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%