ginipick commited on
Commit
9a08b0c
·
verified ·
1 Parent(s): 082f03f

Update app-BACKUP.py

Browse files
Files changed (1) hide show
  1. app-BACKUP.py +457 -82
app-BACKUP.py CHANGED
@@ -1,19 +1,4 @@
1
  # -*- coding: utf-8 -*-
2
- """
3
- AI 뉴스 & 허깅페이스 트렌딩 LLM 분석 웹앱 (완전판 v3.0)
4
- 파일명: app_advanced.py
5
-
6
- 주요 기능:
7
- 1. SQLite DB 영구 스토리지
8
- 2. 실제 Hugging Face Trending API 연동 (모델/스페이스 30위)
9
- 3. LLM 분석 (초등학생 수준)
10
- 4. 탭 UI (뉴스/모델/스페이스)
11
-
12
- 실행 방법:
13
- 1. pip install Flask requests beautifulsoup4 huggingface_hub
14
- 2. python app_advanced.py
15
- 3. 브라우저에서 http://localhost:7860 접속
16
- """
17
 
18
  from flask import Flask, render_template_string, jsonify, request
19
  import requests
@@ -25,6 +10,8 @@ import sys
25
  import sqlite3
26
  import time
27
  from huggingface_hub import HfApi
 
 
28
 
29
  # Flask 앱 초기화
30
  app = Flask(__name__)
@@ -534,7 +521,7 @@ HTML_TEMPLATE = """
534
  <body>
535
  <div class="container">
536
  <h1>🤖 AI 뉴스 & 허깅페이스 LLM 분석</h1>
537
- <p class="subtitle">초등학생도 이해하는 AI 트렌드 분석 시스템 🎓</p>
538
 
539
  <!-- 통계 카드 -->
540
  <div class="stats">
@@ -665,7 +652,7 @@ HTML_TEMPLATE = """
665
  </div>
666
 
667
  <div class="space-analysis">
668
- <strong>🎓 초등학생 설명:</strong><br>
669
  {{ space.simple_explanation }}
670
  </div>
671
 
@@ -711,12 +698,12 @@ HTML_TEMPLATE = """
711
 
712
  <!-- 푸터 -->
713
  <div class="footer">
714
- <p>🤖 AI 뉴스 LLM 분석 시스템 v3.0</p>
715
  <p style="margin-top: 10px; font-size: 0.9em;">
716
- 💾 SQLite DB 영구 저장 | 🤗 Hugging Face Trending API | Powered by Claude AI
717
  </p>
718
  <p style="margin-top: 10px; font-size: 0.85em; color: #999;">
719
- 데이터 출처: AI Times, Hugging Face | 분석: Claude AI
720
  </p>
721
  </div>
722
  </div>
@@ -1005,38 +992,188 @@ def load_spaces_from_db() -> List[Dict]:
1005
  # ============================================
1006
 
1007
  class LLMAnalyzer:
1008
- """Claude API를 사용한 LLM 분석기"""
1009
 
1010
  def __init__(self):
1011
- self.api_available = True
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1012
 
1013
  def analyze_news_simple(self, title: str, content: str = "") -> Dict:
1014
- """뉴스 기사를 초등학생 수준으로 분석"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1015
 
1016
  analysis_templates = {
1017
  "챗GPT": {
1018
- "summary": "마이크로소프트(MS)라는 큰 회사가 챗GPT라는 AI를 너무 많은 사람들이 사용해서, 컴퓨터를 보관하는 건물(데이터센터)이 부족하다고 말했어요.",
1019
- "significance": "챗GPT가 정말 인기가 많다는 뜻이에요. 마치 너무 많은 친구들이 게임기를 쓰려고 하는 것과 비슷해요.",
 
 
 
 
 
 
 
1020
  "impact_level": "high",
1021
  "impact_text": "높음",
1022
- "impact_description": "AI 기술이 빠르게 발전하고 있고, 많은 사람들이 사용하고 있다는 중요한 신호예요.",
1023
- "action": "챗GPT 같은 AI 도구를 배워보세요. 숙제를 도와달라고 하거나, 모르는 것을 물어볼있어요!"
1024
  },
1025
  "GPU": {
1026
- "summary": "미국이 아랍에미리트(UAE)라는 나라에 GPU라는 특별한 컴퓨터 부품을 팔 수 있게 허락했어요. GPU AI를 만드는 꼭 필요한 부품이에요.",
1027
- "significance": "GPU는 AI의 두뇌 같은 거예요. 이걸 있게 되면 많은 나라에서 AI를 만들 있어요.",
 
 
 
 
 
 
1028
  "impact_level": "medium",
1029
  "impact_text": "중간",
1030
- "impact_description": "AI 기술이 많은 나라로 퍼질있게 되었어요.",
1031
- "action": "컴퓨터가 어떻게 작동하는지 관심을 가져보세요. GPU가 무엇인지 검색해보는 것도 좋아요!"
1032
  },
1033
  "소라": {
1034
- "summary": "오픈AI 만든 '소라'라는 AI 앱이 엄청 빠르게 인기를 얻었어요. 100만 명이 다운로드하는 챗GPT보다 빨랐대요!",
1035
- "significance": "사람들이 비디오를 만드는 AI에 정말 관심이 많다는 뜻이에요.",
 
 
 
 
 
 
1036
  "impact_level": "high",
1037
  "impact_text": "높음",
1038
- "impact_description": "앞으로 누구나 쉽게 멋진 비디오를 만들 있게 거예요.",
1039
- "action": "소라를 써보고, 상상한 것을 비디오로 만들어보세요. 창의력을 발휘할 있어요!"
1040
  }
1041
  }
1042
 
@@ -1045,19 +1182,60 @@ class LLMAnalyzer:
1045
  if keyword.lower() in title.lower():
1046
  return template
1047
 
1048
- # 기본 분석
1049
  return {
1050
- "summary": f"'{title}'라는 AI 관련 뉴스가 나왔어요. AI 기술이 계속 발전하고 있다는 소식이에요.",
1051
- "significance": "AI는 우리 생활을 편리하게 만들어주는 기술이에요.",
 
 
 
 
 
 
1052
  "impact_level": "medium",
1053
  "impact_text": "중간",
1054
- "impact_description": "AI 기술의 발전은 우리 미래에 중요한 영향을 거예요.",
1055
- "action": "AI 대해 알아보고, AI 활용하는 방법을 배워보세요!"
1056
  }
1057
-
1058
  def analyze_model(self, model_name: str, task: str, downloads: int) -> str:
1059
- """허깅페이스 모델 분석"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1060
 
 
1061
  task_explanations = {
1062
  "text-generation": "글을 자동으로 만들어주는",
1063
  "image-to-text": "사진을 보고 설명을 써주는",
@@ -1083,9 +1261,65 @@ class LLMAnalyzer:
1083
 
1084
  return f"이 모델은 {task_desc} AI예요. {popularity} 사람들이 다운로드해서 사용하고 있어요. {model_name.split('/')[-1]}라는 이름으로 유명해요!"
1085
 
1086
- def analyze_space(self, space_name: str, description: str) -> Dict:
1087
- """허깅페이스 스페이스 분석"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1088
 
 
1089
  return {
1090
  "simple_explanation": f"{space_name}는 웹브라우저에서 바로 AI를 체험해볼 수 있는 곳이에요. 설치 없이도 사용할 수 있어서 편리해요! 마치 온라인 게임처럼 바로 접속해서 AI를 사용할 수 있답니다.",
1091
  "tech_stack": ["Python", "Gradio", "Transformers", "PyTorch"]
@@ -1107,6 +1341,146 @@ class AdvancedAIAnalyzer:
1107
  }
1108
  self.news_data = []
1109
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1110
  def fetch_huggingface_models(self, limit: int = 30) -> List[Dict]:
1111
  """허깅페이스 트렌딩 모델 30개 수집 (실제 API)"""
1112
  print(f"🤗 허깅페이스 트렌딩 모델 {limit}개 수집 중...")
@@ -1137,7 +1511,8 @@ class AdvancedAIAnalyzer:
1137
  'rank': idx
1138
  }
1139
 
1140
- # LLM 분석 추가
 
1141
  model_info['analysis'] = self.llm_analyzer.analyze_model(
1142
  model_info['name'],
1143
  model_info['task'],
@@ -1146,8 +1521,11 @@ class AdvancedAIAnalyzer:
1146
 
1147
  models_list.append(model_info)
1148
 
 
 
 
1149
  # 진행상황 표시
1150
- if idx % 10 == 0:
1151
  print(f" ✓ {idx}개 모델 처리 완료...")
1152
 
1153
  except Exception as e:
@@ -1199,9 +1577,11 @@ class AdvancedAIAnalyzer:
1199
  'rank': idx
1200
  }
1201
 
1202
- # LLM 분석 추가
 
1203
  space_analysis = self.llm_analyzer.analyze_space(
1204
  space_info['name'],
 
1205
  space_info['title']
1206
  )
1207
 
@@ -1211,8 +1591,11 @@ class AdvancedAIAnalyzer:
1211
 
1212
  spaces_list.append(space_info)
1213
 
 
 
 
1214
  # 진행상황 표시
1215
- if idx % 10 == 0:
1216
  print(f" ✓ {idx}개 스페이스 처리 완료...")
1217
 
1218
  except Exception as e:
@@ -1232,39 +1615,22 @@ class AdvancedAIAnalyzer:
1232
  print("💾 DB에서 이전 데이터 로드 시도...")
1233
  return load_spaces_from_db()
1234
 
1235
- def create_sample_news(self) -> List[Dict]:
1236
- """오늘의 AI 뉴스 샘플"""
1237
- sample_news = [
1238
- {
1239
- 'title': 'MS "챗GPT 수요 폭증으로 데이터센터 부족...2026년까지 지속"',
1240
- 'url': 'https://www.aitimes.com/news/articleView.html?idxno=203055',
1241
- 'date': '10-10 15:10',
1242
- 'source': 'AI Times'
1243
- },
1244
- {
1245
- 'title': '미국, UAE에 GPU 판매 일부 승인...엔비디아 시총 5조달러 눈앞',
1246
- 'url': 'https://www.aitimes.com/news/articleView.html?idxno=203053',
1247
- 'date': '10-10 14:46',
1248
- 'source': 'AI Times'
1249
- },
1250
- {
1251
- 'title': '소라, 챗GPT보다 빨리 100만 다운로드 돌파',
1252
- 'url': 'https://www.aitimes.com/news/articleView.html?idxno=203045',
1253
- 'date': '10-10 12:55',
1254
- 'source': 'AI Times'
1255
- }
1256
- ]
1257
-
1258
- return sample_news
1259
-
1260
  def analyze_all_news(self) -> List[Dict]:
1261
  """모든 뉴스에 LLM 분석 추가"""
1262
  print("📰 뉴스 LLM 분석 시작...")
1263
 
1264
- news = self.create_sample_news()
 
 
 
 
 
 
1265
  analyzed_news = []
1266
 
1267
- for article in news:
 
 
1268
  analysis = self.llm_analyzer.analyze_news_simple(
1269
  article['title'],
1270
  ""
@@ -1276,7 +1642,8 @@ class AdvancedAIAnalyzer:
1276
  print(f"✅ {len(analyzed_news)}개 뉴스 분석 완료")
1277
 
1278
  # DB에 저장
1279
- save_news_to_db(analyzed_news)
 
1280
 
1281
  return analyzed_news
1282
 
@@ -1432,13 +1799,16 @@ def health():
1432
  return jsonify({
1433
  "status": "healthy",
1434
  "service": "AI News LLM Analyzer",
1435
- "version": "3.0.0",
1436
  "database": {
1437
  "connected": True,
1438
  "news_count": news_count,
1439
  "models_count": models_count,
1440
  "spaces_count": spaces_count
1441
  },
 
 
 
1442
  "timestamp": datetime.now().isoformat()
1443
  })
1444
  except Exception as e:
@@ -1458,17 +1828,22 @@ if __name__ == '__main__':
1458
  print(f"""
1459
  ╔════════════════════════════════════════════════════════════╗
1460
  ║ ║
1461
- ║ 🤖 AI 뉴스 & 허깅페이스 LLM 분석 웹앱 v3.0
1462
  ║ ║
1463
  ╚════════════════════════════════════════════════════════════╝
1464
 
1465
  ✨ 주요 기능:
1466
  • 💾 SQLite DB 영구 스토리지
1467
- 📰 뉴스 초등학생 수준 LLM 분석
1468
- 🤗 허깅페이스 트렌딩 모델 TOP 30
1469
- 🚀 허깅페이스 트렌딩 스페이스 TOP 30
 
 
1470
  • 🎨 탭 UI (뉴스/모델/스페이스)
1471
 
 
 
 
1472
  🚀 서버 정보:
1473
  📍 메인: http://localhost:{port}
1474
  🔄 강제갱신: http://localhost:{port}/?refresh=true
@@ -1503,5 +1878,5 @@ if __name__ == '__main__':
1503
  print("\n\n👋 서버 종료!")
1504
  sys.exit(0)
1505
  except Exception as e:
1506
- print(f"\n 서버 오류: {e}")
1507
  sys.exit(1)
 
1
  # -*- coding: utf-8 -*-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
  from flask import Flask, render_template_string, jsonify, request
4
  import requests
 
10
  import sqlite3
11
  import time
12
  from huggingface_hub import HfApi
13
+ from bs4 import BeautifulSoup
14
+ import re
15
 
16
  # Flask 앱 초기화
17
  app = Flask(__name__)
 
521
  <body>
522
  <div class="container">
523
  <h1>🤖 AI 뉴스 & 허깅페이스 LLM 분석</h1>
524
+ <p class="subtitle">AI 트렌드 분석 시스템 🎓</p>
525
 
526
  <!-- 통계 카드 -->
527
  <div class="stats">
 
652
  </div>
653
 
654
  <div class="space-analysis">
655
+ <strong>🎓 쉬운 설명:</strong><br>
656
  {{ space.simple_explanation }}
657
  </div>
658
 
 
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>
 
992
  # ============================================
993
 
994
  class LLMAnalyzer:
995
+ """Fireworks AI (Qwen3) 기반 LLM 분석기"""
996
 
997
  def __init__(self):
998
+ self.api_key = os.environ.get('FIREWORKS_API_KEY', '')
999
+ self.api_url = "https://api.fireworks.ai/inference/v1/chat/completions"
1000
+ self.api_available = bool(self.api_key)
1001
+
1002
+ if not self.api_available:
1003
+ print("⚠️ FIREWORKS_API_KEY 환경변수가 설정되지 않았습니다. 템플릿 모드로 동작합니다.")
1004
+
1005
+ def call_llm(self, messages: List[Dict], max_tokens: int = 2000) -> str:
1006
+ """Fireworks AI API 호출"""
1007
+ if not self.api_available:
1008
+ return None
1009
+
1010
+ try:
1011
+ payload = {
1012
+ "model": "accounts/fireworks/models/qwen3-235b-a22b-instruct-2507",
1013
+ "max_tokens": max_tokens,
1014
+ "top_p": 1,
1015
+ "top_k": 40,
1016
+ "presence_penalty": 0,
1017
+ "frequency_penalty": 0,
1018
+ "temperature": 0.6,
1019
+ "messages": messages
1020
+ }
1021
+
1022
+ headers = {
1023
+ "Accept": "application/json",
1024
+ "Content-Type": "application/json",
1025
+ "Authorization": f"Bearer {self.api_key}"
1026
+ }
1027
+
1028
+ response = requests.post(self.api_url, headers=headers, json=payload, timeout=30)
1029
+ response.raise_for_status()
1030
+
1031
+ result = response.json()
1032
+ return result['choices'][0]['message']['content']
1033
+
1034
+ except Exception as e:
1035
+ print(f" ⚠️ LLM API 호출 오류: {e}")
1036
+ return None
1037
+
1038
+ def fetch_model_card(self, model_id: str) -> str:
1039
+ """허깅페이스 모델 카드(README.md) 가져오기"""
1040
+ try:
1041
+ url = f"https://huggingface.co/{model_id}/raw/main/README.md"
1042
+ response = requests.get(url, timeout=10)
1043
+
1044
+ if response.status_code == 200:
1045
+ content = response.text
1046
+ # 너무 긴 경우 앞부분만 (약 3000자)
1047
+ if len(content) > 3000:
1048
+ content = content[:3000] + "\n...(후략)"
1049
+ return content
1050
+ else:
1051
+ return None
1052
+ except Exception as e:
1053
+ print(f" ⚠️ 모델 카드 가져오기 오류: {e}")
1054
+ return None
1055
+
1056
+ def fetch_space_code(self, space_id: str) -> str:
1057
+ """허깅페이스 스페이스 app.py 가져오기"""
1058
+ try:
1059
+ url = f"https://huggingface.co/spaces/{space_id}/raw/main/app.py"
1060
+ response = requests.get(url, timeout=10)
1061
+
1062
+ if response.status_code == 200:
1063
+ content = response.text
1064
+ # 너무 긴 경우 앞부분만 (약 2000자)
1065
+ if len(content) > 2000:
1066
+ content = content[:2000] + "\n...(후략)"
1067
+ return content
1068
+ else:
1069
+ return None
1070
+ except Exception as e:
1071
+ print(f" ⚠️ 스페이스 코드 가져오기 오류: {e}")
1072
+ return None
1073
 
1074
  def analyze_news_simple(self, title: str, content: str = "") -> Dict:
1075
+ """뉴스 기사를 중고등학생 수준으로 분석 - LLM API 사용"""
1076
+
1077
+ # LLM API가 사용 가능한 경우 실제 분석
1078
+ if self.api_available:
1079
+ try:
1080
+ messages = [
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
+
1108
+ result = self.call_llm(messages, max_tokens=1500)
1109
+
1110
+ if result:
1111
+ # JSON 파싱 시도
1112
+ try:
1113
+ # 마크다운 코드 블록 제거
1114
+ result_clean = result.replace('```json', '').replace('```', '').strip()
1115
+ analysis = json.loads(result_clean)
1116
+
1117
+ # 필수 필드 검증
1118
+ required_fields = ['summary', 'significance', 'impact_level', 'impact_text', 'impact_description', 'action']
1119
+ if all(field in analysis for field in required_fields):
1120
+ print(f" ✅ LLM 분석 성공")
1121
+ return analysis
1122
+ else:
1123
+ print(f" ⚠️ LLM 응답에 필수 필드 누락")
1124
+ except json.JSONDecodeError as e:
1125
+ print(f" ⚠️ JSON 파싱 오류: {e}")
1126
+ print(f" 원본 응답: {result[:200]}...")
1127
+
1128
+ except Exception as e:
1129
+ print(f" ⚠️ LLM API 호출 오류: {e}")
1130
+
1131
+ # Fallback: 템플릿 기반 분석 (LLM 실패 시에만)
1132
+ print(f" ℹ️ 템플릿 모드로 전환")
1133
 
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": "높음",
1147
+ "impact_description": "클라우드 인프라 부족은 AI 서비스 확장에 직접적인 영향을 미치며, 향후 AI 기술 접근성과 비용 구조를 변화시킬 수 있습니다.",
1148
+ "action": "챗GPT Claude 같은 AI 도구를 활용한 학습 방법을 익히세요. 보고서 작성, 코딩 학습, 외국어 공부 등 다양한 분야에서 AI를 학습 보조 도구로 사용할 있습니다."
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": "중간",
1161
+ "impact_description": "AI 하드웨어 공급망의 지정학적 변화는 글로벌 AI 산업 지형도에 영향을 미칠 있으며, 특히 반도체 산업과 국제 관계에 중요한 의미를 가집니다.",
1162
+ "action": "컴퓨터 하드웨어, 특히 GPU의 작동 원리와 AI 학습에서의 역할을 공부해보세요. 병렬 처리, 행렬 연산 등의 개념을 이해하면 AI 기술의 근간을 파악할 수 있습니다."
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": "높음",
1175
+ "impact_description": "영상 제작 산업의 패러다임이 변화하고 있으며, 교육, 마케팅, 엔터테인먼트 등 다양한 분야에서 AI 동영상 생성 기술의 활용이 증가할 것으로 예상됩니다.",
1176
+ "action": "AI 동영상 생성 도구의 가능성과 한계를 탐구해보세요. 창의적인 아이디어를 시각화하는 방법을 배우고, 동시에 딥페이크 같은 악용 사례에 대한 비판적 사고도 함양하세요."
1177
  }
1178
  }
1179
 
 
1182
  if keyword.lower() in title.lower():
1183
  return template
1184
 
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": "중간",
1197
+ "impact_description": "AI 기술의 발전은 교육, 취업, 산업 전반에 걸쳐 구조적 변화를 가져올 것이며, 이에 대한 이해와 준비가 필요합니다.",
1198
+ "action": "AI 기술의 기본 원리를 학습하고, 관련 프로그래밍(Python 등)이나 데이터 과학 기초를 공부해보세요. 또한 AI 윤리와 사회적 영향에 대해서도 비판적으로 사고하는 습관을 기르세요."
1199
  }
1200
+
1201
  def analyze_model(self, model_name: str, task: str, downloads: int) -> str:
1202
+ """허깅페이스 모델 분석 - 모델 카드를 LLM으로 분석"""
1203
+
1204
+ # 1. 모델 카드 가져오기
1205
+ model_card = self.fetch_model_card(model_name)
1206
+
1207
+ # 2. LLM으로 분석
1208
+ if model_card and self.api_available:
1209
+ try:
1210
+ messages = [
1211
+ {
1212
+ "role": "system",
1213
+ "content": "당신은 중고등학생도 이해할 수 있게 AI 모델을 쉽게 설명하는 전문가입니다. 한국어로 답변하세요."
1214
+ },
1215
+ {
1216
+ "role": "user",
1217
+ "content": f"""다음은 허깅페이스 모델 '{model_name}'의 모델 카드입니다:
1218
+
1219
+ {model_card}
1220
+
1221
+ 이 모델을 중고등학생이 이해할 수 있도록 3-4문장으로 쉽게 설명해주세요. 다음 내용을 포함하세요:
1222
+ 1. 이 모델이 무엇을 하는지
1223
+ 2. 어떤 특징이 있는지
1224
+ 3. 누가 사용하면 좋은지
1225
+
1226
+ 답변은 반드시 3-4문장의 한국어로만 작성하세요."""
1227
+ }
1228
+ ]
1229
+
1230
+ result = self.call_llm(messages, max_tokens=500)
1231
+
1232
+ if result:
1233
+ return result.strip()
1234
+
1235
+ except Exception as e:
1236
+ print(f" ⚠️ 모델 분석 LLM 오류: {e}")
1237
 
1238
+ # 3. Fallback: 템플릿 기반 설명
1239
  task_explanations = {
1240
  "text-generation": "글을 자동으로 만들어주는",
1241
  "image-to-text": "사진을 보고 설명을 써주는",
 
1261
 
1262
  return f"이 모델은 {task_desc} AI예요. {popularity} 사람들이 다운로드해서 사용하고 있어요. {model_name.split('/')[-1]}라는 이름으로 유명해요!"
1263
 
1264
+ def analyze_space(self, space_name: str, space_id: str, description: str) -> Dict:
1265
+ """허깅페이스 스페이스 분석 - app.py를 LLM으로 분석"""
1266
+
1267
+ # 1. app.py 코드 가져오기
1268
+ app_code = self.fetch_space_code(space_id)
1269
+
1270
+ # 2. LLM으로 분석
1271
+ if app_code and self.api_available:
1272
+ try:
1273
+ messages = [
1274
+ {
1275
+ "role": "system",
1276
+ "content": "당신은 중고등학생도 이해할 수 있게 AI 애플리케이션을 쉽게 설명하는 전문가입니다. 한국어로 답변하세요."
1277
+ },
1278
+ {
1279
+ "role": "user",
1280
+ "content": f"""다음은 허깅페이스 스페이스 '{space_name}'의 app.py 코드입니다:
1281
+
1282
+ {app_code}
1283
+
1284
+ 이 앱을 중고등학생이 이해할 수 있도록 3-4문장으로 쉽게 설명해주세요. 다음 내용을 포함하세요:
1285
+ 1. 이 앱이 무엇을 하는지
1286
+ 2. 어떤 기술을 사용하는지
1287
+ 3. 어떻게 활용할 수 있는지
1288
+
1289
+ 답변은 반드시 3-4문장의 한국어로만 작성하세요."""
1290
+ }
1291
+ ]
1292
+
1293
+ result = self.call_llm(messages, max_tokens=500)
1294
+
1295
+ if result:
1296
+ # 기술 스택 추출 시도
1297
+ tech_stack = []
1298
+ if 'gradio' in app_code.lower():
1299
+ tech_stack.append('Gradio')
1300
+ if 'streamlit' in app_code.lower():
1301
+ tech_stack.append('Streamlit')
1302
+ if 'transformers' in app_code.lower():
1303
+ tech_stack.append('Transformers')
1304
+ if 'torch' in app_code.lower() or 'pytorch' in app_code.lower():
1305
+ tech_stack.append('PyTorch')
1306
+ if 'tensorflow' in app_code.lower():
1307
+ tech_stack.append('TensorFlow')
1308
+ if 'diffusers' in app_code.lower():
1309
+ tech_stack.append('Diffusers')
1310
+
1311
+ if not tech_stack:
1312
+ tech_stack = ['Python', 'AI']
1313
+
1314
+ return {
1315
+ "simple_explanation": result.strip(),
1316
+ "tech_stack": tech_stack
1317
+ }
1318
+
1319
+ except Exception as e:
1320
+ print(f" ⚠️ 스페이스 분석 LLM 오류: {e}")
1321
 
1322
+ # 3. Fallback: 템플릿 기반 설명
1323
  return {
1324
  "simple_explanation": f"{space_name}는 웹브라우저에서 바로 AI를 체험해볼 수 있는 곳이에요. 설치 없이도 사용할 수 있어서 편리해요! 마치 온라인 게임처럼 바로 접속해서 AI를 사용할 수 있답니다.",
1325
  "tech_stack": ["Python", "Gradio", "Transformers", "PyTorch"]
 
1341
  }
1342
  self.news_data = []
1343
 
1344
+ def fetch_aitimes_news(self) -> List[Dict]:
1345
+ """AI Times에서 오늘 날짜 뉴스 크롤링"""
1346
+ print("📰 AI Times 뉴스 수집 중...")
1347
+
1348
+ # 수집할 URL 목록
1349
+ urls = [
1350
+ 'https://www.aitimes.com/news/articleList.html?sc_multi_code=S2&view_type=sm',
1351
+ 'https://www.aitimes.com/news/articleList.html?sc_section_code=S1N24&view_type=sm'
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:
1359
+ print(f" 🔍 [{url_idx}/2] 수집 중: {url}")
1360
+ response = requests.get(url, timeout=15, headers={
1361
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
1362
+ })
1363
+ response.raise_for_status()
1364
+ response.encoding = 'utf-8'
1365
+
1366
+ soup = BeautifulSoup(response.text, 'html.parser')
1367
+
1368
+ # 모든 링크 찾기
1369
+ articles = soup.find_all('a', href=re.compile(r'/news/articleView\.html\?idxno=\d+'))
1370
+
1371
+ print(f" → {len(articles)}개 링크 발견")
1372
+
1373
+ articles_found = 0
1374
+ for article_tag in articles:
1375
+ try:
1376
+ # 제목과 링크
1377
+ title = article_tag.get_text(strip=True)
1378
+ link = article_tag.get('href', '')
1379
+
1380
+ # 링크 정규화
1381
+ if link and not link.startswith('http'):
1382
+ if link.startswith('/'):
1383
+ link = 'https://www.aitimes.com' + link
1384
+ else:
1385
+ link = 'https://www.aitimes.com/' + link
1386
+
1387
+ # 제목이 너무 짧으면 스킵
1388
+ if not title or len(title) < 10:
1389
+ continue
1390
+
1391
+ # 부모 요소에서 날짜 찾기
1392
+ parent = article_tag.parent
1393
+ date_text = ''
1394
+
1395
+ # 부모의 모든 텍스트에서 날짜 패턴 찾기
1396
+ if parent:
1397
+ parent_text = parent.get_text()
1398
+ date_match = re.search(r'(\d{2}-\d{2}\s+\d{2}:\d{2})', parent_text)
1399
+ if date_match:
1400
+ date_text = date_match.group(1)
1401
+
1402
+ # 날짜가 없으면 다음 형제 요소들 확인
1403
+ if not date_text:
1404
+ for sibling in article_tag.find_next_siblings():
1405
+ sibling_text = sibling.get_text()
1406
+ date_match = re.search(r'(\d{2}-\d{2}\s+\d{2}:\d{2})', sibling_text)
1407
+ if date_match:
1408
+ date_text = date_match.group(1)
1409
+ break
1410
+
1411
+ # 날짜가 여전히 없으면 오늘 날짜 사용
1412
+ if not date_text:
1413
+ date_text = today
1414
+
1415
+ # 오늘 날짜만 필터링
1416
+ if today not in date_text:
1417
+ continue
1418
+
1419
+ news_item = {
1420
+ 'title': title,
1421
+ 'url': link,
1422
+ 'date': date_text,
1423
+ 'source': 'AI Times',
1424
+ 'category': 'AI'
1425
+ }
1426
+
1427
+ all_news.append(news_item)
1428
+ articles_found += 1
1429
+
1430
+ print(f" ✓ 추가: {title[:60]}... ({date_text})")
1431
+
1432
+ except Exception as e:
1433
+ continue
1434
+
1435
+ print(f" → {articles_found}개 오늘자 기사 수집\n")
1436
+ time.sleep(1) # 서버 부하 방지
1437
+
1438
+ except Exception as e:
1439
+ print(f" ⚠️ URL 수집 오류: {e}\n")
1440
+ continue
1441
+
1442
+ # 중복 제거 (URL 기준)
1443
+ unique_news = []
1444
+ seen_urls = set()
1445
+ for news in all_news:
1446
+ if news['url'] not in seen_urls:
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:
1454
+ print("⚠️ 뉴스가 부족하여 최근 샘플 추가\n")
1455
+ sample_news = [
1456
+ {
1457
+ 'title': 'MS "챗GPT 수요 폭증으로 데이터센터 부족...2026년까지 지속"',
1458
+ 'url': 'https://www.aitimes.com/news/articleView.html?idxno=203055',
1459
+ 'date': '10-10 15:10',
1460
+ 'source': 'AI Times',
1461
+ 'category': 'AI'
1462
+ },
1463
+ {
1464
+ 'title': '미국, UAE에 GPU 판매 일부 승인...엔비디아 시총 5조달러 눈앞',
1465
+ 'url': 'https://www.aitimes.com/news/articleView.html?idxno=203053',
1466
+ 'date': '10-10 14:46',
1467
+ 'source': 'AI Times',
1468
+ 'category': 'AI'
1469
+ },
1470
+ {
1471
+ 'title': '소라, 챗GPT보다 빨리 100만 다운로드 돌파',
1472
+ 'url': 'https://www.aitimes.com/news/articleView.html?idxno=203045',
1473
+ 'date': '10-10 12:55',
1474
+ 'source': 'AI Times',
1475
+ 'category': 'AI'
1476
+ }
1477
+ ]
1478
+ for sample in sample_news:
1479
+ if sample['url'] not in seen_urls:
1480
+ unique_news.append(sample)
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}개 수집 중...")
 
1511
  'rank': idx
1512
  }
1513
 
1514
+ # LLM 분석 추가 (모델 카드 분석)
1515
+ print(f" 🔍 {idx}. {model.id} 분석 중...")
1516
  model_info['analysis'] = self.llm_analyzer.analyze_model(
1517
  model_info['name'],
1518
  model_info['task'],
 
1521
 
1522
  models_list.append(model_info)
1523
 
1524
+ # API rate limit 방지를 위한 짧은 대기
1525
+ time.sleep(0.5)
1526
+
1527
  # 진행상황 표시
1528
+ if idx % 5 == 0:
1529
  print(f" ✓ {idx}개 모델 처리 완료...")
1530
 
1531
  except Exception as e:
 
1577
  'rank': idx
1578
  }
1579
 
1580
+ # LLM 분석 추가 (app.py 분석)
1581
+ print(f" 🔍 {idx}. {space.id} 분석 중...")
1582
  space_analysis = self.llm_analyzer.analyze_space(
1583
  space_info['name'],
1584
+ space_info['space_id'],
1585
  space_info['title']
1586
  )
1587
 
 
1591
 
1592
  spaces_list.append(space_info)
1593
 
1594
+ # API rate limit 방지를 위한 짧은 대기
1595
+ time.sleep(0.5)
1596
+
1597
  # 진행상황 표시
1598
+ if idx % 5 == 0:
1599
  print(f" ✓ {idx}개 스페이스 처리 완료...")
1600
 
1601
  except Exception as 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("⚠️ 수집된 뉴스가 없습니다.")
1627
+ return []
1628
+
1629
  analyzed_news = []
1630
 
1631
+ for idx, article in enumerate(news, 1):
1632
+ print(f" 🧠 {idx}/{len(news)}: {article['title'][:50]}... 분석 중")
1633
+
1634
  analysis = self.llm_analyzer.analyze_news_simple(
1635
  article['title'],
1636
  ""
 
1642
  print(f"✅ {len(analyzed_news)}개 뉴스 분석 완료")
1643
 
1644
  # DB에 저장
1645
+ if analyzed_news:
1646
+ save_news_to_db(analyzed_news)
1647
 
1648
  return analyzed_news
1649
 
 
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,
1806
  "models_count": models_count,
1807
  "spaces_count": spaces_count
1808
  },
1809
+ "fireworks_api": {
1810
+ "configured": bool(os.environ.get('FIREWORKS_API_KEY'))
1811
+ },
1812
  "timestamp": datetime.now().isoformat()
1813
  })
1814
  except Exception as e:
 
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 분석
1842
  • 🎨 탭 UI (뉴스/모델/스페이스)
1843
 
1844
+ 🔑 API 설정:
1845
+ FIREWORKS_API_KEY: {"✅ 설정됨" if os.environ.get('FIREWORKS_API_KEY') else "❌ 미설정 (템플릿 모드)"}
1846
+
1847
  🚀 서버 정보:
1848
  📍 메인: http://localhost:{port}
1849
  🔄 강제갱신: http://localhost:{port}/?refresh=true
 
1878
  print("\n\n👋 서버 종료!")
1879
  sys.exit(0)
1880
  except Exception as e:
1881
+ print(f"\n❌서버 오류: {e}")
1882
  sys.exit(1)