aiqtech commited on
Commit
5da2d65
·
verified ·
1 Parent(s): 18786d2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +100 -526
app.py CHANGED
@@ -51,145 +51,112 @@ class LLMCollaborativeSystem:
51
 
52
  def create_supervisor_initial_prompt(self, user_query: str) -> str:
53
  """감독자 AI 초기 프롬프트 생성"""
54
- return f"""당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.
55
-
56
- 사용자 질문: {user_query}
57
-
58
- 질문에 대해:
59
- 1. 전체적인 접근 방향과 프레임워크를 제시하세요
60
- 2. 핵심 요소와 고려사항을 구조화하여 설명하세요
61
- 3. 주제에 대해 조사가 필요한 5-7개의 구체적인 키워드나 검색어를 제시하세요
62
-
63
- 키워드는 다음 형식으로 제시하세요:
64
- [검색 키워드]: 키워드1, 키워드2, 키워드3, 키워드4, 키워드5"""
65
 
66
  def create_supervisor_research_review_prompt(self, user_query: str, research_summary: str) -> str:
67
  """감독자 AI의 조사 내용 검토 및 추가 지시 프롬프트"""
68
- return f"""당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.
69
-
70
- 사용자 질문: {user_query}
71
-
72
- 조사자 AI의 1 조사 결과:
73
- {research_summary}
74
-
75
- 조사 결과를 검토하고:
76
- 1. 조사된 내용의 품질과 완전성을 평가하세요
77
- 2. 부족하거나 누락된 중요한 정보를 식별하세요
78
- 3. 추가로 조사가 필요한 3-5개의 구체적인 키워드나 주제를 제시하세요
79
- 4. 조사자에게 특별히 주의해야 할 사항이나 중점적으로 찾아야 할 정보를 지시하세요
80
-
81
- 추가 키워드는 다음 형식으로 제시하세요:
82
- [추가 검색 키워드]: 키워드1, 키워드2, 키워드3"""
83
 
84
  def create_researcher_prompt(self, user_query: str, supervisor_guidance: str, search_results: Dict[str, List[Dict]]) -> str:
85
  """조사자 AI 프롬프트 생성"""
86
- search_summary = ""
 
 
 
 
87
  for keyword, results in search_results.items():
88
- search_summary += f"\n\n**{keyword}에 대한 검색 결과:**\n"
89
  for i, result in enumerate(results[:3], 1):
90
- search_summary += f"{i}. {result.get('title', 'N/A')}\n"
91
- search_summary += f" - {result.get('description', 'N/A')}\n"
92
- search_summary += f" - 출처: {result.get('url', 'N/A')}\n"
93
-
94
- return f"""당신은 정보를 조사하고 정리하는 조사자 AI입니다.
95
-
96
- 사용자 질문: {user_query}
97
-
98
- 감독자 AI의 지침:
99
- {supervisor_guidance}
100
-
101
- 브레이브 검색 결과:
102
- {search_summary}
103
-
104
- 위 검색 결과를 바탕으로:
105
- 1. 각 키워드별로 중요한 정보를 정리하세요
106
- 2. 신뢰할 수 있는 출처를 명시하세요
107
- 3. 실행자 AI가 활용할 수 있는 구체적인 데이터와 사실을 추출하세요
108
- 4. 최신 트렌드나 중요한 통계가 있다면 강조하세요"""
109
 
110
  def create_researcher_additional_prompt(self, user_query: str, previous_research: str, supervisor_feedback: str, search_results: Dict[str, List[Dict]]) -> str:
111
  """조사자 AI 추가 조사 프롬프트"""
112
- search_summary = ""
 
 
 
 
 
113
  for keyword, results in search_results.items():
114
- search_summary += f"\n\n**{keyword}에 대한 추가 검색 결과:**\n"
115
  for i, result in enumerate(results[:3], 1):
116
- search_summary += f"{i}. {result.get('title', 'N/A')}\n"
117
- search_summary += f" - {result.get('description', 'N/A')}\n"
118
- search_summary += f" - 출처: {result.get('url', 'N/A')}\n"
119
-
120
- return f"""당신은 정보를 조사하고 정리하는 조사자 AI입니다.
121
-
122
- 사용자 질문: {user_query}
123
-
124
- 이전 조사 내용:
125
- {previous_research}
126
-
127
- 감독자 AI의 피드백 및 추가 조사 지시:
128
- {supervisor_feedback}
129
-
130
- 추가 검색 결과:
131
- {search_summary}
132
-
133
- 위 정보를 바탕으로:
134
- 1. 감독자가 요청한 추가 정보를 중점적으로 조사하세요
135
- 2. 이전 조사와 중복되지 않는 새로운 정보를 제공하세요
136
- 3. 특히 감독자가 지적한 부족한 부분을 보완하세요
137
- 4. 최종적으로 종합된 조사 결과를 제시하세요"""
138
 
139
  def create_supervisor_execution_prompt(self, user_query: str, research_summary: str) -> str:
140
  """감독자 AI의 실행 지시 프롬프트"""
141
- return f"""당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.
142
-
143
- 사용자 질문: {user_query}
144
-
145
- 조사자 AI가 정리한 최종 조사 내용:
146
- {research_summary}
147
-
148
- 조사 내용을 기반으로 실행자 AI에게 아주 구체적인 지시를 내려주세요:
149
- 1. 조사된 정보를 어떻게 활용할지 명확히 지시하세요
150
- 2. 실행 가능한 단계별 작업을 구체적으로 제시하세요
151
- 3. 각 단계에서 참고해야 할 조사 내용을 명시하세요
152
- 4. 예상되는 결과물의 형태를 구체적으로 설명하세요"""
153
 
154
  def create_executor_prompt(self, user_query: str, supervisor_guidance: str, research_summary: str) -> str:
155
  """실행자 AI 프롬프트 생성"""
156
- return f"""당신은 세부적인 내용을 구현하는 실행자 AI입니다.
157
-
158
- 사용자 질문: {user_query}
159
-
160
- 조사자 AI가 정리한 조사 내용:
161
- {research_summary}
162
-
163
- 감독자 AI의 구체적인 지시:
164
- {supervisor_guidance}
165
-
166
- 위 조사 내용과 지시사항을 바탕으로:
167
- 1. 조사된 정보를 적극 활용하여 구체적인 실행 계획을 작성하세요
168
- 2. 각 단계별로 참고한 조사 내용을 명시하세요
169
- 3. 실제로 적용 가능한 구체적인 방법론을 제시하세요
170
- 4. 예상되는 성과와 측정 방법을 포함하세요"""
171
 
172
  def create_executor_final_prompt(self, user_query: str, initial_response: str, supervisor_feedback: str, research_summary: str) -> str:
173
  """실행자 AI 최종 보고서 프롬프트"""
174
- return f"""당신은 세부적인 내용을 구현하는 실행자 AI입니다.
175
-
176
- 사용자 질문: {user_query}
177
-
178
- 조사자 AI의 조사 내용:
179
- {research_summary}
180
-
181
- 당신의 초기 답변:
182
- {initial_response}
183
-
184
- 감독자 AI의 피드백 개선사항:
185
- {supervisor_feedback}
186
-
187
- 위 피드백을 완전히 반영하여 최종 보고서를 작성하세요:
188
- 1. 감독자의 모든 개선사항을 반영하세요
189
- 2. 조사 내용을 더욱 구체적으로 활용하세요
190
- 3. 실행 가능성을 높이는 세부 계획을 포함하세요
191
- 4. 명확한 결론과 다음 단계를 제시하세요
192
- 5. 전문적이고 완성도 높은 최종 보고서 형식으로 작성하세요"""
193
 
194
  def extract_keywords(self, text: str) -> List[str]:
195
  """텍스트에서 키워드 추출"""
@@ -365,369 +332,6 @@ class LLMCollaborativeSystem:
365
  logger.error(f"스트리밍 중 오류: {str(e)}")
366
  yield f"❌ 오류 발생: {str(e)}"
367
 
368
- # 🎯 ML 모델 최적화 프로젝트 최종 실행 보고서
369
-
370
- ## 📋 Executive Summary
371
- 8주간의 체계적인 접근을 통해 ML 모델의 크기를 95% 줄이고, 추론 속도를 15배 향상시키며, 운영 비용을 75% 절감하는 목표를 달성할 예정입니다. 최신 연구 결과와 실패 사례의 교훈을 반영하여 리스크를 최소화하고, 275%의 ROI를 6개월 내에 달성할 것으로 예상됩니다.
372
-
373
- ## 🏗️ 프로젝트 구조
374
-
375
- ### 1단계: 진단 및 준비 (1주차)
376
-
377
- **현황 분석 및 도구 선정**
378
- ```yaml
379
- 현재 상태:
380
- 모델_크기: 2.5GB
381
- 추론_시간: 45ms
382
- GPU_메모리: 8GB
383
- 월간_비용: $50,000
384
-
385
- 선택된 도구:
386
- 기본_프레임워크: PyTorch 2.0 + Optimization Toolkit
387
- 모델_최적화: Sparse MoE, Flash Attention v3
388
- 양자화: Quantization-Aware Training 2.0
389
- 배포_최적화: TensorRT (GPU), OpenVINO (CPU)
390
- 모니터링: Grafana + Prometheus + Custom Alerts
391
- ```
392
-
393
- **리스크 관리 체크리스트**
394
- - [ ] Uber 사례: 유지보수성 검증 프로세스
395
- - [ ] Twitter 사례: 캐싱 전략 사전 검증
396
- - [ ] 데이터 파이프라인 스트레스 테스트
397
- - [ ] 각 단계별 롤백 계획 문서화
398
- - [ ] Plan B 시나리오 준비
399
-
400
- ### 2단계: 데이터 최적화 (2-3주차)
401
-
402
- **고급 데이터 파이프라인**
403
- ```python
404
- class EnhancedDataPipeline:
405
- def __init__(self):
406
- self.cache = RedisCluster(
407
- startup_nodes=[
408
- {"host": "10.0.0.1", "port": "7000"},
409
- {"host": "10.0.0.2", "port": "7000"}
410
- ],
411
- decode_responses=True,
412
- skip_full_coverage_check=True
413
- )
414
-
415
- # 실시간 모니터링 통합
416
- self.monitor = DataPipelineMonitor(
417
- prometheus_gateway="http://prometheus:9091",
418
- alert_webhook="https://slack.webhook.url"
419
- )
420
-
421
- def optimize_with_monitoring(self, data_loader):
422
- # 병목 지점 실시간 감지
423
- with self.monitor.profile("data_loading"):
424
- optimized_loader = self.apply_optimizations(data_loader)
425
-
426
- # 성능 지표 자동 수집
427
- self.monitor.record_metrics({
428
- "throughput": self.calculate_throughput(),
429
- "latency_p99": self.get_latency_percentile(99),
430
- "cache_hit_rate": self.cache.get_hit_rate()
431
- })
432
-
433
- return optimized_loader
434
- ```
435
-
436
- ### 3단계: 모델 최적화 구현 (4-6주차)
437
-
438
- **통합 최적화 프레임워크**
439
- ```python
440
- class ModelOptimizationFramework:
441
- def __init__(self, model, config):
442
- self.model = model
443
- self.config = config
444
- self.optimization_history = []
445
-
446
- def apply_optimizations(self):
447
- # 1. Sparse MoE 적용 (95% 크기 감소)
448
- self.model = self.apply_sparse_moe()
449
- self.validate_performance("sparse_moe")
450
-
451
- # 2. Flash Attention v3 (메모리 80% 감소)
452
- self.model = self.apply_flash_attention()
453
- self.validate_performance("flash_attention")
454
-
455
- # 3. 2-bit Quantization (추가 크기 감소)
456
- self.model = self.apply_quantization()
457
- self.validate_performance("quantization")
458
-
459
- # 4. 하드웨어별 최적화
460
- if self.config.target_hardware == "gpu":
461
- self.model = self.optimize_tensorrt()
462
- else:
463
- self.model = self.optimize_openvino()
464
-
465
- return self.model
466
-
467
- def validate_performance(self, stage):
468
- """각 최적화 단계 후 성능 검증"""
469
- metrics = self.benchmark()
470
- if not self.meets_requirements(metrics):
471
- # Plan B 실행
472
- self.execute_fallback_plan(stage)
473
- self.optimization_history.append({
474
- "stage": stage,
475
- "metrics": metrics,
476
- "timestamp": datetime.now()
477
- })
478
- ```
479
-
480
- ### 4단계: 검증 및 배포 (7-8주차)
481
-
482
- **고급 모니터링 대시보드**
483
- ```python
484
- class MLOpsMonitoringDashboard:
485
- def __init__(self):
486
- self.grafana = GrafanaAPI(url="http://grafana:3000")
487
- self.prometheus = PrometheusAPI(url="http://prometheus:9090")
488
-
489
- def create_dashboards(self):
490
- # 실시간 성능 대시보드
491
- performance_dashboard = {
492
- "title": "ML Model Performance",
493
- "panels": [
494
- self.create_latency_panel(),
495
- self.create_throughput_panel(),
496
- self.create_resource_usage_panel(),
497
- self.create_cost_analysis_panel()
498
- ]
499
- }
500
-
501
- # 이상 징후 감지 대시보드
502
- anomaly_dashboard = {
503
- "title": "Anomaly Detection",
504
- "panels": [
505
- self.create_drift_detection_panel(),
506
- self.create_error_rate_panel(),
507
- self.create_sla_compliance_panel()
508
- ]
509
- }
510
-
511
- # 알림 규칙 설정
512
- self.setup_alerts([
513
- Alert("High Latency", "latency_p99 > 10ms", severity="warning"),
514
- Alert("Model Drift", "accuracy_drop > 2%", severity="critical"),
515
- Alert("High Error Rate", "error_rate > 0.1%", severity="critical")
516
- ])
517
- ```
518
-
519
- **단계적 배포 전략**
520
- ```python
521
- class EnhancedCanaryDeployment:
522
- def __init__(self):
523
- self.deployment_stages = [
524
- {"traffic": 0.01, "duration": "1d", "rollback_threshold": 0.1},
525
- {"traffic": 0.05, "duration": "2d", "rollback_threshold": 0.5},
526
- {"traffic": 0.20, "duration": "3d", "rollback_threshold": 1.0},
527
- {"traffic": 0.50, "duration": "3d", "rollback_threshold": 1.5},
528
- {"traffic": 1.00, "duration": None, "rollback_threshold": 2.0}
529
- ]
530
-
531
- def deploy_with_monitoring(self, model):
532
- for stage in self.deployment_stages:
533
- # 트래픽 라우팅
534
- self.route_traffic(model, stage["traffic"])
535
-
536
- # 실시간 모니터링
537
- metrics = self.monitor_performance(duration=stage["duration"])
538
-
539
- # 자동 롤백 검사
540
- if self.should_rollback(metrics, stage["rollback_threshold"]):
541
- self.automatic_rollback()
542
- self.notify_team("Automatic rollback triggered")
543
- return False
544
-
545
- return True
546
- ```
547
-
548
- ## 📊 예상 성과 및 ROI
549
-
550
- ### 성능 개선
551
- | 지표 | 현재 | 목표 | 달성 예상 |
552
- |------|------|------|-----------|
553
- | 모델 크기 | 2.5GB | 125MB | ✓ 95% 감소 |
554
- | 추론 시간 | 45ms | 3ms | ✓ 15배 향상 |
555
- | GPU 메모리 | 8GB | 1GB | ✓ 87.5% 감소 |
556
- | 정확도 | 94.2% | >92% | ✓ 93.8% |
557
-
558
- ### 비용 절감 및 ROI
559
- - **월간 인프라 비용**: $50,000 → $12,500 (75% 절감)
560
- - **연간 절감액**: $450,000
561
- - **프로젝트 투자**: $60,000
562
- - **투자 회수 기간**: 1.6개월
563
- - **6개월 ROI**: 275%
564
- - **1년 ROI**: 650%
565
-
566
- ## 👥 팀 역량 개발 계획
567
-
568
- ### 교육 프로그램
569
- 1. **주간 기술 세미나** (매주 금요일 2시간)
570
- - Week 1-2: Sparse MoE 아키텍처 이해
571
- - Week 3-4: Flash Attention 구현 실습
572
- - Week 5-6: 양자화 기법 심화
573
- - Week 7-8: MLOps 모니터링 실���
574
-
575
- 2. **외부 전문가 초청 강연**
576
- - Google DeepMind 엔지니어: Sparse MoE 실전 적용
577
- - NVIDIA 전문가: TensorRT 최적화 팁
578
- - MLOps 커뮤니티 리더: 프로덕션 모니터링
579
-
580
- 3. **핸즈온 워크샵**
581
- - 매월 1회 전일 실습
582
- - 실제 모델로 최적화 실습
583
- - 페어 프로그래밍 세션
584
-
585
- ## 🔧 장기 유지보수 전략
586
-
587
- ### 분기별 최적화 사이클
588
- ```yaml
589
- Q1:
590
- - 새로운 데이터로 모델 재훈련
591
- - 최신 최적화 기법 조사
592
- - 성능 벤치마크 업데이트
593
-
594
- Q2:
595
- - 프로덕션 메트릭 분석
596
- - 병목 지점 재식별
597
- - 추가 최적화 적용
598
-
599
- Q3:
600
- - 하드웨어 업그레이드 검토
601
- - 새로운 프레임워크 평가
602
- - 비용-효과 재분석
603
-
604
- Q4:
605
- - 연간 성과 리뷰
606
- - 차년도 계획 수립
607
- - 기술 부채 해결
608
- ```
609
-
610
- ### 기술 부채 관리
611
- - 월간 기술 부채 리뷰 미팅
612
- - 우선순위 매트릭스 관리
613
- - 20% 시간을 리팩토링에 할당
614
-
615
- ## 🚀 확장 계획
616
-
617
- ### 내부 플랫폼화
618
- 1. **ML 최적화 플랫폼 구축**
619
- - 웹 기반 UI로 손쉬운 최적화
620
- - 자동화된 벤치마킹
621
- - 템플릿 기반 적용
622
-
623
- 2. **다른 팀 지원**
624
- - 최적화 컨설팅 서비스
625
- - 베스트 프랙티스 문서화
626
- - 내부 교육 프로그램
627
-
628
- ### 외부 기여
629
- 1. **오픈소스 프로젝트**
630
- - Hugging Face Optimum 기여
631
- - 자체 최적화 도구 공개
632
- - 커뮤니티 피드백 수렴
633
-
634
- 2. **컨퍼런스 발표**
635
- - MLOps Summit 2024
636
- - PyTorch Conference
637
- - 기업 사례 공유
638
-
639
- ## 📝 결론
640
- 본 프로젝트는 최신 ML 최적화 기술과 실무 경험을 결합하여, 대규모 비용 절감과 성능 향상을 동시에 달성합니다. 체계적인 리스크 관리와 지속적인 개선 프로세스를 통해 장기적인 경쟁력을 확보하고, 조직 전체의 ML 역량을 한 단계 끌어올릴 것으로 기대됩니다.
641
-
642
- ---
643
- *작성일: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}*
644
- *작성자: 협력적 AI 시스템 (감독자, 조사자, 실행자 AI)*
645
- *버전: 2.0 (피드백 완전 반영)*"""
646
- }
647
-
648
- # 프롬프트 내용에 따라 적절한 응답 선택
649
- if role == "supervisor" and "조사자 AI의 1차 조사 결과" in messages[0]["content"]:
650
- response = test_responses["supervisor_research_review"]
651
- elif role == "supervisor" and "조사자 AI가 정리한 최종 조사 내용" in messages[0]["content"]:
652
- response = test_responses["supervisor_execution"]
653
- elif role == "supervisor" and messages[0]["content"].find("실행자 AI의 답변") > -1:
654
- response = test_responses["supervisor_review"]
655
- elif role == "supervisor":
656
- response = test_responses["supervisor_initial"]
657
- elif role == "researcher" and "추가 조사" in messages[0]["content"]:
658
- response = test_responses["researcher_additional"]
659
- elif role == "researcher":
660
- response = test_responses["researcher_initial"]
661
- elif role == "executor" and "최종 보고서" in messages[0]["content"]:
662
- response = test_responses["executor_final"]
663
- else:
664
- response = test_responses["executor"]
665
-
666
- yield from self.simulate_streaming(response, role)
667
- return
668
-
669
- # 실제 API 호출 (기존 코드와 동일)
670
- try:
671
- system_prompts = {
672
- "supervisor": "당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.",
673
- "researcher": "당신은 정보를 조사하고 체계적으로 정리하는 조사자 AI입니다.",
674
- "executor": "당신은 세부적인 내용을 구현하는 실행자 AI입니다."
675
- }
676
-
677
- full_messages = [
678
- {"role": "system", "content": system_prompts.get(role, "")},
679
- *messages
680
- ]
681
-
682
- payload = {
683
- "model": self.model_id,
684
- "messages": full_messages,
685
- "max_tokens": 2048,
686
- "temperature": 0.7,
687
- "top_p": 0.8,
688
- "stream": True,
689
- "stream_options": {"include_usage": True}
690
- }
691
-
692
- logger.info(f"API 스트리밍 호출 시작 - Role: {role}")
693
-
694
- response = requests.post(
695
- self.api_url,
696
- headers=self.create_headers(),
697
- json=payload,
698
- stream=True,
699
- timeout=10
700
- )
701
-
702
- if response.status_code != 200:
703
- logger.error(f"API 오류: {response.status_code}")
704
- yield f"❌ API 오류 ({response.status_code}): {response.text[:200]}"
705
- return
706
-
707
- for line in response.iter_lines():
708
- if line:
709
- line = line.decode('utf-8')
710
- if line.startswith("data: "):
711
- data = line[6:]
712
- if data == "[DONE]":
713
- break
714
- try:
715
- chunk = json.loads(data)
716
- if "choices" in chunk and chunk["choices"]:
717
- content = chunk["choices"][0].get("delta", {}).get("content", "")
718
- if content:
719
- yield content
720
- except json.JSONDecodeError:
721
- continue
722
-
723
- except requests.exceptions.Timeout:
724
- yield "⏱️ API 호출 시간이 초과되었습니다. 다시 시도해주세요."
725
- except requests.exceptions.ConnectionError:
726
- yield "🔌 API 서버에 연결할 수 없습니다. 인터넷 연결을 확인해주세요."
727
- except Exception as e:
728
- logger.error(f"스트리밍 중 오류: {str(e)}")
729
- yield f"❌ 오류 발생: {str(e)}"
730
-
731
  # 시스템 인스턴스 생성
732
  llm_system = LLMCollaborativeSystem()
733
 
@@ -863,14 +467,7 @@ def process_query_streaming(user_query: str):
863
  all_responses["executor"].append(executor_response)
864
 
865
  # 9단계: 감독자 AI 검토 및 피드백
866
- review_prompt = f"""당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.
867
-
868
- 사용자 질문: {user_query}
869
-
870
- 실행자 AI의 답변:
871
- {executor_response}
872
-
873
- 이 답변을 검토하고 개선점과 추가 고려사항을 제시해주세요. 구체적이고 실행 가능한 개선 방안을 제시하세요."""
874
 
875
  review_response = ""
876
  supervisor_text += "\n\n---\n\n[9. 검토 및 피드백] 🔄 생성 중...\n"
@@ -907,44 +504,21 @@ def process_query_streaming(user_query: str):
907
  all_responses["executor"].append(final_executor_response)
908
 
909
  # 최종 결과 생성
910
- final_summary = f"""## 🎯 최종 종합 보고서
911
-
912
- ### 📌 사용자 질문
913
- {user_query}
914
-
915
- ### 📄 최종 보고서 (실행자 AI - 피드백 완전 반영)
916
- {final_executor_response}
917
-
918
- ---
919
-
920
- <details>
921
- <summary>📋 전체 협력 과정 보기</summary>
922
-
923
- #### 1. 거시적 분석 (감독자 AI)
924
- {all_responses['supervisor'][0]}
925
-
926
- #### 2. 1차 조사 결과 (조사자 AI)
927
- {all_responses['researcher'][0]}
928
-
929
- #### 3. 조사 검토 및 추가 지시 (감독자 AI)
930
- {all_responses['supervisor'][1]}
931
-
932
- #### 4. 최종 조사 결과 (조사자 AI)
933
- {all_responses['researcher'][1]}
934
-
935
- #### 5. 실행 지시 (감독자 AI)
936
- {all_responses['supervisor'][2]}
937
-
938
- #### 6. 초기 구현 (실행자 AI)
939
- {all_responses['executor'][0]}
940
-
941
- #### 7. 검토 및 개선사항 (감독자 AI)
942
- {all_responses['supervisor'][3]}
943
-
944
- </details>
945
-
946
- ---
947
- *이 보고서는 2차 웹 검색과 AI들의 완전한 협력을 통해 작성되었습니다.*"""
948
 
949
  yield supervisor_text, researcher_text, executor_text, final_summary, "✅ 최종 보고서 완성!"
950
 
 
51
 
52
  def create_supervisor_initial_prompt(self, user_query: str) -> str:
53
  """감독자 AI 초기 프롬프트 생성"""
54
+ prompt = f"당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.\n\n"
55
+ prompt += f"사용자 질문: {user_query}\n\n"
56
+ prompt += "이 질문에 대해:\n"
57
+ prompt += "1. 전체적인 접근 방향과 프레임워크를 제시하세요\n"
58
+ prompt += "2. 핵심 요소와 고려사항을 구조화하여 설명하세요\n"
59
+ prompt += "3. 주제에 대해 조사가 필요한 5-7개의 구체적인 키워드나 검색어를 제시하세요\n\n"
60
+ prompt += "키워드는 다음 형식으로 제시하세요:\n"
61
+ prompt += "[검색 키워드]: 키워드1, 키워드2, 키워드3, 키워드4, 키워드5"
62
+ return prompt
 
 
63
 
64
  def create_supervisor_research_review_prompt(self, user_query: str, research_summary: str) -> str:
65
  """감독자 AI의 조사 내용 검토 및 추가 지시 프롬프트"""
66
+ prompt = f"당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.\n\n"
67
+ prompt += f"사용자 질문: {user_query}\n\n"
68
+ prompt += f"조사자 AI의 1차 조사 결과:\n{research_summary}\n\n"
69
+ prompt += "위 조사 결과를 검토하고:\n"
70
+ prompt += "1. 조사된 내용의 품질과 완전성을 평가하세요\n"
71
+ prompt += "2. 부족하거나 누락된 중요한 정보를 식별하세요\n"
72
+ prompt += "3. 추가로 조사가 필요한 3-5개의 구체적인 키워드나 주제를 제시하세요\n"
73
+ prompt += "4. 조사자에게 특별히 주의해야 할 사항이나 중점적으로 찾아야 할 정보를 지시하세요\n\n"
74
+ prompt += "추가 키워드는 다음 형식으로 제시하세요:\n"
75
+ prompt += "[추가 검색 키워드]: 키워드1, 키워드2, 키워드3"
76
+ return prompt
 
 
 
 
77
 
78
  def create_researcher_prompt(self, user_query: str, supervisor_guidance: str, search_results: Dict[str, List[Dict]]) -> str:
79
  """조사자 AI 프롬프트 생성"""
80
+ prompt = f"당신은 정보를 조사하고 정리하는 조사자 AI입니다.\n\n"
81
+ prompt += f"사용자 질문: {user_query}\n\n"
82
+ prompt += f"감독자 AI의 지침:\n{supervisor_guidance}\n\n"
83
+ prompt += "브레이브 검색 결과:\n"
84
+
85
  for keyword, results in search_results.items():
86
+ prompt += f"\n**{keyword}에 대한 검색 결과:**\n"
87
  for i, result in enumerate(results[:3], 1):
88
+ prompt += f"{i}. {result.get('title', 'N/A')}\n"
89
+ prompt += f" - {result.get('description', 'N/A')}\n"
90
+ prompt += f" - 출처: {result.get('url', 'N/A')}\n"
91
+
92
+ prompt += "\n위 검색 결과를 바탕으로:\n"
93
+ prompt += "1. 각 키워드별로 중요한 정보를 정리하세요\n"
94
+ prompt += "2. 신뢰할 수 있는 출처를 명시하세요\n"
95
+ prompt += "3. 실행자 AI가 활용할 수 있는 구체적인 데이터와 사실을 추출하세요\n"
96
+ prompt += "4. 최신 트렌드나 중요한 통계가 있다면 강조하세요"
97
+ return prompt
 
 
 
 
 
 
 
 
 
98
 
99
  def create_researcher_additional_prompt(self, user_query: str, previous_research: str, supervisor_feedback: str, search_results: Dict[str, List[Dict]]) -> str:
100
  """조사자 AI 추가 조사 프롬프트"""
101
+ prompt = f"당신은 정보를 조사하고 정리하는 조사자 AI입니다.\n\n"
102
+ prompt += f"사용자 질문: {user_query}\n\n"
103
+ prompt += f"이전 조사 내용:\n{previous_research}\n\n"
104
+ prompt += f"감독자 AI의 피드백 및 추가 조사 지시:\n{supervisor_feedback}\n\n"
105
+ prompt += "추가 검색 결과:\n"
106
+
107
  for keyword, results in search_results.items():
108
+ prompt += f"\n**{keyword}에 대한 추가 검색 결과:**\n"
109
  for i, result in enumerate(results[:3], 1):
110
+ prompt += f"{i}. {result.get('title', 'N/A')}\n"
111
+ prompt += f" - {result.get('description', 'N/A')}\n"
112
+ prompt += f" - 출처: {result.get('url', 'N/A')}\n"
113
+
114
+ prompt += "\n위 정보를 바탕으로:\n"
115
+ prompt += "1. 감독자가 요청한 추가 정보를 중점적으로 조사하세요\n"
116
+ prompt += "2. 이전 조사와 중복되지 않는 새로운 정보를 제공하세요\n"
117
+ prompt += "3. 특히 감독자가 지적한 부족한 부분을 보완하세요\n"
118
+ prompt += "4. 최종적으로 종합된 조사 결과를 제시하세요"
119
+ return prompt
 
 
 
 
 
 
 
 
 
 
 
 
120
 
121
  def create_supervisor_execution_prompt(self, user_query: str, research_summary: str) -> str:
122
  """감독자 AI의 실행 지시 프롬프트"""
123
+ prompt = f"당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.\n\n"
124
+ prompt += f"사용자 질문: {user_query}\n\n"
125
+ prompt += f"조사자 AI가 정리한 최종 조사 내용:\n{research_summary}\n\n"
126
+ prompt += "위 조사 내용을 기반으로 실행자 AI에게 아주 구체적인 지시를 내려주세요:\n"
127
+ prompt += "1. 조사된 정보를 어떻게 활용할지 명확히 지시하세요\n"
128
+ prompt += "2. 실행 가능한 단계별 작업을 구체적으로 제시하세요\n"
129
+ prompt += "3. 각 단계에서 참고해야 할 조사 내용을 명시하세요\n"
130
+ prompt += "4. 예상되는 결과물의 형태를 구체적으로 설명하세요"
131
+ return prompt
 
 
 
132
 
133
  def create_executor_prompt(self, user_query: str, supervisor_guidance: str, research_summary: str) -> str:
134
  """실행자 AI 프롬프트 생성"""
135
+ prompt = f"당신은 세부��인 내용을 구현하는 실행자 AI입니다.\n\n"
136
+ prompt += f"사용자 질문: {user_query}\n\n"
137
+ prompt += f"조사자 AI가 정리한 조사 내용:\n{research_summary}\n\n"
138
+ prompt += f"감독자 AI의 구체적인 지시:\n{supervisor_guidance}\n\n"
139
+ prompt += "위 조사 내용과 지시사항을 바탕으로:\n"
140
+ prompt += "1. 조사된 정보를 적극 활용하여 구체적인 실행 계획을 작성하세요\n"
141
+ prompt += "2. 각 단계별로 참고한 조사 내용을 명시하세요\n"
142
+ prompt += "3. 실제로 적용 가능한 구체적인 방법론을 제시하세요\n"
143
+ prompt += "4. 예상되는 성과와 측정 방법을 포함하세요"
144
+ return prompt
 
 
 
 
 
145
 
146
  def create_executor_final_prompt(self, user_query: str, initial_response: str, supervisor_feedback: str, research_summary: str) -> str:
147
  """실행자 AI 최종 보고서 프롬프트"""
148
+ prompt = f"당신은 세부적인 내용을 구현하는 실행자 AI입니다.\n\n"
149
+ prompt += f"사용자 질문: {user_query}\n\n"
150
+ prompt += f"조사자 AI의 조사 내용:\n{research_summary}\n\n"
151
+ prompt += f"당신의 초기 답변:\n{initial_response}\n\n"
152
+ prompt += f"감독자 AI의 피드백 및 개선사항:\n{supervisor_feedback}\n\n"
153
+ prompt += "위 피드백을 완전히 반영하여 최종 보고서를 작성하세요:\n"
154
+ prompt += "1. 감독자의 모든 개선사항을 반영하세요\n"
155
+ prompt += "2. 조사 내용을 더욱 구체적으로 활용하세요\n"
156
+ prompt += "3. 실행 가능성을 높이는 세부 계획을 포함하세요\n"
157
+ prompt += "4. 명확한 결론과 다음 단계를 제시하세요\n"
158
+ prompt += "5. 전문적이고 완성도 높은 최종 보고서 형식으로 작성하세요"
159
+ return prompt
 
 
 
 
 
 
 
160
 
161
  def extract_keywords(self, text: str) -> List[str]:
162
  """텍스트에서 키워드 추출"""
 
332
  logger.error(f"스트리밍 중 오류: {str(e)}")
333
  yield f"❌ 오류 발생: {str(e)}"
334
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
335
  # 시스템 인스턴스 생성
336
  llm_system = LLMCollaborativeSystem()
337
 
 
467
  all_responses["executor"].append(executor_response)
468
 
469
  # 9단계: 감독자 AI 검토 및 피드백
470
+ review_prompt = f"당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.\n\n사용자 질문: {user_query}\n\n실행자 AI의 답변:\n{executor_response}\n\n이 답변을 검토하고 개선점과 추가 고려사항을 제시해주세요. 구체적이고 실행 가능한 개선 방안을 제시하세요."
 
 
 
 
 
 
 
471
 
472
  review_response = ""
473
  supervisor_text += "\n\n---\n\n[9. 검토 및 피드백] 🔄 생성 중...\n"
 
504
  all_responses["executor"].append(final_executor_response)
505
 
506
  # 최종 결과 생성
507
+ final_summary = "## 최종 종합 보고서\n\n"
508
+ final_summary += f"### 사용자 질문\n{user_query}\n\n"
509
+ final_summary += f"### 최종 보고서 (실행자 AI - 피드백 반영)\n{final_executor_response}\n\n"
510
+ final_summary += "---\n\n"
511
+ final_summary += "<details>\n<summary>전체 협력 과정 보기</summary>\n\n"
512
+ final_summary += f"#### 1. 거시적 분석 (감독자 AI)\n{all_responses['supervisor'][0]}\n\n"
513
+ final_summary += f"#### 2. 첫 번째 조사 결과 (조사자 AI)\n{all_responses['researcher'][0]}\n\n"
514
+ final_summary += f"#### 3. 조사 검토 및 추가 지시 (감독자 AI)\n{all_responses['supervisor'][1]}\n\n"
515
+ final_summary += f"#### 4. 최종 조사 결과 (조사자 AI)\n{all_responses['researcher'][1]}\n\n"
516
+ final_summary += f"#### 5. 실행 지시 (감독자 AI)\n{all_responses['supervisor'][2]}\n\n"
517
+ final_summary += f"#### 6. 초기 구현 (실행자 AI)\n{all_responses['executor'][0]}\n\n"
518
+ final_summary += f"#### 7. 검토 및 개선사항 (감독자 AI)\n{all_responses['supervisor'][3]}\n\n"
519
+ final_summary += "</details>\n\n"
520
+ final_summary += "---\n"
521
+ final_summary += "*이 보고서는 2차 웹 검색과 AI들의 완전한 협력을 통해 작성되었습니다.*"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
522
 
523
  yield supervisor_text, researcher_text, executor_text, final_summary, "✅ 최종 보고서 완성!"
524