ginipick commited on
Commit
01adeab
ยท
verified ยท
1 Parent(s): 9a08b0c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +168 -65
app.py CHANGED
@@ -3,7 +3,7 @@
3
  from flask import Flask, render_template_string, jsonify, request
4
  import requests
5
  import json
6
- from datetime import datetime
7
  from typing import List, Dict, Optional
8
  import os
9
  import sys
@@ -698,12 +698,12 @@ HTML_TEMPLATE = """
698
 
699
  <!-- ํ‘ธํ„ฐ -->
700
  <div class="footer">
701
- <p>๐Ÿค– AI ๋‰ด์Šค LLM ๋ถ„์„ ์‹œ์Šคํ…œ v3.2</p>
702
  <p style="margin-top: 10px; font-size: 0.9em;">
703
- ๐Ÿ’พ SQLite DB ์˜๊ตฌ ์ €์žฅ | ๐ŸŒ AI Times ์‹ค์‹œ๊ฐ„ ํฌ๋กค๋ง | ๐Ÿค— Hugging Face Trending API | ๐Ÿง  Powered by Fireworks AI (Qwen3-235B)
704
  </p>
705
  <p style="margin-top: 10px; font-size: 0.85em; color: #999;">
706
- ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜: AI Times (์‹ค์‹œ๊ฐ„ ํฌ๋กค๋ง), Hugging Face | ์‹ค์‹œ๊ฐ„ ๋ถ„์„: Fireworks AI
707
  </p>
708
  </div>
709
  </div>
@@ -1081,27 +1081,27 @@ class LLMAnalyzer:
1081
  {
1082
  "role": "system",
1083
  "content": """๋‹น์‹ ์€ ์ค‘๊ณ ๋“ฑํ•™์ƒ๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ AI ๋‰ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค.
1084
- ํ•œ๊ตญ์–ด๋กœ ๋‹ต๋ณ€ํ•˜๋ฉฐ, ๋‹ค์Œ ํ˜•์‹์˜ JSON์œผ๋กœ๋งŒ ์‘๋‹ตํ•˜์„ธ์š”:
1085
 
1086
- {
1087
- "summary": "๋‰ด์Šค ๋‚ด์šฉ์„ 8-10๋ฌธ์žฅ์œผ๋กœ ์ž์„ธํ•˜๊ณ  ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช… (์ˆ˜์น˜, ์‚ฌ์‹ค, ๋ฐฐ๊ฒฝ ํฌํ•จ)",
1088
- "significance": "์ด ๋‰ด์Šค๊ฐ€ ์™œ ์ค‘์š”ํ•œ์ง€ 2-3๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช…",
1089
- "impact_level": "high ๋˜๋Š” medium ๋˜๋Š” low",
1090
- "impact_text": "๋†’์Œ ๋˜๋Š” ์ค‘๊ฐ„ ๋˜๋Š” ๋‚ฎ์Œ",
1091
- "impact_description": "์–ด๋–ค ์˜ํ–ฅ์ด ์žˆ์„์ง€ 2-3๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช…",
1092
- "action": "์ค‘๊ณ ๋“ฑํ•™์ƒ์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ 2-3๋ฌธ์žฅ์œผ๋กœ ์ œ์•ˆ"
1093
- }
1094
 
1095
- ๋ฐ˜๋“œ์‹œ ์œ„ ํ˜•์‹์˜ JSON๋งŒ ์ถœ๋ ฅํ•˜์„ธ์š”."""
1096
  },
1097
  {
1098
  "role": "user",
1099
  "content": f"""๋‹ค์Œ AI ๋‰ด์Šค๋ฅผ ์ค‘๊ณ ๋“ฑํ•™์ƒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ถ„์„ํ•ด์ฃผ์„ธ์š”:
1100
 
1101
- ์ œ๋ชฉ: {title}
1102
 
1103
- ๊ฐ ํ•ญ๋ชฉ์„ ๊ตฌ์ฒด์ ์ด๊ณ  ์ž์„ธํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋˜, ์ค‘๊ณ ๋“ฑํ•™์ƒ ์ˆ˜์ค€์— ๋งž์ถฐ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
1104
- ํŠนํžˆ summary๋Š” 8-10๋ฌธ์žฅ์œผ๋กœ ์ถฉ๋ถ„ํžˆ ์ƒ์„ธํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์„ธ์š”."""
1105
  }
1106
  ]
1107
 
@@ -1134,13 +1134,13 @@ class LLMAnalyzer:
1134
  analysis_templates = {
1135
  "์ฑ—GPT": {
1136
  "summary": """๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ(MS)๋Š” ์ฑ—GPT์˜ ํญ๋ฐœ์ ์ธ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ์„ผํ„ฐ ์šฉ๋Ÿ‰์ด ๋ถ€์กฑํ•œ ์‹ฌ๊ฐํ•œ ์ƒํ™ฉ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค.
1137
- ํ˜„์žฌ ๋ฏธ๊ตญ ๋‚ด ์—ฌ๋Ÿฌ ํ•ต์‹ฌ ์ง€์—ญ์—์„œ ๋ฌผ๋ฆฌ์  ๊ณต๊ฐ„๊ณผ ์„œ๋ฒ„ ์šฉ๋Ÿ‰์ด ๋ชจ๋‘ ํ•œ๊ณ„์— ๋„๋‹ฌํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
1138
- ํŠนํžˆ ๋ฒ„์ง€๋‹ˆ์•„์™€ ํ…์‚ฌ์Šค ๋“ฑ ์ฃผ์š” ํด๋ผ์šฐ๋“œ ํ—ˆ๋ธŒ ์ง€์—ญ์—์„œ๋Š” 2026๋…„ ์ƒ๋ฐ˜๊ธฐ๊นŒ์ง€ ์‹ ๊ทœ Azure ํด๋ผ์šฐ๋“œ ๊ตฌ๋…์ด ์ œํ•œ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.
1139
- ์ด๋Š” ์ƒ์„ฑํ˜• AI ์„œ๋น„์Šค์˜ ๊ธ‰๊ฒฉํ•œ ์„ฑ์žฅ ์†๋„๊ฐ€ ๊ธฐ์—…๋“ค์˜ ์ธํ”„๋ผ ์ค€๋น„ ๋Šฅ๋ ฅ์„ ํฌ๊ฒŒ ์ดˆ๊ณผํ•˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
1140
- MS๋Š” ๋ฐ์ดํ„ฐ์„ผํ„ฐ ํ™•์žฅ์„ ์œ„ํ•ด ๋ง‰๋Œ€ํ•œ ํˆฌ์ž๋ฅผ ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์‹ค์ œ ์ธํ”„๋ผ ๊ตฌ์ถ•์—๋Š” ์ตœ์†Œ 2-3๋…„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.
1141
- ์ด๋Ÿฌํ•œ ๊ณต๊ธ‰ ๋ถ€์กฑ ํ˜„์ƒ์€ AI ์„œ๋น„์Šค ๊ฐ€๊ฒฉ ์ƒ์Šน๊ณผ ์ ‘๊ทผ์„ฑ ์ œํ•œ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ,
1142
- ๊ฒฝ์Ÿ์‚ฌ๋“ค๋„ ์œ ์‚ฌํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
1143
- ์ „๋ฌธ๊ฐ€๋“ค์€ ์ด ์ƒํ™ฉ์ด AI ์‚ฐ์—…์˜ ์„ฑ์žฅ ์†๋„๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ถ„์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.""",
1144
  "significance": "์ด ๋‰ด์Šค๋Š” AI ๊ธฐ์ˆ ์˜ ๋Œ€์ค‘ํ™” ์†๋„๊ฐ€ ๊ธฐ์—…๋“ค์˜ ์˜ˆ์ƒ์„ ํ›จ์”ฌ ๋›ฐ์–ด๋„˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. MS ๊ฐ™์€ ๊ธ€๋กœ๋ฒŒ IT ๊ธฐ์—…๋„ AI ์ˆ˜์š”๋ฅผ ๋”ฐ๋ผ์žก๊ธฐ ์œ„ํ•ด ๊ณ ๊ตฐ๋ถ„ํˆฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Š” AI๊ฐ€ ๋‹จ์ˆœํ•œ ์œ ํ–‰์ด ์•„๋‹Œ ์‚ฐ์—… ์ „๋ฐ˜์„ ๋ณ€ํ™”์‹œํ‚ค๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ ์ž„์„ ์ฆ๋ช…ํ•ฉ๋‹ˆ๋‹ค.",
1145
  "impact_level": "high",
1146
  "impact_text": "๋†’์Œ",
@@ -1149,12 +1149,12 @@ class LLMAnalyzer:
1149
  },
1150
  "GPU": {
1151
  "summary": """๋ฏธ๊ตญ ์ •๋ถ€๊ฐ€ ์•„๋ž์—๋ฏธ๋ฆฌํŠธ(UAE)์— ์ตœ์ฒจ๋‹จ AI ์นฉ(GPU) ์ˆ˜์ถœ์„ ๊ณต์‹์ ์œผ๋กœ ์Šน์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
1152
- ์ด๋ฒˆ ์Šน์ธ์€ UAE ๋‚ด์—์„œ ๋ฏธ๊ตญ ๊ธฐ์—…์ด ์ง์ ‘ ์šด์˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ์„ผํ„ฐ์—๋งŒ ํ•œ์ •๋˜๋ฉฐ, ํŠนํžˆ ์˜คํ”ˆAI ์ „์šฉ 5๊ธฐ๊ฐ€์™€ํŠธ(GW) ๊ทœ๋ชจ์˜ ๋Œ€ํ˜• ๋ฐ์ดํ„ฐ์„ผํ„ฐ ๊ตฌ์ถ•์— ์‚ฌ์šฉ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
1153
- GPU๋Š” AI ๋ชจ๋ธ ํ•™์Šต๊ณผ ์ถ”๋ก ์— ํ•„์ˆ˜์ ์ธ ํ•˜๋“œ์›จ์–ด๋กœ, ์ˆ˜์ฒœ ๊ฐœ์˜ ์—ฐ์‚ฐ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.
1154
- ํ˜„์žฌ GPU ์‹œ์žฅ์€ ์—”๋น„๋””์•„๊ฐ€ ์•ฝ 80% ์ด์ƒ์„ ์žฅ์•…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํŠนํžˆ AI ์ „์šฉ H100, H200 ์นฉ์€ ๊ณต๊ธ‰ ๋ถ€์กฑ ํ˜„์ƒ์ด ์‹ฌ๊ฐํ•ฉ๋‹ˆ๋‹ค.
1155
- ์ด๋ฒˆ ๊ฒฐ์ •์œผ๋กœ ์—”๋น„๋””์•„์˜ ์‹œ๊ฐ€์ด์•ก์ด 5์กฐ ๋‹ฌ๋Ÿฌ์— ๊ทผ์ ‘ํ•  ๊ฒƒ์œผ๋กœ ์›”์ŠคํŠธ๋ฆฌํŠธ๋Š” ์ „๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
1156
- ํ•œํŽธ, ์ด๋Š” ๋ฏธ๊ตญ์˜ ์ „๋žต์  ๊ธฐ์ˆ  ์ˆ˜์ถœ ์ •์ฑ… ๋ณ€ํ™”๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ค‘์š”ํ•œ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.
1157
- ์ค‘๊ตญ์— ๋Œ€ํ•ด์„œ๋Š” ์—„๊ฒฉํ•œ ์ˆ˜์ถœ ํ†ต์ œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„, ์ค‘๋™์˜ ์ฃผ์š” ๋™๋งน๊ตญ์—๋Š” ์„ ๋ณ„์ ์œผ๋กœ ํ—ˆ์šฉํ•˜๋Š” '๊ธฐ์ˆ  ๋™๋งน' ์ „๋žต์„ ๊ตฌ์‚ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.""",
1158
  "significance": "์ด๋Š” ๋ฏธ๊ตญ์˜ AI ๊ธฐ์ˆ  ์ˆ˜์ถœ ์ •์ฑ… ๋ณ€ํ™”๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ค‘์š”ํ•œ ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ํŒจ๊ถŒ ๊ฒฝ์Ÿ ์†์—์„œ๋„ ์ „๋žต์  ๋™๋งน๊ตญ๊ณผ์˜ ํ˜‘๋ ฅ์„ ํ†ตํ•ด AI ์ƒํƒœ๊ณ„๋ฅผ ํ™•์žฅํ•˜๋ ค๋Š” ๋ฏธ๊ตญ์˜ ์˜๋„๋ฅผ ์—ฟ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
1159
  "impact_level": "medium",
1160
  "impact_text": "์ค‘๊ฐ„",
@@ -1163,12 +1163,12 @@ class LLMAnalyzer:
1163
  },
1164
  "์†Œ๋ผ": {
1165
  "summary": """์˜คํ”ˆAI์˜ ํ˜์‹ ์ ์ธ AI ๋™์˜์ƒ ์ƒ์„ฑ ์•ฑ '์†Œ๋ผ(Sora)'๊ฐ€ ์ถœ์‹œ ๋‹จ 5์ผ ๋งŒ์— 100๋งŒ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ŒํŒŒํ•˜๋Š” ๊ฒฝ์ด์ ์ธ ๊ธฐ๋ก์„ ์„ธ์› ์Šต๋‹ˆ๋‹ค.
1166
- ์ด๋Š” ์ „์„ค์ ์ธ ์ฑ—GPT๋ณด๋‹ค๋„ ๋น ๋ฅธ ์„ฑ์žฅ ์†๋„์ด๋ฉฐ, ์ดˆ๋Œ€ ์ „์šฉ(invite-only) ๋ฐฉ์‹์˜ ์ œํ•œ์  ์ถœ์‹œ์ž„์„ ๊ณ ๋ คํ•˜๋ฉด ๋”์šฑ ๋†€๋ผ์šด ์„ฑ๊ณผ์ž…๋‹ˆ๋‹ค.
1167
- ์†Œ๋ผ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ ํ”„๋กฌํ”„ํŠธ๋งŒ์œผ๋กœ ์ตœ๋Œ€ 1๋ถ„ ๊ธธ์ด์˜ ๊ณ ํ’ˆ์งˆ ๋™์˜์ƒ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์„ฑํ˜• AI ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
1168
- ํ˜„์žฌ ๋ฏธ๊ตญ๊ณผ ์บ๋‚˜๋‹ค์—์„œ iOS ์ „์šฉ์œผ๋กœ ๋จผ์ € ์ถœ์‹œ๋˜์—ˆ์œผ๋ฉฐ, ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฒ„์ „๊ณผ ๊ธ€๋กœ๋ฒŒ ํ™•์žฅ์ด ๊ณ„ํš๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
1169
- ์†Œ๋ผ๋Š” ๊ธฐ์กด์˜ ์ด๋ฏธ์ง€ ์ƒ์„ฑ AI(๋ฏธ๋“œ์ €๋‹ˆ, ์Šคํ…Œ์ด๋ธ” ๋””ํ“จ์ „ ๋“ฑ)๋ฅผ ๋›ฐ์–ด๋„˜์–ด, ์‹œ๊ฐ„์˜ ํ๋ฆ„๊ณผ ๋ฌผ๋ฆฌ ๋ฒ•์น™์„ ์ดํ•ดํ•˜๋Š” ์ˆ˜์ค€์œผ๋กœ ๋ฐœ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค.
1170
- ์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ๋„๊ฐ€ ์น˜๋Š” ์žฅ๋ฉด์„ ์ƒ์„ฑํ•  ๋•Œ ๋ฌผ์˜ ์›€์ง์ž„, ๋น›์˜ ๋ฐ˜์‚ฌ, ์†Œ๋ฆฌ๊นŒ์ง€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
1171
- ์ด๋Š” ์˜ํ™”, ๊ด‘๊ณ , ๊ต์œก ์ฝ˜ํ…์ธ , ๊ฒŒ์ž„ ๋“ฑ ๋ชจ๋“  ์˜์ƒ ์‚ฐ์—…์— ํ˜๋ช…์  ๋ณ€ํ™”๋ฅผ ์˜ˆ๊ณ ํ•ฉ๋‹ˆ๋‹ค.""",
1172
  "significance": "ํ…์ŠคํŠธ๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ ์—์„œ ๋” ๋‚˜์•„๊ฐ€ ๋™์˜์ƒ ์ƒ์„ฑ๊นŒ์ง€ ๊ฐ€๋Šฅํ•ด์ง„ ๊ฒƒ์€ AI ๊ธฐ์ˆ ์˜ ์ง„ํ™”๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ  ์ œ์ž‘์˜ ๋ฏผ์ฃผํ™”๊ฐ€ ๊ฐ€์†ํ™”๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ๊ณ ํ’ˆ์งˆ ์˜์ƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์‹œ๋Œ€๊ฐ€ ์—ด๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.",
1173
  "impact_level": "high",
1174
  "impact_text": "๋†’์Œ",
@@ -1185,12 +1185,12 @@ class LLMAnalyzer:
1185
  # ๊ธฐ๋ณธ ๋ถ„์„ (์ค‘๊ณ ๋“ฑํ•™์ƒ ์ˆ˜์ค€)
1186
  return {
1187
  "summary": f"""'{title}'๋Š” ์ตœ์‹  AI ๊ธฐ์ˆ  ๋™ํ–ฅ์„ ๋‹ค๋ฃจ๋Š” ์ค‘์š”ํ•œ ๋‰ด์Šค์ž…๋‹ˆ๋‹ค.
1188
- ์ธ๊ณต์ง€๋Šฅ ๋ถ„์•ผ๋Š” ๋งค์ผ ์ƒˆ๋กœ์šด ๋ฐœ์ „์„ ์ด๋ฃจ๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ  ๋ณ€ํ™”๋Š” ์šฐ๋ฆฌ์˜ ์ผ์ƒ์ƒํ™œ, ๊ต์œก, ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜ ์ง์—… ์„ธ๊ณ„์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.
1189
- ์ตœ๊ทผ AI ๊ธฐ์ˆ ์€ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ˆ˜์ค€์„ ๋„˜์–ด, ์ฐฝ์˜์ ์ธ ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋‹จ๊ณ„๋กœ ์ง„ํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
1190
- ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLM)๊ณผ ์ƒ์„ฑํ˜• AI์˜ ๋ฐœ์ „์€ ์‚ฐ์—… ์ „๋ฐ˜์— ๊ฑธ์ณ ํ˜์‹ ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
1191
- ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ  ๋ณ€ํ™”๋Š” ์ƒˆ๋กœ์šด ์ผ์ž๋ฆฌ๋ฅผ ์ฐฝ์ถœํ•˜๋Š” ๋™์‹œ์—, ๊ธฐ์กด ์ง์—…์˜ ์„ฑ๊ฒฉ์„ ๋ณ€ํ™”์‹œํ‚ค๊ณ  ์žˆ์–ด ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ํŠธ๋ Œ๋“œ์ž…๋‹ˆ๋‹ค.
1192
- ์ „๋ฌธ๊ฐ€๋“ค์€ ํ–ฅํ›„ 5-10๋…„ ๋‚ด์— AI๊ฐ€ ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฐ์—… ๋ถ„์•ผ์— ํ†ตํ•ฉ๋  ๊ฒƒ์œผ๋กœ ์ „๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
1193
- ๋”ฐ๋ผ์„œ ๊ด€๋ จ ๊ธฐ์ˆ ์˜ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์‚ฌํšŒ์  ํŒŒ๊ธ‰ํšจ๊ณผ๋ฅผ ํ•จ๊ป˜ ๊ณ ๋ฏผํ•˜๋Š” ๊ฒƒ์ด ๋ฏธ๋ž˜ ์„ธ๋Œ€์—๊ฒŒ ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญ๋Ÿ‰์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.""",
1194
  "significance": "AI ๊ธฐ์ˆ ์˜ ๋ฐœ์ „์€ ๋‹จ์ˆœํ•œ ๊ธฐ์ˆ  ํ˜์‹ ์„ ๋„˜์–ด ์‚ฌํšŒ, ๊ฒฝ์ œ, ์œค๋ฆฌ์  ์ธก๋ฉด์—์„œ ๋‹ค์–‘ํ•œ ๋…ผ์˜๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€ํ™”๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋Œ€๋น„ํ•˜๋Š” ๊ฒƒ์ด ๋ฏธ๋ž˜ ์„ธ๋Œ€์—๊ฒŒ ์ค‘์š”ํ•œ ์—ญ๋Ÿ‰์ž…๋‹ˆ๋‹ค.",
1195
  "impact_level": "medium",
1196
  "impact_text": "์ค‘๊ฐ„",
@@ -1352,7 +1352,8 @@ class AdvancedAIAnalyzer:
1352
  ]
1353
 
1354
  all_news = []
1355
- today = datetime.now().strftime('%m-%d') # ์˜ˆ: '10-10'
 
1356
 
1357
  for url_idx, url in enumerate(urls, 1):
1358
  try:
@@ -1412,8 +1413,8 @@ class AdvancedAIAnalyzer:
1412
  if not date_text:
1413
  date_text = today
1414
 
1415
- # ์˜ค๋Š˜ ๋‚ ์งœ๋งŒ ํ•„ํ„ฐ๋ง
1416
- if today not in date_text:
1417
  continue
1418
 
1419
  news_item = {
@@ -1432,7 +1433,7 @@ class AdvancedAIAnalyzer:
1432
  except Exception as e:
1433
  continue
1434
 
1435
- print(f" โ†’ {articles_found}๊ฐœ ์˜ค๋Š˜์ž ๊ธฐ์‚ฌ ์ˆ˜์ง‘\n")
1436
  time.sleep(1) # ์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ฐฉ์ง€
1437
 
1438
  except Exception as e:
@@ -1447,7 +1448,7 @@ class AdvancedAIAnalyzer:
1447
  unique_news.append(news)
1448
  seen_urls.add(news['url'])
1449
 
1450
- print(f"โœ… ์ด {len(unique_news)}๊ฐœ ์ค‘๋ณต ์ œ๊ฑฐ๋œ ์˜ค๋Š˜์ž ๋‰ด์Šค\n")
1451
 
1452
  # ์ตœ์†Œ 3๊ฐœ๋Š” ๋ณด์žฅ (์—†์œผ๋ฉด ์ƒ˜ํ”Œ ์ถ”๊ฐ€)
1453
  if len(unique_news) < 3:
@@ -1481,6 +1482,104 @@ class AdvancedAIAnalyzer:
1481
 
1482
  return unique_news[:20] # ์ตœ๋Œ€ 20๊ฐœ
1483
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1484
  def fetch_huggingface_models(self, limit: int = 30) -> List[Dict]:
1485
  """ํ—ˆ๊น…ํŽ˜์ด์Šค ํŠธ๋ Œ๋”ฉ ๋ชจ๋ธ 30๊ฐœ ์ˆ˜์ง‘ (์‹ค์ œ API)"""
1486
  print(f"๐Ÿค— ํ—ˆ๊น…ํŽ˜์ด์Šค ํŠธ๋ Œ๋”ฉ ๋ชจ๋ธ {limit}๊ฐœ ์ˆ˜์ง‘ ์ค‘...")
@@ -1532,7 +1631,7 @@ class AdvancedAIAnalyzer:
1532
  print(f" โš ๏ธ ๋ชจ๋ธ {idx} ์ฒ˜๋ฆฌ ์˜ค๋ฅ˜: {e}")
1533
  continue
1534
 
1535
- print(f"โœ… {len(models_list)}๊ฐœ ํŠธ๋ Œ๋”ฉ ๋ชจ๋ธ ์ˆ˜์ง‘ ์™„๋ฃŒ")
1536
 
1537
  # DB์— ์ €์žฅ
1538
  if models_list:
@@ -1542,7 +1641,7 @@ class AdvancedAIAnalyzer:
1542
 
1543
  except Exception as e:
1544
  print(f"โŒ ๋ชจ๋ธ ์ˆ˜์ง‘ ์˜ค๋ฅ˜: {e}")
1545
- print("๐Ÿ’พ DB์—์„œ ์ด์ „ ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์‹œ๋„...")
1546
  return load_models_from_db()
1547
 
1548
  def fetch_huggingface_spaces(self, limit: int = 30) -> List[Dict]:
@@ -1602,7 +1701,7 @@ class AdvancedAIAnalyzer:
1602
  print(f" โš ๏ธ ์ŠคํŽ˜์ด์Šค {idx} ์ฒ˜๋ฆฌ ์˜ค๋ฅ˜: {e}")
1603
  continue
1604
 
1605
- print(f"โœ… {len(spaces_list)}๊ฐœ ํŠธ๋ Œ๋”ฉ ์ŠคํŽ˜์ด์Šค ์ˆ˜์ง‘ ์™„๋ฃŒ")
1606
 
1607
  # DB์— ์ €์žฅ
1608
  if spaces_list:
@@ -1612,15 +1711,15 @@ class AdvancedAIAnalyzer:
1612
 
1613
  except Exception as e:
1614
  print(f"โŒ ์ŠคํŽ˜์ด์Šค ์ˆ˜์ง‘ ์˜ค๋ฅ˜: {e}")
1615
- print("๐Ÿ’พ DB์—์„œ ์ด์ „ ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์‹œ๋„...")
1616
  return load_spaces_from_db()
1617
 
1618
  def analyze_all_news(self) -> List[Dict]:
1619
  """๋ชจ๋“  ๋‰ด์Šค์— LLM ๋ถ„์„ ์ถ”๊ฐ€"""
1620
- print("๐Ÿ“ฐ ๋‰ด์Šค LLM ๋ถ„์„ ์‹œ์ž‘...")
1621
 
1622
- # ์‹ค์ œ ์›น์‚ฌ์ดํŠธ์—์„œ ๋‰ด์Šค ์ˆ˜์ง‘
1623
- news = self.fetch_aitimes_news()
1624
 
1625
  if not news:
1626
  print("โš ๏ธ ์ˆ˜์ง‘๋œ ๋‰ด์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")
@@ -1638,8 +1737,11 @@ class AdvancedAIAnalyzer:
1638
 
1639
  article['analysis'] = analysis
1640
  analyzed_news.append(article)
 
 
 
1641
 
1642
- print(f"โœ… {len(analyzed_news)}๊ฐœ ๋‰ด์Šค ๋ถ„์„ ์™„๋ฃŒ")
1643
 
1644
  # DB์— ์ €์žฅ
1645
  if analyzed_news:
@@ -1658,12 +1760,12 @@ class AdvancedAIAnalyzer:
1658
  print("="*60 + "\n")
1659
 
1660
  if force_refresh:
1661
- print("๐Ÿ”„ ๊ฐ•์ œ ์ƒˆ๋กœ๊ณ ์นจ ๋ชจ๋“œ: ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ƒˆ๋กœ ์ˆ˜์ง‘")
1662
  analyzed_news = self.analyze_all_news()
1663
  analyzed_models = self.fetch_huggingface_models(30)
1664
  analyzed_spaces = self.fetch_huggingface_spaces(30)
1665
  else:
1666
- print("๐Ÿ’พ DB ์šฐ์„  ๋กœ๋“œ ๋ชจ๋“œ")
1667
 
1668
  # DB์—์„œ ๋จผ์ € ๋กœ๋“œ
1669
  analyzed_news = load_news_from_db()
@@ -1671,21 +1773,21 @@ class AdvancedAIAnalyzer:
1671
  print("๐Ÿ“ฐ DB์— ๋‰ด์Šค ์—†์Œ โ†’ ์ƒˆ๋กœ ์ˆ˜์ง‘")
1672
  analyzed_news = self.analyze_all_news()
1673
  else:
1674
- print(f"โœ… DB์—์„œ {len(analyzed_news)}๊ฐœ ๋‰ด์Šค ๋กœ๋“œ")
1675
 
1676
  analyzed_models = load_models_from_db()
1677
  if not analyzed_models:
1678
  print("๐Ÿค— DB์— ๋ชจ๋ธ ์—†์Œ โ†’ ์ƒˆ๋กœ ์ˆ˜์ง‘")
1679
  analyzed_models = self.fetch_huggingface_models(30)
1680
  else:
1681
- print(f"โœ… DB์—์„œ {len(analyzed_models)}๊ฐœ ๋ชจ๋ธ ๋กœ๋“œ")
1682
 
1683
  analyzed_spaces = load_spaces_from_db()
1684
  if not analyzed_spaces:
1685
  print("๐Ÿš€ DB์— ์ŠคํŽ˜์ด์Šค ์—†์Œ โ†’ ์ƒˆ๋กœ ์ˆ˜์ง‘")
1686
  analyzed_spaces = self.fetch_huggingface_spaces(30)
1687
  else:
1688
- print(f"โœ… DB์—์„œ {len(analyzed_spaces)}๊ฐœ ์ŠคํŽ˜์ด์Šค ๋กœ๋“œ")
1689
 
1690
  # ํ†ต๊ณ„
1691
  stats = {
@@ -1698,7 +1800,7 @@ class AdvancedAIAnalyzer:
1698
  print(f"\nโœ… ์ „์ฒด ๋ถ„์„ ์™„๋ฃŒ: {stats['llm_analyses']}๊ฐœ ํ•ญ๋ชฉ")
1699
  print(f" ๐Ÿ“ฐ ๋‰ด์Šค: {stats['total_news']}๊ฐœ")
1700
  print(f" ๐Ÿค— ๋ชจ๋ธ: {stats['hf_models']}๊ฐœ")
1701
- print(f" ๐Ÿš€ ์ŠคํŽ˜์ด์Šค: {stats['hf_spaces']}๊ฐœ")
1702
 
1703
  return {
1704
  'analyzed_news': analyzed_news,
@@ -1799,7 +1901,7 @@ def health():
1799
  return jsonify({
1800
  "status": "healthy",
1801
  "service": "AI News LLM Analyzer",
1802
- "version": "3.2.0",
1803
  "database": {
1804
  "connected": True,
1805
  "news_count": news_count,
@@ -1828,14 +1930,15 @@ if __name__ == '__main__':
1828
  print(f"""
1829
  โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•๏ฟฝ๏ฟฝโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
1830
  โ•‘ โ•‘
1831
- โ•‘ ๐Ÿค– AI ๋‰ด์Šค & ํ—ˆ๊น…ํŽ˜์ด์Šค LLM ๋ถ„์„ ์›น์•ฑ v3.2 โ•‘
1832
  โ•‘ โ•‘
1833
  โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
1834
 
1835
  โœจ ์ฃผ์š” ๊ธฐ๋Šฅ:
1836
  โ€ข ๐Ÿ’พ SQLite DB ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€
1837
- โ€ข ๐ŸŒ AI Times ์‹ค์‹œ๊ฐ„ ๋‰ด์Šค ํฌ๋กค๋ง (2๊ฐœ ์„น์…˜)
1838
- โ€ข ๐Ÿ“ฐ ๋‰ด์Šค ์ค‘๊ณ ๋“ฑํ•™์ƒ ์ˆ˜์ค€ ๋ถ„์„
 
1839
  โ€ข ๐Ÿค— ํ—ˆ๊น…ํŽ˜์ด์Šค ํŠธ๋ Œ๋”ฉ ๋ชจ๋ธ TOP 30 (๋ชจ๋ธ ์นด๋“œ ๋ถ„์„)
1840
  โ€ข ๐Ÿš€ ํ—ˆ๊น…ํŽ˜์ด์Šค ํŠธ๋ Œ๋”ฉ ์ŠคํŽ˜์ด์Šค TOP 30 (app.py ๋ถ„์„)
1841
  โ€ข ๐Ÿง  Fireworks AI (Qwen3-235B) ์‹ค์‹œ๊ฐ„ LLM ๋ถ„์„
 
3
  from flask import Flask, render_template_string, jsonify, request
4
  import requests
5
  import json
6
+ from datetime import datetime, timedelta
7
  from typing import List, Dict, Optional
8
  import os
9
  import sys
 
698
 
699
  <!-- ํ‘ธํ„ฐ -->
700
  <div class="footer">
701
+ <p>๐Ÿค– AI ๋‰ด์Šค LLM ๋ถ„์„ ์‹œ์Šคํ…œ v3.3</p>
702
  <p style="margin-top: 10px; font-size: 0.9em;">
703
+ ๐Ÿ’พ SQLite DB ์˜๊ตฌ ์ €์žฅ | ๐ŸŒ AI Times + Hacker News ์‹ค์‹œ๊ฐ„ ์ˆ˜์ง‘ | ๐Ÿค— Hugging Face Trending API | ๐Ÿง  Powered by Fireworks AI (Qwen3-235B)
704
  </p>
705
  <p style="margin-top: 10px; font-size: 0.85em; color: #999;">
706
+ ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜: AI Times, Hacker News, Hugging Face | ์‹ค์‹œ๊ฐ„ ๋ถ„์„: Fireworks AI
707
  </p>
708
  </div>
709
  </div>
 
1081
  {
1082
  "role": "system",
1083
  "content": """๋‹น์‹ ์€ ์ค‘๊ณ ๋“ฑํ•™์ƒ๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ AI ๋‰ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค.
1084
+ ํ•œ๊ตญ์–ด๋กœ ๋‹ต๋ณ€ํ•˜๋ฉฐ, ๋‹ค์Œ ํ˜•์‹์˜ JSON์œผ๋กœ๋งŒ ์‘๋‹ตํ•˜์„ธ์š”:
1085
 
1086
+ {
1087
+ "summary": "๋‰ด์Šค ๋‚ด์šฉ์„ 8-10๋ฌธ์žฅ์œผ๋กœ ์ž์„ธํ•˜๊ณ  ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช… (์ˆ˜์น˜, ์‚ฌ์‹ค, ๋ฐฐ๊ฒฝ ํฌํ•จ)",
1088
+ "significance": "์ด ๋‰ด์Šค๊ฐ€ ์™œ ์ค‘์š”ํ•œ์ง€ 2-3๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช…",
1089
+ "impact_level": "high ๋˜๋Š” medium ๋˜๋Š” low",
1090
+ "impact_text": "๋†’์Œ ๋˜๋Š” ์ค‘๊ฐ„ ๋˜๋Š” ๋‚ฎ์Œ",
1091
+ "impact_description": "์–ด๋–ค ์˜ํ–ฅ์ด ์žˆ์„์ง€ 2-3๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช…",
1092
+ "action": "์ค‘๊ณ ๋“ฑํ•™์ƒ์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ 2-3๋ฌธ์žฅ์œผ๋กœ ์ œ์•ˆ"
1093
+ }
1094
 
1095
+ ๋ฐ˜๋“œ์‹œ ์œ„ ํ˜•์‹์˜ JSON๋งŒ ์ถœ๋ ฅํ•˜์„ธ์š”."""
1096
  },
1097
  {
1098
  "role": "user",
1099
  "content": f"""๋‹ค์Œ AI ๋‰ด์Šค๋ฅผ ์ค‘๊ณ ๋“ฑํ•™์ƒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ถ„์„ํ•ด์ฃผ์„ธ์š”:
1100
 
1101
+ ์ œ๋ชฉ: {title}
1102
 
1103
+ ๊ฐ ํ•ญ๋ชฉ์„ ๊ตฌ์ฒด์ ์ด๊ณ  ์ž์„ธํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋˜, ์ค‘๊ณ ๋“ฑํ•™์ƒ ์ˆ˜์ค€์— ๋งž์ถฐ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
1104
+ ํŠนํžˆ summary๋Š” 8-10๋ฌธ์žฅ์œผ๋กœ ์ถฉ๋ถ„ํžˆ ์ƒ์„ธํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์„ธ์š”."""
1105
  }
1106
  ]
1107
 
 
1134
  analysis_templates = {
1135
  "์ฑ—GPT": {
1136
  "summary": """๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ(MS)๋Š” ์ฑ—GPT์˜ ํญ๋ฐœ์ ์ธ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ์„ผํ„ฐ ์šฉ๋Ÿ‰์ด ๋ถ€์กฑํ•œ ์‹ฌ๊ฐํ•œ ์ƒํ™ฉ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค.
1137
+ ํ˜„์žฌ ๋ฏธ๊ตญ ๋‚ด ์—ฌ๋Ÿฌ ํ•ต์‹ฌ ์ง€์—ญ์—์„œ ๋ฌผ๋ฆฌ์  ๊ณต๊ฐ„๊ณผ ์„œ๋ฒ„ ์šฉ๋Ÿ‰์ด ๋ชจ๋‘ ํ•œ๊ณ„์— ๋„๋‹ฌํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
1138
+ ํŠนํžˆ ๋ฒ„์ง€๋‹ˆ์•„์™€ ํ…์‚ฌ์Šค ๋“ฑ ์ฃผ์š” ํด๋ผ์šฐ๋“œ ํ—ˆ๋ธŒ ์ง€์—ญ์—์„œ๋Š” 2026๋…„ ์ƒ๋ฐ˜๊ธฐ๊นŒ์ง€ ์‹ ๊ทœ Azure ํด๋ผ์šฐ๋“œ ๊ตฌ๋…์ด ์ œํ•œ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.
1139
+ ์ด๋Š” ์ƒ์„ฑํ˜• AI ์„œ๋น„์Šค์˜ ๊ธ‰๊ฒฉํ•œ ์„ฑ์žฅ ์†๋„๊ฐ€ ๊ธฐ์—…๋“ค์˜ ์ธํ”„๋ผ ์ค€๋น„ ๋Šฅ๋ ฅ์„ ํฌ๊ฒŒ ์ดˆ๊ณผํ•˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ๏ฟฝ๏ฟฝ๋‹ˆ๋‹ค.
1140
+ MS๋Š” ๋ฐ์ดํ„ฐ์„ผํ„ฐ ํ™•์žฅ์„ ์œ„ํ•ด ๋ง‰๋Œ€ํ•œ ํˆฌ์ž๋ฅผ ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์‹ค์ œ ์ธํ”„๋ผ ๊ตฌ์ถ•์—๋Š” ์ตœ์†Œ 2-3๋…„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.
1141
+ ์ด๋Ÿฌํ•œ ๊ณต๊ธ‰ ๋ถ€์กฑ ํ˜„์ƒ์€ AI ์„œ๋น„์Šค ๊ฐ€๊ฒฉ ์ƒ์Šน๊ณผ ์ ‘๊ทผ์„ฑ ์ œํ•œ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ,
1142
+ ๊ฒฝ์Ÿ์‚ฌ๋“ค๋„ ์œ ์‚ฌํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
1143
+ ์ „๋ฌธ๊ฐ€๋“ค์€ ์ด ์ƒํ™ฉ์ด AI ์‚ฐ์—…์˜ ์„ฑ์žฅ ์†๋„๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ถ„์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.""",
1144
  "significance": "์ด ๋‰ด์Šค๋Š” AI ๊ธฐ์ˆ ์˜ ๋Œ€์ค‘ํ™” ์†๋„๊ฐ€ ๊ธฐ์—…๋“ค์˜ ์˜ˆ์ƒ์„ ํ›จ์”ฌ ๋›ฐ์–ด๋„˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. MS ๊ฐ™์€ ๊ธ€๋กœ๋ฒŒ IT ๊ธฐ์—…๋„ AI ์ˆ˜์š”๋ฅผ ๋”ฐ๋ผ์žก๊ธฐ ์œ„ํ•ด ๊ณ ๊ตฐ๋ถ„ํˆฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Š” AI๊ฐ€ ๋‹จ์ˆœํ•œ ์œ ํ–‰์ด ์•„๋‹Œ ์‚ฐ์—… ์ „๋ฐ˜์„ ๋ณ€ํ™”์‹œํ‚ค๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ ์ž„์„ ์ฆ๋ช…ํ•ฉ๋‹ˆ๋‹ค.",
1145
  "impact_level": "high",
1146
  "impact_text": "๋†’์Œ",
 
1149
  },
1150
  "GPU": {
1151
  "summary": """๋ฏธ๊ตญ ์ •๋ถ€๊ฐ€ ์•„๋ž์—๋ฏธ๋ฆฌํŠธ(UAE)์— ์ตœ์ฒจ๋‹จ AI ์นฉ(GPU) ์ˆ˜์ถœ์„ ๊ณต์‹์ ์œผ๋กœ ์Šน์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
1152
+ ์ด๋ฒˆ ์Šน์ธ์€ UAE ๋‚ด์—์„œ ๋ฏธ๊ตญ ๊ธฐ์—…์ด ์ง์ ‘ ์šด์˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ์„ผํ„ฐ์—๋งŒ ํ•œ์ •๋˜๋ฉฐ, ํŠนํžˆ ์˜คํ”ˆAI ์ „์šฉ 5๊ธฐ๊ฐ€์™€ํŠธ(GW) ๊ทœ๋ชจ์˜ ๋Œ€ํ˜• ๋ฐ์ดํ„ฐ์„ผํ„ฐ ๊ตฌ์ถ•์— ์‚ฌ์šฉ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
1153
+ GPU๋Š” AI ๋ชจ๋ธ ํ•™์Šต๊ณผ ์ถ”๋ก ์— ํ•„์ˆ˜์ ์ธ ํ•˜๋“œ์›จ์–ด๋กœ, ์ˆ˜์ฒœ ๊ฐœ์˜ ์—ฐ์‚ฐ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.
1154
+ ํ˜„์žฌ GPU ์‹œ์žฅ์€ ์—”๋น„๋””์•„๊ฐ€ ์•ฝ 80% ์ด์ƒ์„ ์žฅ์•…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํŠนํžˆ AI ์ „์šฉ H100, H200 ์นฉ์€ ๊ณต๊ธ‰ ๋ถ€์กฑ ํ˜„์ƒ์ด ์‹ฌ๊ฐํ•ฉ๋‹ˆ๋‹ค.
1155
+ ์ด๋ฒˆ ๊ฒฐ์ •์œผ๋กœ ์—”๋น„๋””์•„์˜ ์‹œ๊ฐ€์ด์•ก์ด 5์กฐ ๋‹ฌ๋Ÿฌ์— ๊ทผ์ ‘ํ•  ๊ฒƒ์œผ๋กœ ์›”์ŠคํŠธ๋ฆฌํŠธ๋Š” ์ „๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
1156
+ ํ•œํŽธ, ์ด๋Š” ๋ฏธ๊ตญ์˜ ์ „๋žต์  ๊ธฐ์ˆ  ์ˆ˜์ถœ ์ •์ฑ… ๋ณ€ํ™”๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ค‘์š”ํ•œ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.
1157
+ ์ค‘๊ตญ์— ๋Œ€ํ•ด์„œ๋Š” ์—„๊ฒฉํ•œ ์ˆ˜์ถœ ํ†ต์ œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„, ์ค‘๋™์˜ ์ฃผ์š” ๋™๋งน๊ตญ์—๋Š” ์„ ๋ณ„์ ์œผ๋กœ ํ—ˆ์šฉํ•˜๋Š” '๊ธฐ์ˆ  ๋™๋งน' ์ „๋žต์„ ๊ตฌ์‚ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.""",
1158
  "significance": "์ด๋Š” ๋ฏธ๊ตญ์˜ AI ๊ธฐ์ˆ  ์ˆ˜์ถœ ์ •์ฑ… ๋ณ€ํ™”๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ค‘์š”ํ•œ ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ํŒจ๊ถŒ ๊ฒฝ์Ÿ ์†์—์„œ๋„ ์ „๋žต์  ๋™๋งน๊ตญ๊ณผ์˜ ํ˜‘๋ ฅ์„ ํ†ตํ•ด AI ์ƒํƒœ๊ณ„๋ฅผ ํ™•์žฅํ•˜๋ ค๋Š” ๋ฏธ๊ตญ์˜ ์˜๋„๋ฅผ ์—ฟ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
1159
  "impact_level": "medium",
1160
  "impact_text": "์ค‘๊ฐ„",
 
1163
  },
1164
  "์†Œ๋ผ": {
1165
  "summary": """์˜คํ”ˆAI์˜ ํ˜์‹ ์ ์ธ AI ๋™์˜์ƒ ์ƒ์„ฑ ์•ฑ '์†Œ๋ผ(Sora)'๊ฐ€ ์ถœ์‹œ ๋‹จ 5์ผ ๋งŒ์— 100๋งŒ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ŒํŒŒํ•˜๋Š” ๊ฒฝ์ด์ ์ธ ๊ธฐ๋ก์„ ์„ธ์› ์Šต๋‹ˆ๋‹ค.
1166
+ ์ด๋Š” ์ „์„ค์ ์ธ ์ฑ—GPT๋ณด๋‹ค๋„ ๋น ๋ฅธ ์„ฑ์žฅ ์†๋„์ด๋ฉฐ, ์ดˆ๋Œ€ ์ „์šฉ(invite-only) ๋ฐฉ์‹์˜ ์ œํ•œ์  ์ถœ์‹œ์ž„์„ ๊ณ ๋ คํ•˜๋ฉด ๋”์šฑ ๋†€๋ผ์šด ์„ฑ๊ณผ์ž…๋‹ˆ๋‹ค.
1167
+ ์†Œ๋ผ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ ํ”„๋กฌํ”„ํŠธ๋งŒ์œผ๋กœ ์ตœ๋Œ€ 1๋ถ„ ๊ธธ์ด์˜ ๊ณ ํ’ˆ์งˆ ๋™์˜์ƒ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์„ฑํ˜• AI ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
1168
+ ํ˜„์žฌ ๋ฏธ๊ตญ๊ณผ ์บ๋‚˜๋‹ค์—์„œ iOS ์ „๏ฟฝ๏ฟฝ๏ฟฝ์œผ๋กœ ๋จผ์ € ์ถœ์‹œ๋˜์—ˆ์œผ๋ฉฐ, ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฒ„์ „๊ณผ ๊ธ€๋กœ๋ฒŒ ํ™•์žฅ์ด ๊ณ„ํš๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
1169
+ ์†Œ๋ผ๋Š” ๊ธฐ์กด์˜ ์ด๋ฏธ์ง€ ์ƒ์„ฑ AI(๋ฏธ๋“œ์ €๋‹ˆ, ์Šคํ…Œ์ด๋ธ” ๋””ํ“จ์ „ ๋“ฑ)๋ฅผ ๋›ฐ์–ด๋„˜์–ด, ์‹œ๊ฐ„์˜ ํ๋ฆ„๊ณผ ๋ฌผ๋ฆฌ ๋ฒ•์น™์„ ์ดํ•ดํ•˜๋Š” ์ˆ˜์ค€์œผ๋กœ ๋ฐœ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค.
1170
+ ์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ๋„๊ฐ€ ์น˜๋Š” ์žฅ๋ฉด์„ ์ƒ์„ฑํ•  ๋•Œ ๋ฌผ์˜ ์›€์ง์ž„, ๋น›์˜ ๋ฐ˜์‚ฌ, ์†Œ๋ฆฌ๊นŒ์ง€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
1171
+ ์ด๋Š” ์˜ํ™”, ๊ด‘๊ณ , ๊ต์œก ์ฝ˜ํ…์ธ , ๊ฒŒ์ž„ ๋“ฑ ๋ชจ๋“  ์˜์ƒ ์‚ฐ์—…์— ํ˜๋ช…์  ๋ณ€ํ™”๋ฅผ ์˜ˆ๊ณ ํ•ฉ๋‹ˆ๋‹ค.""",
1172
  "significance": "ํ…์ŠคํŠธ๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ ์—์„œ ๋” ๋‚˜์•„๊ฐ€ ๋™์˜์ƒ ์ƒ์„ฑ๊นŒ์ง€ ๊ฐ€๋Šฅํ•ด์ง„ ๊ฒƒ์€ AI ๊ธฐ์ˆ ์˜ ์ง„ํ™”๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ  ์ œ์ž‘์˜ ๋ฏผ์ฃผํ™”๊ฐ€ ๊ฐ€์†ํ™”๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ๊ณ ํ’ˆ์งˆ ์˜์ƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์‹œ๋Œ€๊ฐ€ ์—ด๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.",
1173
  "impact_level": "high",
1174
  "impact_text": "๋†’์Œ",
 
1185
  # ๊ธฐ๋ณธ ๋ถ„์„ (์ค‘๊ณ ๋“ฑํ•™์ƒ ์ˆ˜์ค€)
1186
  return {
1187
  "summary": f"""'{title}'๋Š” ์ตœ์‹  AI ๊ธฐ์ˆ  ๋™ํ–ฅ์„ ๋‹ค๋ฃจ๋Š” ์ค‘์š”ํ•œ ๋‰ด์Šค์ž…๋‹ˆ๋‹ค.
1188
+ ์ธ๊ณต์ง€๋Šฅ ๋ถ„์•ผ๋Š” ๋งค์ผ ์ƒˆ๋กœ์šด ๋ฐœ์ „์„ ์ด๋ฃจ๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ  ๋ณ€ํ™”๋Š” ์šฐ๋ฆฌ์˜ ์ผ์ƒ์ƒํ™œ, ๊ต์œก, ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜ ์ง์—… ์„ธ๊ณ„์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.
1189
+ ์ตœ๊ทผ AI ๊ธฐ์ˆ ์€ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ˆ˜์ค€์„ ๋„˜์–ด, ์ฐฝ์˜์ ์ธ ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋‹จ๊ณ„๋กœ ์ง„ํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
1190
+ ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLM)๊ณผ ์ƒ์„ฑํ˜• AI์˜ ๋ฐœ์ „์€ ์‚ฐ์—… ์ „๋ฐ˜์— ๊ฑธ์ณ ํ˜์‹ ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
1191
+ ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ  ๋ณ€ํ™”๋Š” ์ƒˆ๋กœ์šด ์ผ์ž๋ฆฌ๋ฅผ ์ฐฝ์ถœํ•˜๋Š” ๋™์‹œ์—, ๊ธฐ์กด ์ง์—…์˜ ์„ฑ๊ฒฉ์„ ๋ณ€ํ™”์‹œํ‚ค๊ณ  ์žˆ์–ด ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ํŠธ๋ Œ๋“œ์ž…๋‹ˆ๋‹ค.
1192
+ ์ „๋ฌธ๊ฐ€๋“ค์€ ํ–ฅํ›„ 5-10๋…„ ๋‚ด์— AI๊ฐ€ ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฐ์—… ๋ถ„์•ผ์— ํ†ตํ•ฉ๋  ๊ฒƒ์œผ๋กœ ์ „๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
1193
+ ๋”ฐ๋ผ์„œ ๊ด€๋ จ ๊ธฐ์ˆ ์˜ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์‚ฌํšŒ์  ํŒŒ๊ธ‰ํšจ๊ณผ๋ฅผ ํ•จ๊ป˜ ๊ณ ๋ฏผํ•˜๋Š” ๊ฒƒ์ด ๋ฏธ๋ž˜ ์„ธ๋Œ€์—๊ฒŒ ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญ๋Ÿ‰์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.""",
1194
  "significance": "AI ๊ธฐ์ˆ ์˜ ๋ฐœ์ „์€ ๋‹จ์ˆœํ•œ ๊ธฐ์ˆ  ํ˜์‹ ์„ ๋„˜์–ด ์‚ฌํšŒ, ๊ฒฝ์ œ, ์œค๋ฆฌ์  ์ธก๋ฉด์—์„œ ๋‹ค์–‘ํ•œ ๋…ผ์˜๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€ํ™”๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋Œ€๋น„ํ•˜๋Š” ๊ฒƒ์ด ๋ฏธ๋ž˜ ์„ธ๋Œ€์—๊ฒŒ ์ค‘์š”ํ•œ ์—ญ๋Ÿ‰์ž…๋‹ˆ๋‹ค.",
1195
  "impact_level": "medium",
1196
  "impact_text": "์ค‘๊ฐ„",
 
1352
  ]
1353
 
1354
  all_news = []
1355
+ today = datetime.now().strftime('%m-%d') # ์˜ˆ: '10-11'
1356
+ yesterday = (datetime.now() - timedelta(days=1)).strftime('%m-%d') # ์˜ˆ: '10-10'
1357
 
1358
  for url_idx, url in enumerate(urls, 1):
1359
  try:
 
1413
  if not date_text:
1414
  date_text = today
1415
 
1416
+ # ์˜ค๋Š˜ ๋˜๋Š” ์–ด์ œ ๋‚ ์งœ๋งŒ ํ•„ํ„ฐ๋ง (์‹œ๊ฐ„๋Œ€ ์ฐจ์ด ๊ณ ๋ ค)
1417
+ if today not in date_text and yesterday not in date_text:
1418
  continue
1419
 
1420
  news_item = {
 
1433
  except Exception as e:
1434
  continue
1435
 
1436
+ print(f" โ†’ {articles_found}๊ฐœ ์ตœ๊ทผ ๊ธฐ์‚ฌ ์ˆ˜์ง‘\n")
1437
  time.sleep(1) # ์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ฐฉ์ง€
1438
 
1439
  except Exception as e:
 
1448
  unique_news.append(news)
1449
  seen_urls.add(news['url'])
1450
 
1451
+ print(f"โœ… ์ด {len(unique_news)}๊ฐœ ์ค‘๋ณต ์ œ๊ฑฐ๋œ ์ตœ๊ทผ ๋‰ด์Šค\n")
1452
 
1453
  # ์ตœ์†Œ 3๊ฐœ๋Š” ๋ณด์žฅ (์—†์œผ๋ฉด ์ƒ˜ํ”Œ ์ถ”๊ฐ€)
1454
  if len(unique_news) < 3:
 
1482
 
1483
  return unique_news[:20] # ์ตœ๋Œ€ 20๊ฐœ
1484
 
1485
+ def fetch_hackernews(self, limit: int = 15) -> List[Dict]:
1486
+ """Hacker News Top Stories ์ˆ˜์ง‘ (๋ฏธ๊ตญ ์‹œ๊ฐ„ ๊ธฐ์ค€ 24์‹œ๊ฐ„ ์ด๋‚ด)"""
1487
+ print(f"๐Ÿ”ฅ Hacker News Top {limit}๊ฐœ ์Šคํ† ๋ฆฌ ์ˆ˜์ง‘ ์ค‘...")
1488
+
1489
+ news_list = []
1490
+
1491
+ try:
1492
+ # 1. Top Stories ID ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ
1493
+ topstories_url = "https://hacker-news.firebaseio.com/v0/topstories.json"
1494
+ response = requests.get(topstories_url, timeout=10)
1495
+ response.raise_for_status()
1496
+
1497
+ story_ids = response.json()[:limit * 3] # ์—ฌ์œ ์žˆ๊ฒŒ ๊ฐ€์ ธ์˜ค๊ธฐ
1498
+ print(f" ๐Ÿ“Š {len(story_ids)}๊ฐœ ์Šคํ† ๋ฆฌ ID ๋ฐ›์Œ")
1499
+
1500
+ # ํ˜„์žฌ ์‹œ๊ฐ„ (UTC ๊ธฐ์ค€)
1501
+ current_time = datetime.utcnow()
1502
+ cutoff_time = current_time - timedelta(hours=36) # 36์‹œ๊ฐ„ ์ „๊นŒ์ง€ (๋ฏธ๊ตญ ์‹œ๊ฐ„ ๊ณ ๋ ค)
1503
+
1504
+ # 2. ๊ฐ ์Šคํ† ๋ฆฌ ์ƒ์„ธ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
1505
+ for idx, story_id in enumerate(story_ids, 1):
1506
+ try:
1507
+ if len(news_list) >= limit:
1508
+ break
1509
+
1510
+ item_url = f"https://hacker-news.firebaseio.com/v0/item/{story_id}.json"
1511
+ item_response = requests.get(item_url, timeout=5)
1512
+ item_response.raise_for_status()
1513
+
1514
+ story = item_response.json()
1515
+
1516
+ # story ํƒ€์ž…๋งŒ (job, poll ๋“ฑ ์ œ์™ธ)
1517
+ if story.get('type') != 'story':
1518
+ continue
1519
+
1520
+ # URL์ด ์—†๋Š” ๊ฒฝ์šฐ ์Šคํ‚ต (Ask HN ๋“ฑ)
1521
+ if not story.get('url'):
1522
+ continue
1523
+
1524
+ # ์‹œ๊ฐ„ ํ™•์ธ (36์‹œ๊ฐ„ ์ด๋‚ด๋งŒ)
1525
+ timestamp = story.get('time', 0)
1526
+ story_time = datetime.utcfromtimestamp(timestamp)
1527
+
1528
+ if story_time < cutoff_time:
1529
+ continue
1530
+
1531
+ # ์‹œ๊ฐ„ ๋ณ€ํ™˜ (Unix timestamp -> ๋‚ ์งœ)
1532
+ date_str = story_time.strftime('%m-%d %H:%M')
1533
+
1534
+ news_item = {
1535
+ 'title': story.get('title', 'No Title'),
1536
+ 'url': story.get('url', ''),
1537
+ 'date': date_str,
1538
+ 'source': 'Hacker News',
1539
+ 'category': 'Tech',
1540
+ 'score': story.get('score', 0),
1541
+ 'author': story.get('by', 'Unknown'),
1542
+ 'comments': story.get('descendants', 0)
1543
+ }
1544
+
1545
+ news_list.append(news_item)
1546
+
1547
+ print(f" โœ“ [{len(news_list)}/{limit}] {news_item['title'][:60]}... (์ ์ˆ˜: {news_item['score']})")
1548
+
1549
+ # API rate limit ๋ฐฉ์ง€
1550
+ time.sleep(0.2)
1551
+
1552
+ except Exception as e:
1553
+ print(f" โš ๏ธ ์Šคํ† ๋ฆฌ {story_id} ์ฒ˜๋ฆฌ ์˜ค๋ฅ˜: {e}")
1554
+ continue
1555
+
1556
+ print(f"โœ… {len(news_list)}๊ฐœ Hacker News ์Šคํ† ๋ฆฌ ์ˆ˜์ง‘ ์™„๋ฃŒ\n")
1557
+ return news_list
1558
+
1559
+ except Exception as e:
1560
+ print(f"โŒ Hacker News ์ˆ˜์ง‘ ์˜ค๋ฅ˜: {e}\n")
1561
+ return []
1562
+
1563
+ def fetch_all_news_sources(self) -> List[Dict]:
1564
+ """๋ชจ๋“  ๋‰ด์Šค ์†Œ์Šค์—์„œ ์ˆ˜์ง‘"""
1565
+ print("๐ŸŒ ์—ฌ๋Ÿฌ ์†Œ์Šค์—์„œ ๋‰ด์Šค ์ˆ˜์ง‘ ์ค‘...\n")
1566
+
1567
+ all_news = []
1568
+
1569
+ # 1. AI Times ๋‰ด์Šค
1570
+ aitimes_news = self.fetch_aitimes_news()
1571
+ all_news.extend(aitimes_news)
1572
+
1573
+ # 2. Hacker News
1574
+ hackernews = self.fetch_hackernews(limit=15)
1575
+ all_news.extend(hackernews)
1576
+
1577
+ print(f"\n๐Ÿ“ฐ ์ด {len(all_news)}๊ฐœ ๋‰ด์Šค ์ˆ˜์ง‘ ์™„๋ฃŒ")
1578
+ print(f" - AI Times: {len(aitimes_news)}๊ฐœ")
1579
+ print(f" - Hacker News: {len(hackernews)}๊ฐœ\n")
1580
+
1581
+ return all_news
1582
+
1583
  def fetch_huggingface_models(self, limit: int = 30) -> List[Dict]:
1584
  """ํ—ˆ๊น…ํŽ˜์ด์Šค ํŠธ๋ Œ๋”ฉ ๋ชจ๋ธ 30๊ฐœ ์ˆ˜์ง‘ (์‹ค์ œ API)"""
1585
  print(f"๐Ÿค— ํ—ˆ๊น…ํŽ˜์ด์Šค ํŠธ๋ Œ๋”ฉ ๋ชจ๋ธ {limit}๊ฐœ ์ˆ˜์ง‘ ์ค‘...")
 
1631
  print(f" โš ๏ธ ๋ชจ๋ธ {idx} ์ฒ˜๋ฆฌ ์˜ค๋ฅ˜: {e}")
1632
  continue
1633
 
1634
+ print(f"โœ… {len(models_list)}๊ฐœ ํŠธ๋ Œ๋”ฉ ๋ชจ๋ธ ์ˆ˜์ง‘ ์™„๋ฃŒ\n")
1635
 
1636
  # DB์— ์ €์žฅ
1637
  if models_list:
 
1641
 
1642
  except Exception as e:
1643
  print(f"โŒ ๋ชจ๋ธ ์ˆ˜์ง‘ ์˜ค๋ฅ˜: {e}")
1644
+ print("๐Ÿ’พ DB์—์„œ ์ด์ „ ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์‹œ๋„...\n")
1645
  return load_models_from_db()
1646
 
1647
  def fetch_huggingface_spaces(self, limit: int = 30) -> List[Dict]:
 
1701
  print(f" โš ๏ธ ์ŠคํŽ˜์ด์Šค {idx} ์ฒ˜๋ฆฌ ์˜ค๋ฅ˜: {e}")
1702
  continue
1703
 
1704
+ print(f"โœ… {len(spaces_list)}๊ฐœ ํŠธ๋ Œ๋”ฉ ์ŠคํŽ˜์ด์Šค ์ˆ˜์ง‘ ์™„๋ฃŒ\n")
1705
 
1706
  # DB์— ์ €์žฅ
1707
  if spaces_list:
 
1711
 
1712
  except Exception as e:
1713
  print(f"โŒ ์ŠคํŽ˜์ด์Šค ์ˆ˜์ง‘ ์˜ค๋ฅ˜: {e}")
1714
+ print("๐Ÿ’พ DB์—์„œ ์ด์ „ ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์‹œ๋„...\n")
1715
  return load_spaces_from_db()
1716
 
1717
  def analyze_all_news(self) -> List[Dict]:
1718
  """๋ชจ๋“  ๋‰ด์Šค์— LLM ๋ถ„์„ ์ถ”๊ฐ€"""
1719
+ print("๐Ÿ“ฐ ๋‰ด์Šค LLM ๋ถ„์„ ์‹œ์ž‘...\n")
1720
 
1721
+ # ์—ฌ๋Ÿฌ ์†Œ์Šค์—์„œ ๋‰ด์Šค ์ˆ˜์ง‘
1722
+ news = self.fetch_all_news_sources()
1723
 
1724
  if not news:
1725
  print("โš ๏ธ ์ˆ˜์ง‘๋œ ๋‰ด์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")
 
1737
 
1738
  article['analysis'] = analysis
1739
  analyzed_news.append(article)
1740
+
1741
+ # API rate limit ๋ฐฉ์ง€
1742
+ time.sleep(0.3)
1743
 
1744
+ print(f"\nโœ… {len(analyzed_news)}๊ฐœ ๋‰ด์Šค ๋ถ„์„ ์™„๋ฃŒ\n")
1745
 
1746
  # DB์— ์ €์žฅ
1747
  if analyzed_news:
 
1760
  print("="*60 + "\n")
1761
 
1762
  if force_refresh:
1763
+ print("๐Ÿ”„ ๊ฐ•์ œ ์ƒˆ๋กœ๊ณ ์นจ ๋ชจ๋“œ: ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ƒˆ๋กœ ์ˆ˜์ง‘\n")
1764
  analyzed_news = self.analyze_all_news()
1765
  analyzed_models = self.fetch_huggingface_models(30)
1766
  analyzed_spaces = self.fetch_huggingface_spaces(30)
1767
  else:
1768
+ print("๐Ÿ’พ DB ์šฐ์„  ๋กœ๋“œ ๋ชจ๋“œ\n")
1769
 
1770
  # DB์—์„œ ๋จผ์ € ๋กœ๋“œ
1771
  analyzed_news = load_news_from_db()
 
1773
  print("๐Ÿ“ฐ DB์— ๋‰ด์Šค ์—†์Œ โ†’ ์ƒˆ๋กœ ์ˆ˜์ง‘")
1774
  analyzed_news = self.analyze_all_news()
1775
  else:
1776
+ print(f"โœ… DB์—์„œ {len(analyzed_news)}๊ฐœ ๋‰ด์Šค ๋กœ๋“œ\n")
1777
 
1778
  analyzed_models = load_models_from_db()
1779
  if not analyzed_models:
1780
  print("๐Ÿค— DB์— ๋ชจ๋ธ ์—†์Œ โ†’ ์ƒˆ๋กœ ์ˆ˜์ง‘")
1781
  analyzed_models = self.fetch_huggingface_models(30)
1782
  else:
1783
+ print(f"โœ… DB์—์„œ {len(analyzed_models)}๊ฐœ ๋ชจ๋ธ ๋กœ๋“œ\n")
1784
 
1785
  analyzed_spaces = load_spaces_from_db()
1786
  if not analyzed_spaces:
1787
  print("๐Ÿš€ DB์— ์ŠคํŽ˜์ด์Šค ์—†์Œ โ†’ ์ƒˆ๋กœ ์ˆ˜์ง‘")
1788
  analyzed_spaces = self.fetch_huggingface_spaces(30)
1789
  else:
1790
+ print(f"โœ… DB์—์„œ {len(analyzed_spaces)}๊ฐœ ์ŠคํŽ˜์ด์Šค ๋กœ๋“œ\n")
1791
 
1792
  # ํ†ต๊ณ„
1793
  stats = {
 
1800
  print(f"\nโœ… ์ „์ฒด ๋ถ„์„ ์™„๋ฃŒ: {stats['llm_analyses']}๊ฐœ ํ•ญ๋ชฉ")
1801
  print(f" ๐Ÿ“ฐ ๋‰ด์Šค: {stats['total_news']}๊ฐœ")
1802
  print(f" ๐Ÿค— ๋ชจ๋ธ: {stats['hf_models']}๊ฐœ")
1803
+ print(f" ๐Ÿš€ ์ŠคํŽ˜์ด์Šค: {stats['hf_spaces']}๊ฐœ\n")
1804
 
1805
  return {
1806
  'analyzed_news': analyzed_news,
 
1901
  return jsonify({
1902
  "status": "healthy",
1903
  "service": "AI News LLM Analyzer",
1904
+ "version": "3.3.0",
1905
  "database": {
1906
  "connected": True,
1907
  "news_count": news_count,
 
1930
  print(f"""
1931
  โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•๏ฟฝ๏ฟฝโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
1932
  โ•‘ โ•‘
1933
+ โ•‘ ๐Ÿค– AI ๋‰ด์Šค & ํ—ˆ๊น…ํŽ˜์ด์Šค LLM ๋ถ„์„ ์›น์•ฑ v3.3 โ•‘
1934
  โ•‘ โ•‘
1935
  โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
1936
 
1937
  โœจ ์ฃผ์š” ๊ธฐ๋Šฅ:
1938
  โ€ข ๐Ÿ’พ SQLite DB ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€
1939
+ โ€ข ๐ŸŒ AI Times ์‹ค์‹œ๊ฐ„ ๋‰ด์Šค ํฌ๋กค๋ง (์˜ค๋Š˜+์–ด์ œ)
1940
+ โ€ข ๐Ÿ”ฅ Hacker News Top Stories (36์‹œ๊ฐ„ ์ด๋‚ด)
1941
+ โ€ข ๐Ÿ“ฐ ๋‰ด์Šค ์ค‘๊ณ ๋“ฑํ•™์ƒ ์ˆ˜์ค€ LLM ๋ถ„์„
1942
  โ€ข ๐Ÿค— ํ—ˆ๊น…ํŽ˜์ด์Šค ํŠธ๋ Œ๋”ฉ ๋ชจ๋ธ TOP 30 (๋ชจ๋ธ ์นด๋“œ ๋ถ„์„)
1943
  โ€ข ๐Ÿš€ ํ—ˆ๊น…ํŽ˜์ด์Šค ํŠธ๋ Œ๋”ฉ ์ŠคํŽ˜์ด์Šค TOP 30 (app.py ๋ถ„์„)
1944
  โ€ข ๐Ÿง  Fireworks AI (Qwen3-235B) ์‹ค์‹œ๊ฐ„ LLM ๋ถ„์„