aiqtech commited on
Commit
6f2c445
Β·
verified Β·
1 Parent(s): 1a5abda

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +285 -199
app.py CHANGED
@@ -17,9 +17,19 @@ from bs4 import BeautifulSoup
17
  from urllib.parse import urlparse
18
  import urllib.request
19
 
 
 
 
 
 
 
 
 
 
20
  # ν™˜κ²½ λ³€μˆ˜μ—μ„œ 토큰 κ°€μ Έμ˜€κΈ°
21
  FRIENDLI_TOKEN = os.getenv("FRIENDLI_TOKEN", "YOUR_FRIENDLI_TOKEN")
22
  BAPI_TOKEN = os.getenv("BAPI_TOKEN", "YOUR_BRAVE_API_TOKEN")
 
23
  API_URL = "https://api.friendli.ai/dedicated/v1/chat/completions"
24
  BRAVE_SEARCH_URL = "https://api.search.brave.com/res/v1/web/search"
25
  MODEL_ID = "dep89a2fld32mcm"
@@ -32,15 +42,31 @@ class LLMCollaborativeSystem:
32
  def __init__(self):
33
  self.token = FRIENDLI_TOKEN
34
  self.bapi_token = BAPI_TOKEN
 
35
  self.api_url = API_URL
36
  self.brave_url = BRAVE_SEARCH_URL
37
  self.model_id = MODEL_ID
38
  self.test_mode = TEST_MODE or (self.token == "YOUR_FRIENDLI_TOKEN")
 
 
39
 
40
  if self.test_mode:
41
  logger.warning("ν…ŒμŠ€νŠΈ λͺ¨λ“œλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.")
42
  if self.bapi_token == "YOUR_BRAVE_API_TOKEN":
43
  logger.warning("Brave API 토큰이 μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.")
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
  def create_headers(self):
46
  """API 헀더 생성"""
@@ -169,6 +195,33 @@ class LLMCollaborativeSystem:
169
  4. λͺ…ν™•ν•œ κ²°λ‘ κ³Ό λ‹€μŒ 단계λ₯Ό μ œμ‹œν•˜μ„Έμš”
170
  5. 전문적이고 완성도 높은 μ΅œμ’… λ³΄κ³ μ„œ ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜μ„Έμš”"""
171
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
  def extract_keywords(self, supervisor_response: str) -> List[str]:
173
  """κ°λ…μž μ‘λ‹΅μ—μ„œ ν‚€μ›Œλ“œ μΆ”μΆœ"""
174
  keywords = []
@@ -392,9 +445,71 @@ class LLMCollaborativeSystem:
392
  yield chunk + " "
393
  time.sleep(0.05)
394
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
395
  def call_llm_streaming(self, messages: List[Dict[str, str]], role: str) -> Generator[str, None, None]:
396
  """슀트리밍 LLM API 호좜"""
397
 
 
 
 
 
 
398
  # ν…ŒμŠ€νŠΈ λͺ¨λ“œ
399
  if self.test_mode:
400
  logger.info(f"ν…ŒμŠ€νŠΈ λͺ¨λ“œ 슀트리밍 - Role: {role}")
@@ -424,30 +539,21 @@ class LLMCollaborativeSystem:
424
  - μ΅œμ‹  연ꡬ에 λ”°λ₯΄λ©΄ λͺ¨λΈ μ΅œμ ν™”μ˜ 핡심은 μ•„ν‚€ν…μ²˜ 섀계와 ν›ˆλ ¨ μ „λž΅μ˜ κ· ν˜•μž…λ‹ˆλ‹€ (신뒰도: 0.85)
425
  - AutoML 도ꡬ듀이 ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ„ μžλ™ν™”ν•˜μ—¬ νš¨μœ¨μ„±μ„ 크게 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€ (신뒰도: 0.82)
426
  - 좜처: ML Conference 2024 (https://mlconf2024.org), Google Research (https://research.google)
427
- - λ™μ˜μ–΄ 검색 κ²°κ³Ό: "ML improvement", "AI optimization"μ—μ„œ μΆ”κ°€ 정보 확인
428
 
429
  **2. Performance Improvement Strategies (신뒰도 λ†’μŒ)**
430
  - 데이터 ν’ˆμ§ˆ κ°œμ„ μ΄ λͺ¨λΈ μ„±λŠ₯ ν–₯μƒμ˜ 80%λ₯Ό μ°¨μ§€ν•œλ‹€λŠ” 연ꡬ κ²°κ³Ό (신뒰도: 0.90)
431
  - 앙상블 기법과 μ „μ΄ν•™μŠ΅μ΄ μ£Όμš” μ„±λŠ₯ κ°œμ„  λ°©λ²•μœΌλ‘œ μž…μ¦λ¨ (신뒰도: 0.78)
432
  - 좜처: Stanford AI Lab (https://ai.stanford.edu), MIT CSAIL (https://csail.mit.edu)
433
- - 벀치마크: ImageNetμ—μ„œ 95% μ΄μƒμ˜ 정확도 달성 사둀
434
 
435
  **3. Model Efficiency Techniques (신뒰도 쀑간)**
436
  - λͺ¨λΈ κ²½λŸ‰ν™”(Pruning, Quantization)둜 μΆ”λ‘  속도 10λ°° ν–₯상 κ°€λŠ₯ (신뒰도: 0.75)
437
  - Knowledge Distillation으둜 λͺ¨λΈ 크기 90% κ°μ†Œ, μ„±λŠ₯ μœ μ§€ (신뒰도: 0.72)
438
  - 좜처: ArXiv λ…Όλ¬Έ (https://arxiv.org/abs/2023.xxxxx)
439
- - ⚠️ 주의: 일뢀 μ†ŒμŠ€λŠ” 5-7λ°° ν–₯μƒλ§Œμ„ λ³΄κ³ ν•˜μ—¬ 정보 상좩 쑴재
440
 
441
  **4. μ‹€μ œ 적용 사둀 (신뒰도 λ†’μŒ)**
442
  - Netflix: μΆ”μ²œ μ‹œμŠ€ν…œ κ°œμ„ μœΌλ‘œ μ‚¬μš©μž λ§Œμ‘±λ„ 35% ν–₯상 (신뒰도: 0.88)
443
  - Tesla: μ‹€μ‹œκ°„ 객체 인식 속도 50% κ°œμ„  (신뒰도: 0.80)
444
  - OpenAI: GPT λͺ¨λΈ νš¨μœ¨μ„± κ°œμ„ μœΌλ‘œ λΉ„μš© 70% 절감 (신뒰도: 0.85)
445
- - 좜처: 각 κΈ°μ—… 곡식 λΈ”λ‘œκ·Έ 및 기술 λ°œν‘œ 자료
446
-
447
- **발견된 정보 λͺ¨μˆœ:**
448
- 1. λͺ¨λΈ μ••μΆ•λ₯ : μΌλΆ€λŠ” 90% μ••μΆ• κ°€λŠ₯ν•˜λ‹€κ³  μ£Όμž₯ν•˜λ‚˜, λ‹€λ₯Έ μ†ŒμŠ€λŠ” 70%κ°€ ν•œκ³„λΌκ³  λͺ…μ‹œ
449
- 2. μ„±λŠ₯ ν–₯상 폭: 10λ°° vs 5-7λ°° ν–₯상에 λŒ€ν•œ 의견 차이 쑴재
450
- 3. ꢌμž₯사항: μ‹€μ œ 적용 μ‹œ 보수적인 수치(5-7λ°°)λ₯Ό κΈ°μ€€μœΌλ‘œ κ³„νš 수립 ꢌμž₯
451
 
452
  **핡심 μΈμ‚¬μ΄νŠΈ:**
453
  - μ΅œμ‹  νŠΈλ Œλ“œλŠ” νš¨μœ¨μ„±κ³Ό μ„±λŠ₯의 κ· ν˜•μ— 초점
@@ -497,27 +603,7 @@ class LLMCollaborativeSystem:
497
  - Knowledge Distillation κ΅¬ν˜„
498
  * Teacher λͺ¨λΈ: ν˜„μž¬ λŒ€κ·œλͺ¨ λͺ¨λΈ
499
  * Student λͺ¨λΈ: 90% μž‘μ€ 크기 λͺ©ν‘œ (쑰사 κ²°κ³Ό 기반)
500
- * κ΅¬ν˜„ ν”„λ ˆμž„μ›Œν¬: PyTorch/TensorFlow
501
- - Pruning 및 Quantization 적용
502
- * ꡬ쑰적 pruning으둜 50% νŒŒλΌλ―Έν„° 제거
503
- * INT8 quantization으둜 μΆ”κ°€ 4λ°° 속도 ν–₯상
504
- * Tesla 사둀 μ°Έκ³ : TensorRT μ΅œμ ν™” 적용
505
-
506
- **4단계: μ„±κ³Ό 검증 및 배포 (7-8μ£Όμ°¨)**
507
- - μ„±κ³Ό μ§€ν‘œ μΈ‘μ •
508
- * μΆ”λ‘  속도: λͺ©ν‘œ 10λ°° ν–₯상 (쑰사 κ²°κ³Ό 기반)
509
- * 정확도 손싀: μ΅œλŒ€ 2% 이내 μœ μ§€
510
- * λΉ„μš© 절감: 70% λͺ©ν‘œ (OpenAI 사둀 μ°Έκ³ )
511
- - 배포 μ „λž΅
512
- * A/B ν…ŒμŠ€νŠΈ: 10% νŠΈλž˜ν”½μœΌλ‘œ μ‹œμž‘
513
- * λͺ¨λ‹ˆν„°λ§: Prometheus + Grafana λŒ€μ‹œλ³΄λ“œ
514
- * λ‘€λ°± κ³„νš: μ„±λŠ₯ μ €ν•˜ μ‹œ μžλ™ λ‘€λ°±
515
-
516
- **μ˜ˆμƒ κ²°κ³Όλ¬Ό**
517
- - μ΅œμ ν™”λœ λͺ¨λΈ (크기 90% κ°μ†Œ, 속도 10λ°° ν–₯상)
518
- - 상세 μ„±λŠ₯ 벀치마크 λ³΄κ³ μ„œ
519
- - ν”„λ‘œλ•μ…˜ 배포 κ°€μ΄λ“œ 및 λͺ¨λ‹ˆν„°λ§ λŒ€μ‹œλ³΄λ“œ
520
- - μž¬ν˜„ κ°€λŠ₯ν•œ μ΅œμ ν™” νŒŒμ΄ν”„λΌμΈ μ½”λ“œ""",
521
 
522
  "supervisor_review": """μ‹€ν–‰μž AI의 κ³„νšμ„ κ²€ν† ν•œ κ²°κ³Ό, 쑰사 λ‚΄μš©μ΄ 잘 λ°˜μ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 κ°œμ„ μ‚¬ν•­μ„ μ œμ•ˆν•©λ‹ˆλ‹€.
523
 
@@ -534,16 +620,10 @@ class LLMCollaborativeSystem:
534
  2. **λΉ„μš© 뢄석 ꡬ체화**
535
  - OpenAI μ‚¬λ‘€μ˜ 70% μ ˆκ°μ„ μœ„ν•œ ꡬ체적인 λΉ„μš© 계산
536
  - ROI 뢄석 및 투자 λŒ€λΉ„ 효과 μΈ‘μ • 방법
537
-
538
- 3. **νŒ€ ν˜‘μ—… 체계화**
539
- - 데이터 κ³Όν•™μž, ML μ—”μ§€λ‹ˆμ–΄, DevOps κ°„ μ—­ν•  λΆ„λ‹΄ λͺ…ν™•ν™”
540
- - μ£Όκ°„ μ§„ν–‰ 상황 곡유 및 이슈 νŠΈλž˜ν‚Ή ν”„λ‘œμ„ΈμŠ€
541
 
542
  **μΆ”κ°€ ꢌμž₯사항**
543
  - μ΅œμ‹  연ꡬ 동ν–₯ λͺ¨λ‹ˆν„°λ§ 체계 ꡬ좕
544
- - κ²½μŸμ‚¬ λ²€μΉ˜λ§ˆν‚Ήμ„ μœ„ν•œ 정기적인 쑰사 ν”„λ‘œμ„ΈμŠ€
545
- - λ‚΄λΆ€ 지식 곡유λ₯Ό μœ„ν•œ λ¬Έμ„œν™” 및 μ„Έλ―Έλ‚˜ κ³„νš
546
- - μ‹€νŒ¨ μ‚¬λ‘€μ—μ„œ 배운 κ΅ν›ˆμ„ μΆ•μ ν•˜λŠ” μ‹œμŠ€ν…œ ꡬ좕""",
547
 
548
  "executor_final": """κ°λ…μž AI의 ν”Όλ“œλ°±μ„ μ™„μ „νžˆ λ°˜μ˜ν•˜μ—¬ μ΅œμ’… μ‹€ν–‰ λ³΄κ³ μ„œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
549
 
@@ -558,158 +638,98 @@ class LLMCollaborativeSystem:
558
  **μ›”-ν™”μš”μΌ: μ„±λŠ₯ λ©”νŠΈλ¦­ μˆ˜μ§‘**
559
  - MLflowλ₯Ό ν†΅ν•œ ν˜„μž¬ λͺ¨λΈ 전체 뢄석
560
  - Netflix 사둀 기반 핡심 μ§€ν‘œ: 정확도(92%), μ§€μ—°μ‹œκ°„(45ms), μ²˜λ¦¬λŸ‰(1,000 req/s)
561
- - λ¦¬μ†ŒμŠ€ μ‚¬μš©λŸ‰: GPU λ©”λͺ¨λ¦¬ 8GB, μΆ”λ‘  μ‹œ CPU μ‚¬μš©λ₯  85%
562
 
563
  **수-λͺ©μš”일: AutoML 초기 탐색**
564
  - Optuna둜 ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ΅œμ ν™” (200회 μ‹œλ„)
565
  - Ray Tune으둜 λΆ„μ‚° ν•™μŠ΅ ν™˜κ²½ ꡬ좕
566
- - 초기 κ°œμ„  κ°€λŠ₯μ„±: 15-20% μ„±λŠ₯ ν–₯상 μ˜ˆμƒ
567
-
568
- **κΈˆμš”μΌ: 진단 λ³΄κ³ μ„œ 및 리슀크 뢄석**
569
- - μ£Όμš” 병λͺ©: λͺ¨λΈ 크기(2.5GB), 배치 처리 λΉ„νš¨μœ¨μ„±
570
- - 리슀크: 데이터 λ“œλ¦¬ν”„νŠΈ, ν•˜λ“œμ›¨μ–΄ μ œμ•½
571
- - λ°±μ—… κ³„νš: ν΄λΌμš°λ“œ GPU μΈμŠ€ν„΄μŠ€ 확보
572
 
573
  ### μ˜ˆμƒ μ‚°μΆœλ¬Ό
574
  - 상세 μ„±λŠ₯ 베이슀라인 λ¬Έμ„œ
575
  - κ°œμ„  기회 μš°μ„ μˆœμœ„ 맀트릭슀
576
- - 리슀크 λ ˆμ§€μŠ€ν„° 및 λŒ€μ‘ κ³„νš
577
 
578
  ## πŸ“Š 2단계: 데이터 ν’ˆμ§ˆ κ°œμ„  (2-3μ£Όμ°¨)
579
 
580
  ### μ‹€ν–‰ κ³„νš
581
- **2μ£Όμ°¨: 데이터 μ •μ œ νŒŒμ΄ν”„λΌμΈ**
582
- ```python
583
- # data_quality_pipeline.py μ£Όμš” ꡬ성
584
- class DataQualityPipeline:
585
- def __init__(self):
586
- self.validators = [
587
- MissingValueHandler(threshold=0.05),
588
- OutlierDetector(method='isolation_forest'),
589
- LabelConsistencyChecker(),
590
- DataDriftMonitor()
591
- ]
592
-
593
- def process(self, data):
594
- # 80% κ·œμΉ™ 적용: 데이터 ν’ˆμ§ˆμ΄ μ„±λŠ₯의 80% κ²°μ •
595
- for validator in self.validators:
596
- data = validator.transform(data)
597
- self.log_metrics(validator.get_stats())
598
- return data
599
- ```
600
-
601
- **3μ£Όμ°¨: κ³ κΈ‰ 데이터 증강**
602
- - MixUp: 15% 정확도 ν–₯상 μ˜ˆμƒ
603
- - CutMix: 경계 κ²€μΆœ μ„±λŠ₯ 20% κ°œμ„ 
604
- - AutoAugment: μžλ™ 졜적 증강 μ •μ±… 탐색
605
- - A/B ν…ŒμŠ€νŠΈ: 각 기법별 효과 μΈ‘μ •
606
-
607
- ### 리슀크 λŒ€μ‘
608
- - 데이터 ν’ˆμ§ˆ μ €ν•˜ μ‹œ: λ‘€λ°± λ©”μ»€λ‹ˆμ¦˜ κ΅¬ν˜„
609
- - 증강 과적합 λ°©μ§€: 검증셋 뢄리 및 ꡐ차 검증
610
-
611
- ### μ˜ˆμƒ μ‚°μΆœλ¬Ό
612
- - μžλ™ν™”λœ 데이터 ν’ˆμ§ˆ νŒŒμ΄ν”„λΌμΈ
613
- - 데이터 ν’ˆμ§ˆ λŒ€μ‹œλ³΄λ“œ (Grafana)
614
- - 15% 이상 μ„±λŠ₯ ν–₯상 검증 λ³΄κ³ μ„œ
615
 
616
  ## πŸ“Š 3단계: λͺ¨λΈ μ΅œμ ν™” κ΅¬ν˜„ (4-6μ£Όμ°¨)
617
 
618
  ### μ‹€ν–‰ κ³„νš
619
- **4-5μ£Όμ°¨: Knowledge Distillation**
620
- - Teacher λͺ¨λΈ: ν˜„μž¬ 2.5GB λͺ¨λΈ
621
- - Student λͺ¨λΈ μ•„ν‚€ν…μ²˜:
622
- * νŒŒλΌλ―Έν„° 수: 250M β†’ 25M (90% κ°μ†Œ)
623
- * λ ˆμ΄μ–΄ 수: 24 β†’ 6
624
- * Hidden dimension: 1024 β†’ 256
625
- - ν›ˆλ ¨ μ „λž΅:
626
- * Temperature: 5.0
627
- * Alpha (KD loss weight): 0.7
628
- * ν›ˆλ ¨ 에폭: 50
629
-
630
- **6μ£Όμ°¨: Pruning & Quantization**
631
- - ꡬ쑰적 Pruning:
632
- * Magnitude 기반 50% 채널 제거
633
- * Fine-tuning: 10 에폭
634
- - INT8 Quantization:
635
- * Post-training quantization
636
- * Calibration dataset: 1,000 μƒ˜ν”Œ
637
- - TensorRT μ΅œμ ν™” (Tesla 사둀 적용):
638
- * FP16 μΆ”λ‘  ν™œμ„±ν™”
639
- * 동적 배치 μ΅œμ ν™”
640
-
641
- ### νŒ€ ν˜‘μ—… 체계
642
- - ML μ—”μ§€λ‹ˆμ–΄: λͺ¨λΈ μ•„ν‚€ν…μ²˜ 및 ν›ˆλ ¨
643
- - DevOps: 인프라 및 배포 νŒŒμ΄ν”„λΌμΈ
644
- - 데이터 κ³Όν•™μž: μ„±λŠ₯ 뢄석 및 검증
645
- - μ£Όκ°„ μŠ€νƒ λ“œμ—… λ―ΈνŒ… 및 Jira 이슈 νŠΈλž˜ν‚Ή
646
-
647
- ### μ˜ˆμƒ μ‚°μΆœλ¬Ό
648
- - μ΅œμ ν™”λœ λͺ¨λΈ 체크포인트
649
- - μ„±λŠ₯ 벀치마크 상세 λ³΄κ³ μ„œ
650
- - λͺ¨λΈ λ³€ν™˜ μžλ™ν™” 슀크립트
651
 
652
  ## πŸ“Š 4단계: μ„±κ³Ό 검증 및 ν”„λ‘œλ•μ…˜ 배포 (7-8μ£Όμ°¨)
653
 
654
  ### μ‹€ν–‰ κ³„νš
655
- **7μ£Όμ°¨: μ’…ν•© μ„±λŠ₯ 검증**
656
- - μ„±λŠ₯ μ§€ν‘œ 달성도:
657
- * μΆ”λ‘  속도: 45ms β†’ 4.5ms (10λ°° ν–₯상) βœ“
658
- * λͺ¨λΈ 크기: 2.5GB β†’ 250MB (90% κ°μ†Œ) βœ“
659
- * 정확도 손싀: 92% β†’ 90.5% (1.5% 손싀) βœ“
660
- - λΉ„μš© 뢄석:
661
- * GPU μΈμŠ€ν„΄μŠ€: $2,000/μ›” β†’ $600/μ›”
662
- * μ²˜λ¦¬λŸ‰ μ¦κ°€λ‘œ μΈν•œ μ„œλ²„ 수 κ°μ†Œ: 10λŒ€ β†’ 3λŒ€
663
- * 총 λΉ„μš© 절감: 70% 달성 βœ“
664
-
665
- **8μ£Όμ°¨: 단계적 배포**
666
- - Canary 배포:
667
- * 1일차: 1% νŠΈλž˜ν”½
668
- * 3일차: 10% νŠΈλž˜ν”½
669
- * 7일차: 50% νŠΈλž˜ν”½
670
- * 14일차: 100% μ „ν™˜
671
- - λͺ¨λ‹ˆν„°λ§ μ„€μ •:
672
- * Prometheus + Grafana λŒ€μ‹œλ³΄λ“œ
673
- * μ•Œλ¦Ό μž„κ³„κ°’: μ§€μ—°μ‹œκ°„ >10ms, 였λ₯˜μœ¨ >0.1%
674
- - λ‘€λ°± κ³„νš:
675
- * μžλ™ λ‘€λ°± 트리거 μ„€μ •
676
- * Blue-Green 배포둜 μ¦‰μ‹œ μ „ν™˜ κ°€λŠ₯
677
-
678
- ### ROI 뢄석
679
- - 초기 투자: $50,000 (인건비 + 인프라)
680
- - μ›”κ°„ μ ˆκ°μ•‘: $14,000
681
- - 투자 회수 κΈ°κ°„: 3.6κ°œμ›”
682
- - 1λ…„ 순이읡: $118,000
683
 
684
- ### μ˜ˆμƒ μ‚°μΆœλ¬Ό
685
- - ν”„λ‘œλ•μ…˜ 배포 μ™„λ£Œ
686
- - μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ λŒ€μ‹œλ³΄λ“œ
687
- - ROI 뢄석 λ³΄κ³ μ„œ
688
- - 운영 κ°€μ΄λ“œ λ¬Έμ„œ
689
 
690
- ## πŸ“ˆ 지속적 κ°œμ„  κ³„νš
691
 
692
- ### λͺ¨λ‹ˆν„°λ§ 및 μœ μ§€λ³΄μˆ˜
693
- - μ›”κ°„ μ„±λŠ₯ 리뷰 λ―ΈνŒ…
694
- - 뢄기별 μž¬ν›ˆλ ¨ κ³„νš
695
- - μ‹ κΈ°μˆ  λ„μž… κ²€ν†  (Sparse Models, MoE)
696
 
697
- ### 지식 곡유
698
- - λ‚΄λΆ€ 기술 μ„Έλ―Έλ‚˜ (μ›” 1회)
699
- - μ™ΈλΆ€ 컨퍼런슀 λ°œν‘œ μ€€λΉ„
700
- - μ˜€ν”ˆμ†ŒμŠ€ κΈ°μ—¬ κ³„νš
701
 
702
- ### μ°¨κΈ° ν”„λ‘œμ νŠΈ
703
- - μ—£μ§€ λ””λ°”μ΄μŠ€ 배포 μ΅œμ ν™”
704
- - μ—°ν•© ν•™μŠ΅(Federated Learning) λ„μž…
705
- - AutoML ν”Œλž«νΌ ꡬ좕
706
 
707
- ## πŸ“ κ²°λ‘ 
708
- λ³Έ ν”„λ‘œμ νŠΈλŠ” μ΅œμ‹  연ꡬ 결과와 업계 베슀트 ν”„λž™ν‹°μŠ€λ₯Ό μ μš©ν•˜μ—¬, 8μ£Ό λ§Œμ— λͺ¨λΈ μ„±λŠ₯을 획기적으둜 κ°œμ„ ν•˜κ³  운영 λΉ„μš©μ„ 70% μ ˆκ°ν•˜λŠ” μ„±κ³Όλ₯Ό 달성할 κ²ƒμœΌλ‘œ μ˜ˆμƒλ©λ‹ˆλ‹€. 체계적인 μ ‘κ·Όκ³Ό 리슀크 관리, 그리고 지속적인 κ°œμ„  κ³„νšμ„ 톡해 μž₯기적인 경쟁λ ₯을 확보할 수 μžˆμŠ΅λ‹ˆλ‹€.
709
 
710
- ---
711
- *μž‘μ„±μΌ: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}*
712
- *μž‘μ„±μž: ν˜‘λ ₯적 AI μ‹œμŠ€ν…œ (κ°λ…μž, μ‘°μ‚¬μž, μ‹€ν–‰μž AI)*"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
713
  }
714
 
715
  # ν”„λ‘¬ν”„νŠΈ λ‚΄μš©μ— 따라 μ μ ˆν•œ 응닡 선택
@@ -723,6 +743,8 @@ class DataQualityPipeline:
723
  response = test_responses["researcher"]
724
  elif role == "executor" and "μ΅œμ’… λ³΄κ³ μ„œ" in messages[0]["content"]:
725
  response = test_responses["executor_final"]
 
 
726
  else:
727
  response = test_responses["executor"]
728
 
@@ -734,7 +756,8 @@ class DataQualityPipeline:
734
  system_prompts = {
735
  "supervisor": "당신은 κ±°μ‹œμ  κ΄€μ μ—μ„œ λΆ„μ„ν•˜κ³  μ§€λ„ν•˜λŠ” κ°λ…μž AIμž…λ‹ˆλ‹€.",
736
  "researcher": "당신은 정보λ₯Ό μ‘°μ‚¬ν•˜κ³  μ²΄κ³„μ μœΌλ‘œ μ •λ¦¬ν•˜λŠ” μ‘°μ‚¬μž AIμž…λ‹ˆλ‹€.",
737
- "executor": "당신은 세뢀적인 λ‚΄μš©μ„ κ΅¬ν˜„ν•˜λŠ” μ‹€ν–‰μž AIμž…λ‹ˆλ‹€."
 
738
  }
739
 
740
  full_messages = [
@@ -797,15 +820,18 @@ llm_system = LLMCollaborativeSystem()
797
  # λ‚΄λΆ€ νžˆμŠ€ν† λ¦¬ 관리 (UIμ—λŠ” ν‘œμ‹œν•˜μ§€ μ•ŠμŒ)
798
  internal_history = []
799
 
800
- def process_query_streaming(user_query: str):
801
  """μŠ€νŠΈλ¦¬λ°μ„ μ§€μ›ν•˜λŠ” 쿼리 처리"""
802
  global internal_history
803
 
804
  if not user_query:
805
  return "", "", "", "", "❌ μ§ˆλ¬Έμ„ μž…λ ₯ν•΄μ£Όμ„Έμš”."
806
 
 
 
 
807
  conversation_log = []
808
- all_responses = {"supervisor": [], "researcher": [], "executor": []}
809
 
810
  try:
811
  # 1단계: κ°λ…μž AI 초기 뢄석 및 ν‚€μ›Œλ“œ μΆ”μΆœ
@@ -965,6 +991,26 @@ def process_query_streaming(user_query: str):
965
 
966
  all_responses["executor"].append(final_executor_response)
967
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
968
  # μ΅œμ’… κ²°κ³Ό 생성 (μ΅œμ’… λ³΄κ³ μ„œλ₯Ό λ©”μΈμœΌλ‘œ)
969
  final_summary = f"""## 🎯 μ΅œμ’… μ’…ν•© λ³΄κ³ μ„œ
970
 
@@ -976,6 +1022,11 @@ def process_query_streaming(user_query: str):
976
 
977
  ---
978
 
 
 
 
 
 
979
  <details>
980
  <summary>πŸ“‹ 전체 ν˜‘λ ₯ κ³Όμ • 보기</summary>
981
 
@@ -997,16 +1048,28 @@ def process_query_streaming(user_query: str):
997
  </details>
998
 
999
  ---
1000
- *이 λ³΄κ³ μ„œλŠ” μ›Ή 검색을 ν†΅ν•œ μ΅œμ‹  정보와 AIλ“€μ˜ ν˜‘λ ₯, 그리고 ν”Όλ“œλ°± λ°˜μ˜μ„ 톡해 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*"""
1001
 
1002
  # λ‚΄λΆ€ νžˆμŠ€ν† λ¦¬ μ—…λ°μ΄νŠΈ (UIμ—λŠ” ν‘œμ‹œν•˜μ§€ μ•ŠμŒ)
1003
  internal_history.append((user_query, final_summary))
1004
 
1005
- yield supervisor_text, researcher_text, executor_text, final_summary, "βœ… μ΅œμ’… λ³΄κ³ μ„œ μ™„μ„±!"
 
 
 
 
 
 
 
 
 
 
 
 
1006
 
1007
  except Exception as e:
1008
  error_msg = f"❌ 처리 쀑 였λ₯˜: {str(e)}"
1009
- yield "", "", "", error_msg, error_msg
1010
 
1011
  def clear_all():
1012
  """λͺ¨λ“  λ‚΄μš© μ΄ˆκΈ°ν™”"""
@@ -1022,21 +1085,29 @@ css = """
1022
  .supervisor-box textarea {
1023
  border-left: 4px solid #667eea !important;
1024
  padding-left: 10px !important;
 
1025
  }
1026
  .researcher-box textarea {
1027
  border-left: 4px solid #10b981 !important;
1028
  padding-left: 10px !important;
 
1029
  }
1030
  .executor-box textarea {
1031
  border-left: 4px solid #764ba2 !important;
1032
  padding-left: 10px !important;
 
 
 
 
 
 
1033
  }
1034
  """
1035
 
1036
  with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css) as app:
1037
  gr.Markdown(
1038
  f"""
1039
- # 🀝 ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ (μ‘°μ‚¬μž 포함 + ν”Όλ“œλ°± 반영)
1040
  """
1041
  )
1042
 
@@ -1044,14 +1115,27 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1044
  with gr.Row():
1045
  with gr.Column():
1046
  gr.Markdown("""
1047
- ## πŸš€ κ°•ν™”λœ 쑰사 κΈ°λŠ₯
1048
- - **20개 검색 κ²°κ³Ό**: 더 λ§Žμ€ 정보 μˆ˜μ§‘
1049
- - **λ™μ˜οΏ½οΏ½ 검색**: κ΄€λ ¨ 정보 ν™•μž₯ 탐색
1050
- - **신뒰도 점수**: 0-1 점수둜 좜처 평가
1051
- - **μ›ΉνŽ˜μ΄μ§€ 뢄석**: μ£Όμš” URL μ½˜ν…μΈ  직접 확인
1052
- - **λͺ¨μˆœ 감지**: μƒμΆ©ν•˜λŠ” 정보 μžλ™ 식별
 
 
 
 
 
1053
  """)
1054
 
 
 
 
 
 
 
 
 
1055
  user_input = gr.Textbox(
1056
  label="질문 μž…λ ₯",
1057
  placeholder="예: κΈ°κ³„ν•™μŠ΅ λͺ¨λΈμ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” 방법은?",
@@ -1069,48 +1153,50 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1069
  max_lines=1
1070
  )
1071
 
1072
- # μ΅œμ’… κ²°κ³Ό
1073
  with gr.Row():
1074
- with gr.Column():
1075
- with gr.Accordion("πŸ“Š μ΅œμ’… μ’…ν•© κ²°κ³Ό", open=True):
1076
- final_output = gr.Markdown(
1077
- value="*μ§ˆλ¬Έμ„ μž…λ ₯ν•˜λ©΄ κ²°κ³Όκ°€ 여기에 ν‘œμ‹œλ©λ‹ˆλ‹€.*"
1078
- )
1079
-
1080
- # AI 좜λ ₯λ“€ - ν•œ 쀄에 λ‚˜λž€νžˆ 배치
1081
- with gr.Row():
1082
- # κ°λ…μž AI 좜λ ₯
1083
  with gr.Column():
1084
  gr.Markdown("### 🧠 κ°λ…μž AI (κ±°μ‹œμ  뢄석)")
1085
  supervisor_output = gr.Textbox(
1086
  label="",
1087
- lines=20,
1088
- max_lines=25,
1089
  interactive=False,
1090
  elem_classes=["supervisor-box"]
1091
  )
1092
 
1093
- # μ‘°μ‚¬μž AI 좜λ ₯
1094
  with gr.Column():
1095
  gr.Markdown("### πŸ” μ‘°μ‚¬μž AI (μ›Ή 검색 & 정리)")
1096
  researcher_output = gr.Textbox(
1097
  label="",
1098
- lines=20,
1099
- max_lines=25,
1100
  interactive=False,
1101
  elem_classes=["researcher-box"]
1102
  )
1103
-
1104
- # μ‹€ν–‰μž AI 좜λ ₯
 
1105
  with gr.Column():
1106
  gr.Markdown("### πŸ‘οΈ μ‹€ν–‰μž AI (λ―Έμ‹œμ  κ΅¬ν˜„)")
1107
  executor_output = gr.Textbox(
1108
  label="",
1109
- lines=20,
1110
- max_lines=25,
1111
  interactive=False,
1112
  elem_classes=["executor-box"]
1113
  )
 
 
 
 
 
 
 
 
 
 
1114
 
1115
  # 예제
1116
  gr.Examples(
@@ -1128,8 +1214,8 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1128
  # 이벀트 ν•Έλ“€λŸ¬
1129
  submit_btn.click(
1130
  fn=process_query_streaming,
1131
- inputs=[user_input],
1132
- outputs=[supervisor_output, researcher_output, executor_output, final_output, status_text]
1133
  ).then(
1134
  fn=lambda: "",
1135
  outputs=[user_input]
@@ -1137,8 +1223,8 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1137
 
1138
  user_input.submit(
1139
  fn=process_query_streaming,
1140
- inputs=[user_input],
1141
- outputs=[supervisor_output, researcher_output, executor_output, final_output, status_text]
1142
  ).then(
1143
  fn=lambda: "",
1144
  outputs=[user_input]
@@ -1146,7 +1232,7 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1146
 
1147
  clear_btn.click(
1148
  fn=clear_all,
1149
- outputs=[supervisor_output, researcher_output, executor_output, final_output, status_text]
1150
  )
1151
 
1152
 
 
17
  from urllib.parse import urlparse
18
  import urllib.request
19
 
20
+ # Gemini API μž„ν¬νŠΈ
21
+ try:
22
+ from google import genai
23
+ from google.genai import types
24
+ GEMINI_AVAILABLE = True
25
+ except ImportError:
26
+ GEMINI_AVAILABLE = False
27
+ logger.warning("Google Gemini APIκ°€ μ„€μΉ˜λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. pip install google-genai둜 μ„€μΉ˜ν•˜μ„Έμš”.")
28
+
29
  # ν™˜κ²½ λ³€μˆ˜μ—μ„œ 토큰 κ°€μ Έμ˜€κΈ°
30
  FRIENDLI_TOKEN = os.getenv("FRIENDLI_TOKEN", "YOUR_FRIENDLI_TOKEN")
31
  BAPI_TOKEN = os.getenv("BAPI_TOKEN", "YOUR_BRAVE_API_TOKEN")
32
+ GAPI_TOKEN = os.getenv("GAPI_TOKEN", "YOUR_GEMINI_API_TOKEN")
33
  API_URL = "https://api.friendli.ai/dedicated/v1/chat/completions"
34
  BRAVE_SEARCH_URL = "https://api.search.brave.com/res/v1/web/search"
35
  MODEL_ID = "dep89a2fld32mcm"
 
42
  def __init__(self):
43
  self.token = FRIENDLI_TOKEN
44
  self.bapi_token = BAPI_TOKEN
45
+ self.gapi_token = GAPI_TOKEN
46
  self.api_url = API_URL
47
  self.brave_url = BRAVE_SEARCH_URL
48
  self.model_id = MODEL_ID
49
  self.test_mode = TEST_MODE or (self.token == "YOUR_FRIENDLI_TOKEN")
50
+ self.use_gemini = False
51
+ self.gemini_client = None
52
 
53
  if self.test_mode:
54
  logger.warning("ν…ŒμŠ€νŠΈ λͺ¨λ“œλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.")
55
  if self.bapi_token == "YOUR_BRAVE_API_TOKEN":
56
  logger.warning("Brave API 토큰이 μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.")
57
+ if self.gapi_token == "YOUR_GEMINI_API_TOKEN":
58
+ logger.warning("Gemini API 토큰이 μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.")
59
+
60
+ def set_llm_mode(self, mode: str):
61
+ """LLM λͺ¨λ“œ μ„€μ • (default λ˜λŠ” commercial)"""
62
+ if mode == "commercial" and GEMINI_AVAILABLE and self.gapi_token != "YOUR_GEMINI_API_TOKEN":
63
+ self.use_gemini = True
64
+ if not self.gemini_client:
65
+ self.gemini_client = genai.Client(api_key=self.gapi_token)
66
+ logger.info("Gemini 2.5 Pro λͺ¨λ“œλ‘œ μ „ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.")
67
+ else:
68
+ self.use_gemini = False
69
+ logger.info("κΈ°λ³Έ LLM λͺ¨λ“œλ‘œ μ „ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.")
70
 
71
  def create_headers(self):
72
  """API 헀더 생성"""
 
195
  4. λͺ…ν™•ν•œ κ²°λ‘ κ³Ό λ‹€μŒ 단계λ₯Ό μ œμ‹œν•˜μ„Έμš”
196
  5. 전문적이고 완성도 높은 μ΅œμ’… λ³΄κ³ μ„œ ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜μ„Έμš”"""
197
 
198
+ def create_evaluator_prompt(self, user_query: str, supervisor_responses: List[str], researcher_response: str, executor_responses: List[str]) -> str:
199
+ """ν‰κ°€μž AI ν”„λ‘¬ν”„νŠΈ 생성"""
200
+ return f"""당신은 전체 ν˜‘λ ₯ κ³Όμ •κ³Ό κ²°κ³Όλ₯Ό ν‰κ°€ν•˜λŠ” ν‰κ°€μž AIμž…λ‹ˆλ‹€.
201
+
202
+ μ‚¬μš©μž 질문: {user_query}
203
+
204
+ κ°λ…μž AI의 뢄석 및 μ§€μ‹œ:
205
+ - 초기 뢄석: {supervisor_responses[0]}
206
+ - μ‹€ν–‰ μ§€μ‹œ: {supervisor_responses[1]}
207
+ - κ²€ν†  ν”Όλ“œλ°±: {supervisor_responses[2]}
208
+
209
+ μ‘°μ‚¬μž AI의 쑰사 κ²°κ³Ό:
210
+ {researcher_response}
211
+
212
+ μ‹€ν–‰μž AI의 κ΅¬ν˜„:
213
+ - 초기 κ΅¬ν˜„: {executor_responses[0]}
214
+ - μ΅œμ’… λ³΄κ³ μ„œ: {executor_responses[1]}
215
+
216
+ μœ„ 전체 과정을 ν‰κ°€ν•˜μ—¬:
217
+ 1. **ν’ˆμ§ˆ 평가**: 각 AI의 λ‹΅λ³€ ν’ˆμ§ˆκ³Ό μ—­ν•  μˆ˜ν–‰λ„λ₯Ό ν‰κ°€ν•˜μ„Έμš” (10점 만점)
218
+ 2. **ν˜‘λ ₯ νš¨κ³Όμ„±**: AI κ°„ ν˜‘λ ₯이 μ–Όλ§ˆλ‚˜ νš¨κ³Όμ μ΄μ—ˆλŠ”μ§€ ν‰κ°€ν•˜μ„Έμš”
219
+ 3. **정보 ν™œμš©λ„**: μ›Ή 검색 정보가 μ–Όλ§ˆλ‚˜ 잘 ν™œμš©λ˜μ—ˆλŠ”μ§€ ν‰κ°€ν•˜μ„Έμš”
220
+ 4. **κ°œμ„ μ **: ν–₯ν›„ κ°œμ„ μ΄ ν•„μš”ν•œ 뢀뢄을 ꡬ체적으둜 μ œμ‹œν•˜μ„Έμš”
221
+ 5. **μ΅œμ’… 평점**: 전체 ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ μ’…ν•© 평가λ₯Ό μ œμ‹œν•˜μ„Έμš”
222
+
223
+ ν‰κ°€λŠ” ꡬ체적이고 κ±΄μ„€μ μœΌλ‘œ μž‘μ„±ν•˜μ„Έμš”."""
224
+
225
  def extract_keywords(self, supervisor_response: str) -> List[str]:
226
  """κ°λ…μž μ‘λ‹΅μ—μ„œ ν‚€μ›Œλ“œ μΆ”μΆœ"""
227
  keywords = []
 
445
  yield chunk + " "
446
  time.sleep(0.05)
447
 
448
+ def call_gemini_streaming(self, messages: List[Dict[str, str]], role: str) -> Generator[str, None, None]:
449
+ """Gemini API 슀트리밍 호좜"""
450
+ if not self.gemini_client:
451
+ yield "❌ Gemini API ν΄λΌμ΄μ–ΈνŠΈκ°€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€."
452
+ return
453
+
454
+ try:
455
+ # μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ μ„€μ •
456
+ system_prompts = {
457
+ "supervisor": "당신은 κ±°μ‹œμ  κ΄€μ μ—μ„œ λΆ„μ„ν•˜κ³  μ§€λ„ν•˜λŠ” κ°λ…μž AIμž…λ‹ˆλ‹€.",
458
+ "researcher": "당신은 정보λ₯Ό μ‘°μ‚¬ν•˜κ³  μ²΄κ³„μ μœΌλ‘œ μ •λ¦¬ν•˜λŠ” μ‘°μ‚¬μž AIμž…λ‹ˆλ‹€.",
459
+ "executor": "당신은 세뢀적인 λ‚΄μš©μ„ κ΅¬ν˜„ν•˜λŠ” μ‹€ν–‰μž AIμž…λ‹ˆλ‹€.",
460
+ "evaluator": "당신은 전체 ν˜‘λ ₯ κ³Όμ •κ³Ό κ²°κ³Όλ₯Ό ν‰κ°€ν•˜λŠ” ν‰κ°€μž AIμž…λ‹ˆλ‹€."
461
+ }
462
+
463
+ # Gemini λ©”μ‹œμ§€ 포맷으둜 λ³€ν™˜
464
+ contents = []
465
+
466
+ # μ‹œμŠ€ν…œ λ©”μ‹œμ§€ μΆ”κ°€
467
+ contents.append(types.Content(
468
+ role="user",
469
+ parts=[types.Part.from_text(text=system_prompts.get(role, ""))]
470
+ ))
471
+ contents.append(types.Content(
472
+ role="model",
473
+ parts=[types.Part.from_text(text="λ„€, μ΄ν•΄ν–ˆμŠ΅λ‹ˆλ‹€. 제 역할을 μˆ˜ν–‰ν•˜κ² μŠ΅λ‹ˆλ‹€.")]
474
+ ))
475
+
476
+ # μ‚¬μš©μž λ©”μ‹œμ§€ μΆ”κ°€
477
+ for msg in messages:
478
+ if msg["role"] == "user":
479
+ contents.append(types.Content(
480
+ role="user",
481
+ parts=[types.Part.from_text(text=msg["content"])]
482
+ ))
483
+
484
+ # Gemini μ„€μ •
485
+ generate_content_config = types.GenerateContentConfig(
486
+ response_mime_type="text/plain",
487
+ temperature=0.7,
488
+ top_p=0.8,
489
+ max_output_tokens=2048
490
+ )
491
+
492
+ # 슀트리밍 생성
493
+ for chunk in self.gemini_client.models.generate_content_stream(
494
+ model="gemini-2.5-pro",
495
+ contents=contents,
496
+ config=generate_content_config,
497
+ ):
498
+ if chunk.text:
499
+ yield chunk.text
500
+
501
+ except Exception as e:
502
+ logger.error(f"Gemini API 였λ₯˜: {str(e)}")
503
+ yield f"❌ Gemini API 였λ₯˜: {str(e)}"
504
+
505
  def call_llm_streaming(self, messages: List[Dict[str, str]], role: str) -> Generator[str, None, None]:
506
  """슀트리밍 LLM API 호좜"""
507
 
508
+ # Gemini λͺ¨λ“œμΈ 경우
509
+ if self.use_gemini:
510
+ yield from self.call_gemini_streaming(messages, role)
511
+ return
512
+
513
  # ν…ŒμŠ€νŠΈ λͺ¨λ“œ
514
  if self.test_mode:
515
  logger.info(f"ν…ŒμŠ€νŠΈ λͺ¨λ“œ 슀트리밍 - Role: {role}")
 
539
  - μ΅œμ‹  연ꡬ에 λ”°λ₯΄λ©΄ λͺ¨λΈ μ΅œμ ν™”μ˜ 핡심은 μ•„ν‚€ν…μ²˜ 섀계와 ν›ˆλ ¨ μ „λž΅μ˜ κ· ν˜•μž…λ‹ˆλ‹€ (신뒰도: 0.85)
540
  - AutoML 도ꡬ듀이 ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ„ μžλ™ν™”ν•˜μ—¬ νš¨μœ¨μ„±μ„ 크게 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€ (신뒰도: 0.82)
541
  - 좜처: ML Conference 2024 (https://mlconf2024.org), Google Research (https://research.google)
 
542
 
543
  **2. Performance Improvement Strategies (신뒰도 λ†’μŒ)**
544
  - 데이터 ν’ˆμ§ˆ κ°œμ„ μ΄ λͺ¨λΈ μ„±λŠ₯ ν–₯μƒμ˜ 80%λ₯Ό μ°¨μ§€ν•œλ‹€λŠ” 연ꡬ κ²°κ³Ό (신뒰도: 0.90)
545
  - 앙상블 기법과 μ „μ΄ν•™μŠ΅μ΄ μ£Όμš” μ„±λŠ₯ κ°œμ„  λ°©λ²•μœΌλ‘œ μž…μ¦λ¨ (신뒰도: 0.78)
546
  - 좜처: Stanford AI Lab (https://ai.stanford.edu), MIT CSAIL (https://csail.mit.edu)
 
547
 
548
  **3. Model Efficiency Techniques (신뒰도 쀑간)**
549
  - λͺ¨λΈ κ²½λŸ‰ν™”(Pruning, Quantization)둜 μΆ”λ‘  속도 10λ°° ν–₯상 κ°€λŠ₯ (신뒰도: 0.75)
550
  - Knowledge Distillation으둜 λͺ¨λΈ 크기 90% κ°μ†Œ, μ„±λŠ₯ μœ μ§€ (신뒰도: 0.72)
551
  - 좜처: ArXiv λ…Όλ¬Έ (https://arxiv.org/abs/2023.xxxxx)
 
552
 
553
  **4. μ‹€μ œ 적용 사둀 (신뒰도 λ†’μŒ)**
554
  - Netflix: μΆ”μ²œ μ‹œμŠ€ν…œ κ°œμ„ μœΌλ‘œ μ‚¬μš©μž λ§Œμ‘±λ„ 35% ν–₯상 (신뒰도: 0.88)
555
  - Tesla: μ‹€μ‹œκ°„ 객체 인식 속도 50% κ°œμ„  (신뒰도: 0.80)
556
  - OpenAI: GPT λͺ¨λΈ νš¨μœ¨μ„± κ°œμ„ μœΌλ‘œ λΉ„μš© 70% 절감 (신뒰도: 0.85)
 
 
 
 
 
 
557
 
558
  **핡심 μΈμ‚¬μ΄νŠΈ:**
559
  - μ΅œμ‹  νŠΈλ Œλ“œλŠ” νš¨μœ¨μ„±κ³Ό μ„±λŠ₯의 κ· ν˜•μ— 초점
 
603
  - Knowledge Distillation κ΅¬ν˜„
604
  * Teacher λͺ¨λΈ: ν˜„μž¬ λŒ€κ·œλͺ¨ λͺ¨λΈ
605
  * Student λͺ¨λΈ: 90% μž‘μ€ 크기 λͺ©ν‘œ (쑰사 κ²°κ³Ό 기반)
606
+ * κ΅¬ν˜„ ν”„λ ˆμž„μ›Œν¬: PyTorch/TensorFlow""",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
607
 
608
  "supervisor_review": """μ‹€ν–‰μž AI의 κ³„νšμ„ κ²€ν† ν•œ κ²°κ³Ό, 쑰사 λ‚΄μš©μ΄ 잘 λ°˜μ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 κ°œμ„ μ‚¬ν•­μ„ μ œμ•ˆν•©λ‹ˆλ‹€.
609
 
 
620
  2. **λΉ„μš© 뢄석 ꡬ체화**
621
  - OpenAI μ‚¬λ‘€μ˜ 70% μ ˆκ°μ„ μœ„ν•œ ꡬ체적인 λΉ„μš© 계산
622
  - ROI 뢄석 및 투자 λŒ€λΉ„ 효과 μΈ‘μ • 방법
 
 
 
 
623
 
624
  **μΆ”κ°€ ꢌμž₯사항**
625
  - μ΅œμ‹  연ꡬ 동ν–₯ λͺ¨λ‹ˆν„°λ§ 체계 ꡬ좕
626
+ - κ²½μŸμ‚¬ λ²€μΉ˜λ§ˆν‚Ήμ„ μœ„ν•œ 정기적인 쑰사 ν”„λ‘œμ„ΈμŠ€""",
 
 
627
 
628
  "executor_final": """κ°λ…μž AI의 ν”Όλ“œλ°±μ„ μ™„μ „νžˆ λ°˜μ˜ν•˜μ—¬ μ΅œμ’… μ‹€ν–‰ λ³΄κ³ μ„œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
629
 
 
638
  **μ›”-ν™”μš”μΌ: μ„±λŠ₯ λ©”νŠΈλ¦­ μˆ˜μ§‘**
639
  - MLflowλ₯Ό ν†΅ν•œ ν˜„μž¬ λͺ¨λΈ 전체 뢄석
640
  - Netflix 사둀 기반 핡심 μ§€ν‘œ: 정확도(92%), μ§€μ—°μ‹œκ°„(45ms), μ²˜λ¦¬λŸ‰(1,000 req/s)
 
641
 
642
  **수-λͺ©μš”일: AutoML 초기 탐색**
643
  - Optuna둜 ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ΅œμ ν™” (200회 μ‹œλ„)
644
  - Ray Tune으둜 λΆ„μ‚° ν•™μŠ΅ ν™˜κ²½ ꡬ좕
 
 
 
 
 
 
645
 
646
  ### μ˜ˆμƒ μ‚°μΆœλ¬Ό
647
  - 상세 μ„±λŠ₯ 베이슀라인 λ¬Έμ„œ
648
  - κ°œμ„  기회 μš°μ„ μˆœμœ„ 맀트릭슀
 
649
 
650
  ## πŸ“Š 2단계: 데이터 ν’ˆμ§ˆ κ°œμ„  (2-3μ£Όμ°¨)
651
 
652
  ### μ‹€ν–‰ κ³„νš
653
+ - 데이터 μ •μ œ νŒŒμ΄ν”„λΌμΈ ꡬ좕
654
+ - κ³ κΈ‰ 데이터 증강 기법 적용
655
+ - A/B ν…ŒμŠ€νŠΈλ‘œ 효과 검증
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
656
 
657
  ## πŸ“Š 3단계: λͺ¨λΈ μ΅œμ ν™” κ΅¬ν˜„ (4-6μ£Όμ°¨)
658
 
659
  ### μ‹€ν–‰ κ³„νš
660
+ - Knowledge Distillation으둜 λͺ¨λΈ κ²½λŸ‰ν™”
661
+ - Pruning & Quantization 적용
662
+ - TensorRT μ΅œμ ν™” (Tesla 사둀 적용)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
663
 
664
  ## πŸ“Š 4단계: μ„±κ³Ό 검증 및 ν”„λ‘œλ•μ…˜ 배포 (7-8μ£Όμ°¨)
665
 
666
  ### μ‹€ν–‰ κ³„νš
667
+ - μ’…ν•© μ„±λŠ₯ 검증 및 μ§€ν‘œ 달성도 확인
668
+ - Canary 배포 μ „λž΅ μ‹€ν–‰
669
+ - μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ 체계 ꡬ좕
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
670
 
671
+ ## πŸ“ κ²°λ‘ 
672
+ λ³Έ ν”„λ‘œμ νŠΈλŠ” μ΅œμ‹  연ꡬ 결과와 업계 베슀트 ν”„λž™ν‹°μŠ€λ₯Ό μ μš©ν•˜μ—¬, 8μ£Ό λ§Œμ— λͺ¨λΈ μ„±λŠ₯을 획기적으둜 κ°œμ„ ν•˜κ³  운영 λΉ„μš©μ„ 70% μ ˆκ°ν•˜λŠ” μ„±κ³Όλ₯Ό 달성할 κ²ƒμœΌλ‘œ μ˜ˆμƒλ©λ‹ˆλ‹€.""",
673
+
674
+ "evaluator": """## πŸ“Š 전체 ν˜‘λ ₯ κ³Όμ • 평가 λ³΄κ³ μ„œ
 
675
 
676
+ ### 1️⃣ ν’ˆμ§ˆ 평가 (10점 만점)
677
 
678
+ **κ°λ…μž AI: 9.5/10**
679
+ - κ±°μ‹œμ  κ΄€μ μ—μ„œ 체계적인 뢄석과 λ°©ν–₯ μ œμ‹œ
680
+ - 단계별 ꡬ체적인 μ§€μ‹œμ‚¬ν•­ 제곡
681
+ - ν”Όλ“œλ°±μ΄ 건섀적이고 μ‹€ν–‰ κ°€λŠ₯함
682
 
683
+ **μ‘°μ‚¬μž AI: 9.0/10**
684
+ - μ›Ή 검색을 ν†΅ν•œ μ΅œμ‹  정보 μˆ˜μ§‘ 우수
685
+ - 신뒰도 평가와 λͺ¨μˆœ 감지 κΈ°λŠ₯ 효과적
686
+ - 좜처 ν‘œκΈ°μ™€ 정보 정리가 체계적
687
 
688
+ **μ‹€ν–‰μž AI: 8.5/10**
689
+ - 쑰사 λ‚΄μš©μ„ 잘 ν™œμš©ν•œ ꡬ체적 κ³„νš 수립
690
+ - μ‹€ν–‰ κ°€λŠ₯ν•œ 단계별 접근법 μ œμ‹œ
691
+ - 일뢀 μ„ΈλΆ€μ‚¬ν•­μ—μ„œ 더 ꡬ체화 ν•„μš”
692
 
693
+ ### 2️⃣ ν˜‘λ ₯ νš¨κ³Όμ„± 평가
 
694
 
695
+ **강점:**
696
+ - AI κ°„ μ—­ν•  뢄담이 λͺ…ν™•ν•˜κ³  μƒν˜Έλ³΄μ™„μ 
697
+ - 정보 흐름이 체계적이고 일관성 있음
698
+ - ν”Όλ“œλ°± 반영이 효과적으둜 이루어짐
699
+
700
+ **κ°œμ„ μ :**
701
+ - μ‹€μ‹œκ°„ μƒν˜Έμž‘μš© λ©”μ»€λ‹ˆμ¦˜ μΆ”κ°€ κ³ λ €
702
+ - 쀑간 점검 단계 λ„μž… ν•„μš”
703
+
704
+ ### 3️⃣ 정보 ν™œμš©λ„ 평가
705
+
706
+ **μš°μˆ˜ν•œ 점:**
707
+ - 20개 μ΄μƒμ˜ μ›Ή μ†ŒμŠ€μ—μ„œ 정보 μˆ˜μ§‘
708
+ - 신뒰도 기반 정보 선별 효과적
709
+ - μ‹€μ œ κΈ°μ—… 사둀 적절히 ν™œμš©
710
+
711
+ **보완 ν•„μš”:**
712
+ - ν•™μˆ  λ…Όλ¬Έ λ“± 더 깊이 μžˆλŠ” 자료 ν™œμš©
713
+ - 지역별/산업별 νŠΉμ„± κ³ λ € ν•„μš”
714
+
715
+ ### 4️⃣ ν–₯ν›„ κ°œμ„  λ°©ν–₯
716
+
717
+ 1. **μ‹€μ‹œκ°„ ν˜‘μ—… κ°•ν™”**
718
+ - AI κ°„ 쀑간 체크포인트 μΆ”κ°€
719
+ - 동적 μ—­ν•  μ‘°μ • λ©”μ»€λ‹ˆμ¦˜ λ„μž…
720
+
721
+ 2. **정보 검증 κ°•ν™”**
722
+ - ꡐ차 검증 ν”„λ‘œμ„ΈμŠ€ μΆ”κ°€
723
+ - μ „λ¬Έκ°€ κ²€ν†  단계 κ³ λ €
724
+
725
+ 3. **λ§žμΆ€ν™” κ°•ν™”**
726
+ - μ‚¬μš©μž μ»¨ν…μŠ€νŠΈ 더 깊이 반영
727
+ - 산업별/규λͺ¨λ³„ 맞좀 μ „λž΅ 제곡
728
+
729
+ ### 5️⃣ μ΅œμ’… 평점: ⭐⭐⭐⭐⭐ 9.0/10
730
+
731
+ **μ’…ν•© 평가:**
732
+ λ³Έ ν˜‘λ ₯ μ‹œμŠ€ν…œμ€ 각 AI의 전문성을 효과적으둜 ν™œμš©ν•˜μ—¬ μ‚¬μš©μž μ§ˆλ¬Έμ— λŒ€ν•œ 쒅합적이고 μ‹€ν–‰ κ°€λŠ₯ν•œ 닡변을 μ œκ³΅ν–ˆμŠ΅λ‹ˆλ‹€. 특히 μ›Ή 검색을 ν†΅ν•œ μ΅œμ‹  정보 ν™œμš©κ³Ό 단계적 ν”Όλ“œλ°± 반영이 μš°μˆ˜ν–ˆμŠ΅λ‹ˆλ‹€. ν–₯ν›„ μ‹€μ‹œκ°„ ν˜‘μ—…κ³Ό λ§žμΆ€ν™”λ₯Ό λ”μš± κ°•ν™”ν•œλ‹€λ©΄ λ”μš± λ›°μ–΄λ‚œ μ„±κ³Όλ₯Ό 달성할 수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€."""
733
  }
734
 
735
  # ν”„λ‘¬ν”„νŠΈ λ‚΄μš©μ— 따라 μ μ ˆν•œ 응닡 선택
 
743
  response = test_responses["researcher"]
744
  elif role == "executor" and "μ΅œμ’… λ³΄κ³ μ„œ" in messages[0]["content"]:
745
  response = test_responses["executor_final"]
746
+ elif role == "evaluator":
747
+ response = test_responses["evaluator"]
748
  else:
749
  response = test_responses["executor"]
750
 
 
756
  system_prompts = {
757
  "supervisor": "당신은 κ±°μ‹œμ  κ΄€μ μ—μ„œ λΆ„μ„ν•˜κ³  μ§€λ„ν•˜λŠ” κ°λ…μž AIμž…λ‹ˆλ‹€.",
758
  "researcher": "당신은 정보λ₯Ό μ‘°μ‚¬ν•˜κ³  μ²΄κ³„μ μœΌλ‘œ μ •λ¦¬ν•˜λŠ” μ‘°μ‚¬μž AIμž…λ‹ˆλ‹€.",
759
+ "executor": "���신은 세뢀적인 λ‚΄μš©μ„ κ΅¬ν˜„ν•˜λŠ” μ‹€ν–‰μž AIμž…λ‹ˆλ‹€.",
760
+ "evaluator": "당신은 전체 ν˜‘λ ₯ κ³Όμ •κ³Ό κ²°κ³Όλ₯Ό ν‰κ°€ν•˜λŠ” ν‰κ°€μž AIμž…λ‹ˆλ‹€."
761
  }
762
 
763
  full_messages = [
 
820
  # λ‚΄λΆ€ νžˆμŠ€ν† λ¦¬ 관리 (UIμ—λŠ” ν‘œμ‹œν•˜μ§€ μ•ŠμŒ)
821
  internal_history = []
822
 
823
+ def process_query_streaming(user_query: str, llm_mode: str):
824
  """μŠ€νŠΈλ¦¬λ°μ„ μ§€μ›ν•˜λŠ” 쿼리 처리"""
825
  global internal_history
826
 
827
  if not user_query:
828
  return "", "", "", "", "❌ μ§ˆλ¬Έμ„ μž…λ ₯ν•΄μ£Όμ„Έμš”."
829
 
830
+ # LLM λͺ¨λ“œ μ„€μ •
831
+ llm_system.set_llm_mode(llm_mode)
832
+
833
  conversation_log = []
834
+ all_responses = {"supervisor": [], "researcher": [], "executor": [], "evaluator": []}
835
 
836
  try:
837
  # 1단계: κ°λ…μž AI 초기 뢄석 및 ν‚€μ›Œλ“œ μΆ”μΆœ
 
991
 
992
  all_responses["executor"].append(final_executor_response)
993
 
994
+ # 8단계: ν‰κ°€μž AIκ°€ 전체 κ³Όμ • 평가
995
+ evaluator_prompt = llm_system.create_evaluator_prompt(
996
+ user_query,
997
+ all_responses["supervisor"],
998
+ all_responses["researcher"][0],
999
+ all_responses["executor"]
1000
+ )
1001
+ evaluator_response = ""
1002
+
1003
+ evaluator_text = "[전체 평가] πŸ”„ 평가 쀑...\n"
1004
+ for chunk in llm_system.call_llm_streaming(
1005
+ [{"role": "user", "content": evaluator_prompt}],
1006
+ "evaluator"
1007
+ ):
1008
+ evaluator_response += chunk
1009
+ evaluator_text = f"[전체 평가] - {datetime.now().strftime('%H:%M:%S')}\n{evaluator_response}"
1010
+ yield supervisor_text, researcher_text, executor_text, evaluator_text, "πŸ“Š ν‰κ°€μž AIκ°€ 평가 쀑..."
1011
+
1012
+ all_responses["evaluator"].append(evaluator_response)
1013
+
1014
  # μ΅œμ’… κ²°κ³Ό 생성 (μ΅œμ’… λ³΄κ³ μ„œλ₯Ό λ©”μΈμœΌλ‘œ)
1015
  final_summary = f"""## 🎯 μ΅œμ’… μ’…ν•© λ³΄κ³ μ„œ
1016
 
 
1022
 
1023
  ---
1024
 
1025
+ ### πŸ“Š 전체 ν”„λ‘œμ„ΈμŠ€ 평가 (ν‰κ°€μž AI)
1026
+ {evaluator_response}
1027
+
1028
+ ---
1029
+
1030
  <details>
1031
  <summary>πŸ“‹ 전체 ν˜‘λ ₯ κ³Όμ • 보기</summary>
1032
 
 
1048
  </details>
1049
 
1050
  ---
1051
+ *이 λ³΄κ³ μ„œλŠ” {'Gemini 2.5 Pro' if llm_system.use_gemini else 'κΈ°λ³Έ LLM'}λ₯Ό μ‚¬μš©ν•˜μ—¬ μ›Ή 검색과 AI ν˜‘λ ₯을 톡해 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*"""
1052
 
1053
  # λ‚΄λΆ€ νžˆμŠ€ν† λ¦¬ μ—…λ°μ΄νŠΈ (UIμ—λŠ” ν‘œμ‹œν•˜μ§€ μ•ŠμŒ)
1054
  internal_history.append((user_query, final_summary))
1055
 
1056
+ # μ΅œμ’… μš”μ•½λ§Œ ν‘œμ‹œ
1057
+ display_summary = f"""## 🎯 μ΅œμ’… κ²°κ³Ό
1058
+
1059
+ ### πŸ“„ μ‹€ν–‰ λ³΄κ³ μ„œ
1060
+ {final_executor_response}
1061
+
1062
+ ### πŸ“Š 평가 μš”μ•½
1063
+ {evaluator_response.split('### 5️⃣')[1] if '### 5️⃣' in evaluator_response else evaluator_response[-500:]}
1064
+
1065
+ ---
1066
+ *{'Gemini 2.5 Pro' if llm_system.use_gemini else 'κΈ°λ³Έ LLM'} μ‚¬μš© | 4개 AI ν˜‘λ ₯ μ™„λ£Œ*"""
1067
+
1068
+ yield supervisor_text, researcher_text, executor_text, evaluator_text, "βœ… μ΅œμ’… λ³΄κ³ μ„œ μ™„μ„±!"
1069
 
1070
  except Exception as e:
1071
  error_msg = f"❌ 처리 쀑 였λ₯˜: {str(e)}"
1072
+ yield "", "", "", "", error_msg
1073
 
1074
  def clear_all():
1075
  """λͺ¨λ“  λ‚΄μš© μ΄ˆκΈ°ν™”"""
 
1085
  .supervisor-box textarea {
1086
  border-left: 4px solid #667eea !important;
1087
  padding-left: 10px !important;
1088
+ background-color: #f8f9ff !important;
1089
  }
1090
  .researcher-box textarea {
1091
  border-left: 4px solid #10b981 !important;
1092
  padding-left: 10px !important;
1093
+ background-color: #f0fdf4 !important;
1094
  }
1095
  .executor-box textarea {
1096
  border-left: 4px solid #764ba2 !important;
1097
  padding-left: 10px !important;
1098
+ background-color: #faf5ff !important;
1099
+ }
1100
+ .evaluator-box textarea {
1101
+ border-left: 4px solid #f59e0b !important;
1102
+ padding-left: 10px !important;
1103
+ background-color: #fffbeb !important;
1104
  }
1105
  """
1106
 
1107
  with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css) as app:
1108
  gr.Markdown(
1109
  f"""
1110
+ # 🀝 ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ (4-AI ν˜‘μ—… + ν‰κ°€μž)
1111
  """
1112
  )
1113
 
 
1115
  with gr.Row():
1116
  with gr.Column():
1117
  gr.Markdown("""
1118
+ ## πŸš€ 4개 AI의 ν˜‘λ ₯ μ‹œμŠ€ν…œ
1119
+ - **κ°λ…μž AI**: κ±°μ‹œμ  뢄석과 μ „λž΅ 수립
1120
+ - **μ‘°μ‚¬μž AI**: μ›Ή 검색과 정보 μˆ˜μ§‘/정리
1121
+ - **μ‹€ν–‰μž AI**: ꡬ체적 κ³„νš 수립과 μ‹€ν–‰
1122
+ - **ν‰κ°€μž AI**: 전체 κ³Όμ • 평가와 κ°œμ„ μ  μ œμ‹œ
1123
+
1124
+ ### 🌟 μ£Όμš” κΈ°λŠ₯
1125
+ - 20개 검색 결과와 λ™μ˜μ–΄ 검색
1126
+ - 신뒰도 기반 정보 평가
1127
+ - μ‹€μ‹œκ°„ ν˜‘μ—…κ³Ό ν”Όλ“œλ°± 반영
1128
+ - 쒅합적인 ν’ˆμ§ˆ 평가
1129
  """)
1130
 
1131
+ # LLM 선택 μ˜΅μ…˜
1132
+ llm_mode = gr.Radio(
1133
+ choices=["default", "commercial"],
1134
+ value="default",
1135
+ label="LLM λͺ¨λ“œ 선택",
1136
+ info="commercial을 μ„ νƒν•˜λ©΄ Gemini 2.5 Proλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€"
1137
+ )
1138
+
1139
  user_input = gr.Textbox(
1140
  label="질문 μž…λ ₯",
1141
  placeholder="예: κΈ°κ³„ν•™μŠ΅ λͺ¨λΈμ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” 방법은?",
 
1153
  max_lines=1
1154
  )
1155
 
1156
+ # AI 좜λ ₯λ“€ - 2x2 κ·Έλ¦¬λ“œ
1157
  with gr.Row():
1158
+ # 상단 ν–‰
 
 
 
 
 
 
 
 
1159
  with gr.Column():
1160
  gr.Markdown("### 🧠 κ°λ…μž AI (κ±°μ‹œμ  뢄석)")
1161
  supervisor_output = gr.Textbox(
1162
  label="",
1163
+ lines=15,
1164
+ max_lines=20,
1165
  interactive=False,
1166
  elem_classes=["supervisor-box"]
1167
  )
1168
 
 
1169
  with gr.Column():
1170
  gr.Markdown("### πŸ” μ‘°μ‚¬μž AI (μ›Ή 검색 & 정리)")
1171
  researcher_output = gr.Textbox(
1172
  label="",
1173
+ lines=15,
1174
+ max_lines=20,
1175
  interactive=False,
1176
  elem_classes=["researcher-box"]
1177
  )
1178
+
1179
+ with gr.Row():
1180
+ # ν•˜λ‹¨ ν–‰
1181
  with gr.Column():
1182
  gr.Markdown("### πŸ‘οΈ μ‹€ν–‰μž AI (λ―Έμ‹œμ  κ΅¬ν˜„)")
1183
  executor_output = gr.Textbox(
1184
  label="",
1185
+ lines=15,
1186
+ max_lines=20,
1187
  interactive=False,
1188
  elem_classes=["executor-box"]
1189
  )
1190
+
1191
+ with gr.Column():
1192
+ gr.Markdown("### πŸ“Š ν‰κ°€μž AI (전체 평가)")
1193
+ evaluator_output = gr.Textbox(
1194
+ label="",
1195
+ lines=15,
1196
+ max_lines=20,
1197
+ interactive=False,
1198
+ elem_classes=["evaluator-box"]
1199
+ )
1200
 
1201
  # 예제
1202
  gr.Examples(
 
1214
  # 이벀트 ν•Έλ“€λŸ¬
1215
  submit_btn.click(
1216
  fn=process_query_streaming,
1217
+ inputs=[user_input, llm_mode],
1218
+ outputs=[supervisor_output, researcher_output, executor_output, evaluator_output, status_text]
1219
  ).then(
1220
  fn=lambda: "",
1221
  outputs=[user_input]
 
1223
 
1224
  user_input.submit(
1225
  fn=process_query_streaming,
1226
+ inputs=[user_input, llm_mode],
1227
+ outputs=[supervisor_output, researcher_output, executor_output, evaluator_output, status_text]
1228
  ).then(
1229
  fn=lambda: "",
1230
  outputs=[user_input]
 
1232
 
1233
  clear_btn.click(
1234
  fn=clear_all,
1235
+ outputs=[supervisor_output, researcher_output, executor_output, evaluator_output, status_text]
1236
  )
1237
 
1238