SOMA-Oriental / app.py
aiqtech's picture
Update app.py
e807e58 verified
raw
history blame
55.9 kB
import gradio as gr
import os
import json
import requests
from datetime import datetime
import time
from typing import List, Dict, Any, Generator, Tuple
import logging
import re
# 로깅 설정
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 환경 변수에서 토큰 가져오기
FRIENDLI_TOKEN = os.getenv("FRIENDLI_TOKEN", "YOUR_FRIENDLI_TOKEN")
BAPI_TOKEN = os.getenv("BAPI_TOKEN", "YOUR_BRAVE_API_TOKEN")
API_URL = "https://api.friendli.ai/dedicated/v1/chat/completions"
BRAVE_SEARCH_URL = "https://api.search.brave.com/res/v1/web/search"
MODEL_ID = "dep89a2fld32mcm"
TEST_MODE = os.getenv("TEST_MODE", "false").lower() == "true"
class LLMCollaborativeSystem:
def __init__(self):
self.token = FRIENDLI_TOKEN
self.bapi_token = BAPI_TOKEN
self.api_url = API_URL
self.brave_url = BRAVE_SEARCH_URL
self.model_id = MODEL_ID
self.test_mode = TEST_MODE or (self.token == "YOUR_FRIENDLI_TOKEN")
if self.test_mode:
logger.warning("테스트 모드로 실행됩니다.")
if self.bapi_token == "YOUR_BRAVE_API_TOKEN":
logger.warning("Brave API 토큰이 설정되지 않았습니다.")
def create_headers(self):
"""API 헤더 생성"""
return {
"Authorization": f"Bearer {self.token}",
"Content-Type": "application/json"
}
def create_brave_headers(self):
"""Brave API 헤더 생성"""
return {
"Accept": "application/json",
"Accept-Encoding": "gzip",
"X-Subscription-Token": self.bapi_token
}
def create_supervisor_initial_prompt(self, user_query: str) -> str:
"""감독자 AI 초기 프롬프트 생성"""
return f"""당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.
사용자 질문: {user_query}
이 질문에 대해:
1. 전체적인 접근 방향과 프레임워크를 제시하세요
2. 핵심 요소와 고려사항을 구조화하여 설명하세요
3. 이 주제에 대해 조사가 필요한 5-7개의 구체적인 키워드나 검색어를 제시하세요
키워드는 다음 형식으로 제시하세요:
[검색 키워드]: 키워드1, 키워드2, 키워드3, 키워드4, 키워드5"""
def create_supervisor_research_review_prompt(self, user_query: str, research_summary: str) -> str:
"""감독자 AI의 조사 내용 검토 및 추가 지시 프롬프트"""
return f"""당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.
사용자 질문: {user_query}
조사자 AI의 1차 조사 결과:
{research_summary}
위 조사 결과를 검토하고:
1. 조사된 내용의 품질과 완전성을 평가하세요
2. 부족하거나 누락된 중요한 정보를 식별하세요
3. 추가로 조사가 필요한 3-5개의 구체적인 키워드나 주제를 제시하세요
4. 조사자에게 특별히 주의해야 할 사항이나 중점적으로 찾아야 할 정보를 지시하세요
추가 키워드는 다음 형식으로 제시하세요:
[추가 검색 키워드]: 키워드1, 키워드2, 키워드3"""
def create_researcher_prompt(self, user_query: str, supervisor_guidance: str, search_results: Dict[str, List[Dict]]) -> str:
"""조사자 AI 프롬프트 생성"""
search_summary = ""
for keyword, results in search_results.items():
search_summary += f"\n\n**{keyword}에 대한 검색 결과:**\n"
for i, result in enumerate(results[:3], 1):
search_summary += f"{i}. {result.get('title', 'N/A')}\n"
search_summary += f" - {result.get('description', 'N/A')}\n"
search_summary += f" - 출처: {result.get('url', 'N/A')}\n"
return f"""당신은 정보를 조사하고 정리하는 조사자 AI입니다.
사용자 질문: {user_query}
감독자 AI의 지침:
{supervisor_guidance}
브레이브 검색 결과:
{search_summary}
위 검색 결과를 바탕으로:
1. 각 키워드별로 중요한 정보를 정리하세요
2. 신뢰할 수 있는 출처를 명시하세요
3. 실행자 AI가 활용할 수 있는 구체적인 데이터와 사실을 추출하세요
4. 최신 트렌드나 중요한 통계가 있다면 강조하세요"""
def create_researcher_additional_prompt(self, user_query: str, previous_research: str, supervisor_feedback: str, search_results: Dict[str, List[Dict]]) -> str:
"""조사자 AI 추가 조사 프롬프트"""
search_summary = ""
for keyword, results in search_results.items():
search_summary += f"\n\n**{keyword}에 대한 추가 검색 결과:**\n"
for i, result in enumerate(results[:3], 1):
search_summary += f"{i}. {result.get('title', 'N/A')}\n"
search_summary += f" - {result.get('description', 'N/A')}\n"
search_summary += f" - 출처: {result.get('url', 'N/A')}\n"
return f"""당신은 정보를 조사하고 정리하는 조사자 AI입니다.
사용자 질문: {user_query}
이전 조사 내용:
{previous_research}
감독자 AI의 피드백 및 추가 조사 지시:
{supervisor_feedback}
추가 검색 결과:
{search_summary}
위 정보를 바탕으로:
1. 감독자가 요청한 추가 정보를 중점적으로 조사하세요
2. 이전 조사와 중복되지 않는 새로운 정보를 제공하세요
3. 특히 감독자가 지적한 부족한 부분을 보완하세요
4. 최종적으로 종합된 조사 결과를 제시하세요"""
def create_supervisor_execution_prompt(self, user_query: str, research_summary: str) -> str:
"""감독자 AI의 실행 지시 프롬프트"""
return f"""당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.
사용자 질문: {user_query}
조사자 AI가 정리한 최종 조사 내용:
{research_summary}
위 조사 내용을 기반으로 실행자 AI에게 아주 구체적인 지시를 내려주세요:
1. 조사된 정보를 어떻게 활용할지 명확히 지시하세요
2. 실행 가능한 단계별 작업을 구체적으로 제시하세요
3. 각 단계에서 참고해야 할 조사 내용을 명시하세요
4. 예상되는 결과물의 형태를 구체적으로 설명하세요"""
def create_executor_prompt(self, user_query: str, supervisor_guidance: str, research_summary: str) -> str:
"""실행자 AI 프롬프트 생성"""
return f"""당신은 세부적인 내용을 구현하는 실행자 AI입니다.
사용자 질문: {user_query}
조사자 AI가 정리한 조사 내용:
{research_summary}
감독자 AI의 구체적인 지시:
{supervisor_guidance}
위 조사 내용과 지시사항을 바탕으로:
1. 조사된 정보를 적극 활용하여 구체적인 실행 계획을 작성하세요
2. 각 단계별로 참고한 조사 내용을 명시하세요
3. 실제로 적용 가능한 구체적인 방법론을 제시하세요
4. 예상되는 성과와 측정 방법을 포함하세요"""
def create_executor_final_prompt(self, user_query: str, initial_response: str, supervisor_feedback: str, research_summary: str) -> str:
"""실행자 AI 최종 보고서 프롬프트"""
return f"""당신은 세부적인 내용을 구현하는 실행자 AI입니다.
사용자 질문: {user_query}
조사자 AI의 조사 내용:
{research_summary}
당신의 초기 답변:
{initial_response}
감독자 AI의 피드백 및 개선사항:
{supervisor_feedback}
위 피드백을 완전히 반영하여 최종 보고서를 작성하세요:
1. 감독자의 모든 개선사항을 반영하세요
2. 조사 내용을 더욱 구체적으로 활용하세요
3. 실행 가능성을 높이는 세부 계획을 포함하세요
4. 명확한 결론과 다음 단계를 제시하세요
5. 전문적이고 완성도 높은 최종 보고서 형식으로 작성하세요"""
def extract_keywords(self, text: str) -> List[str]:
"""텍스트에서 키워드 추출"""
keywords = []
# [검색 키워드]: 또는 [추가 검색 키워드]: 형식으로 키워드 찾기
keyword_match = re.search(r'\[(추가 )?검색 키워드\]:\s*(.+)', text, re.IGNORECASE)
if keyword_match:
keyword_str = keyword_match.group(2)
keywords = [k.strip() for k in keyword_str.split(',') if k.strip()]
# 키워드가 없으면 기본 키워드 생성
if not keywords:
keywords = ["best practices", "implementation guide", "case studies", "latest trends", "success factors"]
return keywords[:7] # 최대 7개로 제한
def brave_search(self, query: str) -> List[Dict]:
"""Brave Search API 호출"""
if self.test_mode or self.bapi_token == "YOUR_BRAVE_API_TOKEN":
# 테스트 모드에서는 시뮬레이션된 결과 반환
return [
{
"title": f"Best Practices for {query}",
"description": f"Comprehensive guide on implementing {query} with proven methodologies and real-world examples.",
"url": f"https://example.com/{query.replace(' ', '-')}"
},
{
"title": f"Latest Trends in {query}",
"description": f"Analysis of current trends and future directions in {query}, including market insights and expert opinions.",
"url": f"https://trends.example.com/{query.replace(' ', '-')}"
},
{
"title": f"{query}: Case Studies and Success Stories",
"description": f"Real-world implementations of {query} across various industries with measurable results.",
"url": f"https://casestudies.example.com/{query.replace(' ', '-')}"
}
]
try:
params = {
"q": query,
"count": 5,
"safesearch": "moderate",
"freshness": "pw" # Past week for recent results
}
response = requests.get(
self.brave_url,
headers=self.create_brave_headers(),
params=params,
timeout=10
)
if response.status_code == 200:
data = response.json()
results = []
for item in data.get("web", {}).get("results", [])[:5]:
results.append({
"title": item.get("title", ""),
"description": item.get("description", ""),
"url": item.get("url", "")
})
return results
else:
logger.error(f"Brave API 오류: {response.status_code}")
return []
except Exception as e:
logger.error(f"Brave 검색 중 오류: {str(e)}")
return []
def simulate_streaming(self, text: str, role: str) -> Generator[str, None, None]:
"""테스트 모드에서 스트리밍 시뮬레이션"""
words = text.split()
for i in range(0, len(words), 3):
chunk = " ".join(words[i:i+3])
yield chunk + " "
time.sleep(0.05)
def call_llm_streaming(self, messages: List[Dict[str, str]], role: str) -> Generator[str, None, None]:
"""스트리밍 LLM API 호출"""
# 테스트 모드
if self.test_mode:
logger.info(f"테스트 모드 스트리밍 - Role: {role}")
test_responses = {
"supervisor_initial": """이 질문에 대한 거시적 분석을 제시하겠습니다.
1. **핵심 개념 파악**
- 질문의 본질적 요소를 심층 분석합니다
- 관련된 주요 이론과 원칙을 검토합니다
- 다양한 관점에서의 접근 방법을 고려합니다
2. **전략적 접근 방향**
- 체계적이고 단계별 해결 방안을 수립합니다
- 장단기 목표를 명확히 설정합니다
- 리스크 요인과 대응 방안을 마련합니다
3. **기대 효과와 과제**
- 예상되는 긍정적 성과를 분석합니다
- 잠재적 도전 과제를 식별합니다
- 지속가능한 발전 방향을 제시합니다
[검색 키워드]: machine learning optimization, performance improvement strategies, model efficiency techniques, hyperparameter tuning best practices, latest ML trends 2024""",
"researcher_initial": """조사 결과를 종합하여 다음과 같이 정리했습니다.
**1. Machine Learning Optimization**
- 최신 연구에 따르면 모델 최적화의 핵심은 아키텍처 설계와 훈련 전략의 균형입니다
- AutoML 도구들이 하이퍼파라미터 튜닝을 자동화하여 효율성을 크게 향상시킵니다
- 출처: ML Conference 2024, Google Research
**2. Performance Improvement Strategies**
- 데이터 품질 개선이 모델 성능 향상의 80%를 차지한다는 연구 결과
- 앙상블 기법과 전이학습이 주요 성능 개선 방법으로 입증됨
- 벤치마크: ImageNet에서 95% 이상의 정확도 달성 사례
**3. Model Efficiency Techniques**
- 모델 경량화(Pruning, Quantization)로 추론 속도 10배 향상 가능
- Knowledge Distillation으로 모델 크기 90% 감소, 성능 유지
- 최신 트렌드: Efficient Transformers, Neural Architecture Search
**4. 실제 적용 사례**
- Netflix: 추천 시스템 개선으로 사용자 만족도 35% 향상
- Tesla: 실시간 객체 인식 속도 50% 개선
- OpenAI: GPT 모델 효율성 개선으로 비용 70% 절감""",
"supervisor_research_review": """1차 조사 결과를 검토한 결과, 다음과 같은 평가와 추가 조사 지시를 제시합니다.
**조사 내용 평가**
- 강점: 주요 기술적 접근법과 대표적인 성공 사례가 잘 정리됨
- 부족한 점:
* 구체적인 구현 도구와 프레임워크 정보 부족
* 실패 사례와 함정(pitfalls) 정보 누락
* 비용-효과 분석의 구체적인 수치 부족
* 최신 논문이나 연구 결과의 구체적 인용 부족
**추가 조사 필요 사항**
1. 실제 구현 시 사용되는 구체적인 도구와 라이브러리
2. 모델 최적화 실패 사례와 그 원인 분석
3. 산업별 ROI 수치와 투자 대비 효과
4. 2024년 최신 연구 논문과 breakthrough 기술
5. 오픈소스 프로젝트와 커뮤니티 리소스
[추가 검색 키워드]: ML optimization tools 2024, model optimization failure cases, ML ROI analysis industry, breakthrough ML papers 2024, open source ML optimization""",
"researcher_additional": """감독자의 피드백을 반영하여 추가 조사를 수행했습니다.
**추가 조사 결과**
**1. 구체적인 구현 도구 및 프레임워크**
- **PyTorch Optimization Toolkit**: torch.optim, torch.nn.utils.prune
- **TensorFlow Model Optimization**: TF-MOT for pruning, quantization
- **ONNX Runtime**: 크로스 플랫폼 최적화, 평균 3배 속도 향상
- **Apache TVM**: 자동 최적화 컴파일러, 하드웨어별 최적화
- 출처: PyTorch Documentation 2024, TensorFlow Official Guide
**2. 실패 사례 및 교훈**
- **Uber의 Michelangelo 플랫폼**: 과도한 최적화로 인한 유지보수 문제
* 교훈: 최적화와 유지보수성의 균형 필요
- **Twitter의 추천 시스템**: 실시간 성능 최적화 실패
* 원인: 캐싱 전략 부재, 데이터 파이프라인 병목
- 출처: Uber Engineering Blog, Twitter Tech Blog 2024
**3. ROI 분석 및 비용 효과**
- **금융 산업**: 평균 ROI 312%, 투자 회수 기간 4.2개월
* JP Morgan: 사기 탐지 모델 최적화로 연간 $150M 절감
- **리테일**: 평균 ROI 245%, 투자 회수 기간 6개월
* Amazon: 추천 시스템 최적화로 매출 23% 증가
- **제조업**: 평균 ROI 189%, 투자 회수 기간 8개월
- 출처: McKinsey AI Report 2024, Gartner Analysis
**4. 2024년 최신 연구 및 Breakthrough**
- **Sparse Mixture of Experts (SMoE)**: 모델 크기 95% 감소, 성능 유지
* 논문: "Efficient Scaling with Sparse MoE" - Google DeepMind
- **Flash Attention v3**: 메모리 사용량 80% 감소
* 논문: "FlashAttention-3: Fast and Memory-Efficient Exact Attention"
- **Quantization-Aware Training 2.0**: 2-bit 양자화에서도 성능 유지
- 출처: NeurIPS 2024, ICML 2024 Proceedings
**5. 오픈소스 리소스**
- **Hugging Face Optimum**: 원클릭 모델 최적화 라이브러리
- **Microsoft DeepSpeed**: 대규모 모델 훈련 및 추론 최적화
- **NVIDIA TensorRT**: GPU 최적화 추론 엔진
- **Intel OpenVINO**: CPU 최적화 툴킷
- 커뮤니티: r/MachineLearning, MLOps Community Slack
**종합 분석**
초기 조사와 추가 조사를 종합하면, 성공적인 ML 모델 최적화를 위해서는:
1. 적절한 도구 선택과 단계적 접근이 필수
2. 실패 사례에서 배운 교훈을 사전에 반영
3. 명확한 ROI 목표와 측정 지표 설정
4. 최신 연구 결과의 선별적 적용
5. 오픈소스 커뮤니티의 적극적 활용""",
"supervisor_execution": """종합된 조사 내용을 바탕으로 실행자 AI에게 다음과 같이 구체적으로 지시합니다.
**실행 전략 수립 지침**
**1단계: 현재 상태 진단 및 도구 선택 (1주차)**
- 조사된 도구 중 프로젝트에 적합한 것 선택:
* PyTorch 기반: PyTorch Optimization Toolkit 활용
* TensorFlow 기반: TF-MOT 활용
* 크로스 플랫폼: ONNX Runtime 고려
- Uber와 Twitter의 실패 사례를 참고하여 리스크 체크리스트 작성
- 금융업 ROI 312% 사례를 벤치마크로 목표 설정
**2단계: 데이터 품질 및 파이프라인 최적화 (2-3주차)**
- 조사 결과의 "80% 규칙" 적용
- Twitter 사례를 참고하여 캐싱 전략 수립
- 데이터 파이프라인 병목 지점 사전 제거
**3단계: 모델 최적화 구현 (4-6주차)**
- 최신 연구 적용:
* Sparse MoE로 모델 크기 95% 감소 시도
* Flash Attention v3로 메모리 효율성 개선
* Quantization-Aware Training 2.0 적용
- 오픈소스 활용:
* Hugging Face Optimum으로 빠른 프로토타이핑
* DeepSpeed로 대규모 모델 처리
* 하드웨어별 최적화 (TensorRT/OpenVINO)
**4단계: 검증 및 배포 (7-8주차)**
- JP Morgan 사례 참고하여 비용 절감 효과 측정
- Amazon 사례의 A/B 테스트 방법론 적용
- 투자 회수 기간 4-6개월 목표로 ROI 계산
**특별 지시사항**
1. 각 단계에서 실패 사례의 교훈 반영 필수
2. 오픈소스 커뮤니티와의 협업 계획 포함
3. 최신 논문의 기술을 단계적으로 적용
4. 구체적인 비용-효과 수치를 포함한 보고""",
"executor": """감독자의 지시와 종합 조사 내용을 기반으로 구체적인 실행 계획을 수립합니다.
**ML 모델 최적화 실행 계획**
**1단계: 현재 상태 진단 및 도구 선택 (1주차)**
*월요일-화요일: 현재 환경 분석 및 도구 선정*
- 현재 모델 스택 확인:
* PyTorch 2.0 기반 → PyTorch Optimization Toolkit 선택
* 모델 크기: 2.5GB, 추론 시간: 45ms, GPU 메모리: 8GB
- 리스크 체크리스트 (실패 사례 기반):
□ 유지보수성 vs 최적화 균형 계획
□ 캐싱 전략 사전 설계
□ 데이터 파이프라인 병목 분석
□ 롤백 계획 수립
*수요일-목요일: 벤치마크 설정 및 ROI 목표*
- 금융업 ROI 312% 사례 분석:
* 현재 추론 비용: $50,000/월
* 목표 절감액: $35,000/월 (70% 절감)
* 예상 투자: $60,000 (인건비 + 인프라)
* 목표 ROI: 250% (6개월 내)
*금요일: 도구 환경 구축*
```python
# environment_setup.py
pip install torch torchvision torchaudio
pip install transformers optimum
pip install onnx onnxruntime
pip install deepspeed
pip install tensorrt # NVIDIA GPU 환경
```
**2단계: 데이터 품질 및 파이프라인 최적화 (2-3주차)**
*2주차: 데이터 품질 개선 (80% 규칙 적용)*
```python
class DataQualityPipeline:
def __init__(self):
self.cache_strategy = RedisCacheStrategy() # Twitter 교훈 반영
self.quality_checks = [
MissingValueHandler(threshold=0.05),
OutlierDetector(method='isolation_forest'),
DataDriftMonitor(window_size=1000),
LabelQualityChecker()
]
def optimize_pipeline(self, data_loader):
# 병목 지점 프로파일링
profiler = DataPipelineProfiler()
bottlenecks = profiler.identify_bottlenecks(data_loader)
# 캐싱 적용
for bottleneck in bottlenecks:
self.cache_strategy.apply(bottleneck)
return self.quality_checks
```
*3주차: 파이프라인 병렬화 및 최적화*
- 데이터 로딩 병렬화: num_workers=8
- 프리페칭 버퍼 크기 최적화: prefetch_factor=4
- 메모리 매핑 활용으로 I/O 속도 3배 향상
**3단계: 모델 최적화 구현 (4-6주차)**
*4주차: Sparse MoE 적용 (95% 크기 감소)*
```python
from transformers import SwitchTransformersModel
import torch.nn.utils.prune as prune
class SparseMoEOptimizer:
def __init__(self, model):
self.model = model
self.sparsity_target = 0.95
def apply_sparse_moe(self):
# Google DeepMind 논문 기반 구현
moe_config = {
'num_experts': 8,
'expert_capacity': 128,
'router_z_loss_coef': 0.01
}
# 모델 변환
sparse_model = self.convert_to_moe(self.model, moe_config)
# 크기 검증: 2.5GB → 125MB (95% 감소)
return sparse_model
```
*5주차: Flash Attention v3 및 Quantization*
```python
from flash_attn import flash_attn_func
from transformers import BitsAndBytesConfig
# Flash Attention v3 적용
class FlashAttentionOptimizer:
def optimize_attention(self, model):
# 메모리 사용량 80% 감소
for layer in model.transformer.layers:
layer.attention = FlashAttentionV3(layer.attention)
return model
# 2-bit Quantization
quantization_config = BitsAndBytesConfig(
load_in_2bit=True,
bnb_2bit_compute_dtype=torch.float16,
bnb_2bit_use_double_quant=True,
bnb_2bit_quant_type="nf2" # NeurIPS 2024 논문 기법
)
```
*6주차: 하드웨어별 최적화 및 통합*
- NVIDIA GPU: TensorRT 최적화
* FP16 추론: 2배 속도 향상
* INT8 캘리브레이션: 추가 2배 속도 향상
- CPU: OpenVINO 최적화
* VNNI 명령어 활용
- 최종 통합 테스트
**4단계: 검증 및 배포 (7-8주차)**
*7주차: 성능 검증 및 ROI 분석*
- 성능 측정 결과:
* 모델 크기: 2.5GB → 125MB (95% 감소) ✓
* 추론 속도: 45ms → 3ms (15배 향상) ✓
* 정확도: 94.2% → 93.8% (0.4% 손실) ✓
* GPU 메모리: 8GB → 1GB (87.5% 감소) ✓
- 비용 분석 (JP Morgan 사례 참조):
* 인프라 비용: $50,000/월 → $12,500/월
* 절감액: $37,500/월
* 투자 회수 기간: 1.6개월
* 6개월 ROI: 275%
*8주차: 단계적 배포 (Amazon 사례 적용)*
```python
class CanaryDeployment:
def __init__(self):
self.stages = [
(0.01, 1), # 1% 트래픽, 1일
(0.05, 2), # 5% 트래픽, 2일
(0.20, 3), # 20% 트래픽, 3일
(0.50, 3), # 50% 트래픽, 3일
(1.00, None) # 100% 트래픽
]
def deploy(self, optimized_model):
for traffic_ratio, days in self.stages:
metrics = self.monitor_performance(traffic_ratio)
if not self.meets_sla(metrics):
self.rollback()
break
```
**산출물 및 문서화**
1. 최적화된 모델 아티팩트 (125MB)
2. 성능 벤치마크 보고서
3. ROI 분석 문서
4. 운영 가이드 및 모니터링 대시보드
5. 오픈소스 기여: Hugging Face Model Hub에 공개
**커뮤니티 협업 계획**
- MLOps Community Slack 채널 참여
- 월간 진행상황 블로그 포스팅
- 오픈소스 프로젝트에 최적화 도구 기여""",
"supervisor_review": """실행자 AI의 계획을 검토한 결과, 조사 내용이 매우 잘 반영되었습니다. 다음과 같은 개선사항을 제안합니다.
**강점**
- 조사된 모든 도구와 기법이 체계적으로 활용됨
- 실패 사례의 교훈이 리스크 관리에 잘 반영됨
- 구체적인 코드 예시와 측정 가능한 목표 설정
- ROI 분석이 산업 벤치마크와 잘 연계됨
**개선 필요사항**
1. **모니터링 및 알림 체계 강화**
- 실시간 성능 모니터링 대시보드 구축
- 이상 징후 자동 감지 및 알림 시스템
- Grafana + Prometheus 조합 권장
2. **팀 역량 개발 계획**
- Sparse MoE, Flash Attention 등 신기술 교육
- 내부 스터디 그룹 운영
- 외부 전문가 초청 세미나
3. **장기 유지보수 전략**
- 분기별 모델 재최적화 일정
- 새로운 최적화 기법 도입 프로세스
- 기술 부채 관리 계획
4. **리스크 대응 시나리오 구체화**
- 각 최적화 단계별 실패 시 Plan B
- 성능 저하 시 즉각 대응 매뉴얼
- 비즈니스 연속성 계획
**추가 권장사항**
- 성공 사례를 컨퍼런스에서 발표하여 브랜드 가치 향상
- 최적화 프레임워크를 내부 플랫폼으로 발전
- 다른 팀/프로젝트에도 적용 가능한 템플릿 제작""",
"executor_final": """감독자 AI의 피드백을 완전히 반영하여 최종 실행 보고서를 작성합니다.
# 🎯 ML 모델 최적화 프로젝트 최종 실행 보고서
## 📋 Executive Summary
8주간의 체계적인 접근을 통해 ML 모델의 크기를 95% 줄이고, 추론 속도를 15배 향상시키며, 운영 비용을 75% 절감하는 목표를 달성할 예정입니다. 최신 연구 결과와 실패 사례의 교훈을 반영하여 리스크를 최소화하고, 275%의 ROI를 6개월 내에 달성할 것으로 예상됩니다.
## 🏗️ 프로젝트 구조
### 1단계: 진단 및 준비 (1주차)
**현황 분석 및 도구 선정**
```yaml
현재 상태:
모델_크기: 2.5GB
추론_시간: 45ms
GPU_메모리: 8GB
월간_비용: $50,000
선택된 도구:
기본_프레임워크: PyTorch 2.0 + Optimization Toolkit
모델_최적화: Sparse MoE, Flash Attention v3
양자화: Quantization-Aware Training 2.0
배포_최적화: TensorRT (GPU), OpenVINO (CPU)
모니터링: Grafana + Prometheus + Custom Alerts
```
**리스크 관리 체크리스트**
- [ ] Uber 사례: 유지보수성 검증 프로세스
- [ ] Twitter 사례: 캐싱 전략 사전 검증
- [ ] 데이터 파이프라인 스트레스 테스트
- [ ] 각 단계별 롤백 계획 문서화
- [ ] Plan B 시나리오 준비
### 2단계: 데이터 최적화 (2-3주차)
**고급 데이터 파이프라인**
```python
class EnhancedDataPipeline:
def __init__(self):
self.cache = RedisCluster(
startup_nodes=[
{"host": "10.0.0.1", "port": "7000"},
{"host": "10.0.0.2", "port": "7000"}
],
decode_responses=True,
skip_full_coverage_check=True
)
# 실시간 모니터링 통합
self.monitor = DataPipelineMonitor(
prometheus_gateway="http://prometheus:9091",
alert_webhook="https://slack.webhook.url"
)
def optimize_with_monitoring(self, data_loader):
# 병목 지점 실시간 감지
with self.monitor.profile("data_loading"):
optimized_loader = self.apply_optimizations(data_loader)
# 성능 지표 자동 수집
self.monitor.record_metrics({
"throughput": self.calculate_throughput(),
"latency_p99": self.get_latency_percentile(99),
"cache_hit_rate": self.cache.get_hit_rate()
})
return optimized_loader
```
### 3단계: 모델 최적화 구현 (4-6주차)
**통합 최적화 프레임워크**
```python
class ModelOptimizationFramework:
def __init__(self, model, config):
self.model = model
self.config = config
self.optimization_history = []
def apply_optimizations(self):
# 1. Sparse MoE 적용 (95% 크기 감소)
self.model = self.apply_sparse_moe()
self.validate_performance("sparse_moe")
# 2. Flash Attention v3 (메모리 80% 감소)
self.model = self.apply_flash_attention()
self.validate_performance("flash_attention")
# 3. 2-bit Quantization (추가 크기 감소)
self.model = self.apply_quantization()
self.validate_performance("quantization")
# 4. 하드웨어별 최적화
if self.config.target_hardware == "gpu":
self.model = self.optimize_tensorrt()
else:
self.model = self.optimize_openvino()
return self.model
def validate_performance(self, stage):
"""각 최적화 단계 후 성능 검증"""
metrics = self.benchmark()
if not self.meets_requirements(metrics):
# Plan B 실행
self.execute_fallback_plan(stage)
self.optimization_history.append({
"stage": stage,
"metrics": metrics,
"timestamp": datetime.now()
})
```
### 4단계: 검증 및 배포 (7-8주차)
**고급 모니터링 대시보드**
```python
class MLOpsMonitoringDashboard:
def __init__(self):
self.grafana = GrafanaAPI(url="http://grafana:3000")
self.prometheus = PrometheusAPI(url="http://prometheus:9090")
def create_dashboards(self):
# 실시간 성능 대시보드
performance_dashboard = {
"title": "ML Model Performance",
"panels": [
self.create_latency_panel(),
self.create_throughput_panel(),
self.create_resource_usage_panel(),
self.create_cost_analysis_panel()
]
}
# 이상 징후 감지 대시보드
anomaly_dashboard = {
"title": "Anomaly Detection",
"panels": [
self.create_drift_detection_panel(),
self.create_error_rate_panel(),
self.create_sla_compliance_panel()
]
}
# 알림 규칙 설정
self.setup_alerts([
Alert("High Latency", "latency_p99 > 10ms", severity="warning"),
Alert("Model Drift", "accuracy_drop > 2%", severity="critical"),
Alert("High Error Rate", "error_rate > 0.1%", severity="critical")
])
```
**단계적 배포 전략**
```python
class EnhancedCanaryDeployment:
def __init__(self):
self.deployment_stages = [
{"traffic": 0.01, "duration": "1d", "rollback_threshold": 0.1},
{"traffic": 0.05, "duration": "2d", "rollback_threshold": 0.5},
{"traffic": 0.20, "duration": "3d", "rollback_threshold": 1.0},
{"traffic": 0.50, "duration": "3d", "rollback_threshold": 1.5},
{"traffic": 1.00, "duration": None, "rollback_threshold": 2.0}
]
def deploy_with_monitoring(self, model):
for stage in self.deployment_stages:
# 트래픽 라우팅
self.route_traffic(model, stage["traffic"])
# 실시간 모니터링
metrics = self.monitor_performance(duration=stage["duration"])
# 자동 롤백 검사
if self.should_rollback(metrics, stage["rollback_threshold"]):
self.automatic_rollback()
self.notify_team("Automatic rollback triggered")
return False
return True
```
## 📊 예상 성과 및 ROI
### 성능 개선
| 지표 | 현재 | 목표 | 달성 예상 |
|------|------|------|-----------|
| 모델 크기 | 2.5GB | 125MB | ✓ 95% 감소 |
| 추론 시간 | 45ms | 3ms | ✓ 15배 향상 |
| GPU 메모리 | 8GB | 1GB | ✓ 87.5% 감소 |
| 정확도 | 94.2% | >92% | ✓ 93.8% |
### 비용 절감 및 ROI
- **월간 인프라 비용**: $50,000 → $12,500 (75% 절감)
- **연간 절감액**: $450,000
- **프로젝트 투자**: $60,000
- **투자 회수 기간**: 1.6개월
- **6개월 ROI**: 275%
- **1년 ROI**: 650%
## 👥 팀 역량 개발 계획
### 교육 프로그램
1. **주간 기술 세미나** (매주 금요일 2시간)
- Week 1-2: Sparse MoE 아키텍처 이해
- Week 3-4: Flash Attention 구현 실습
- Week 5-6: 양자화 기법 심화
- Week 7-8: MLOps 모니터링 실무
2. **외부 전문가 초청 강연**
- Google DeepMind 엔지니어: Sparse MoE 실전 적용
- NVIDIA 전문가: TensorRT 최적화 팁
- MLOps 커뮤니티 리더: 프로덕션 모니터링
3. **핸즈온 워크샵**
- 매월 1회 전일 실습
- 실제 모델로 최적화 실습
- 페어 프로그래밍 세션
## 🔧 장기 유지보수 전략
### 분기별 최적화 사이클
```yaml
Q1:
- 새로운 데이터로 모델 재훈련
- 최신 최적화 기법 조사
- 성능 벤치마크 업데이트
Q2:
- 프로덕션 메트릭 분석
- 병목 지점 재식별
- 추가 최적화 적용
Q3:
- 하드웨어 업그레이드 검토
- 새로운 프레임워크 평가
- 비용-효과 재분석
Q4:
- 연간 성과 리뷰
- 차년도 계획 수립
- 기술 부채 해결
```
### 기술 부채 관리
- 월간 기술 부채 리뷰 미팅
- 우선순위 매트릭스 관리
- 20% 시간을 리팩토링에 할당
## 🚀 확장 계획
### 내부 플랫폼화
1. **ML 최적화 플랫폼 구축**
- 웹 기반 UI로 손쉬운 최적화
- 자동화된 벤치마킹
- 템플릿 기반 적용
2. **다른 팀 지원**
- 최적화 컨설팅 서비스
- 베스트 프랙티스 문서화
- 내부 교육 프로그램
### 외부 기여
1. **오픈소스 프로젝트**
- Hugging Face Optimum 기여
- 자체 최적화 도구 공개
- 커뮤니티 피드백 수렴
2. **컨퍼런스 발표**
- MLOps Summit 2024
- PyTorch Conference
- 기업 사례 공유
## 📝 결론
본 프로젝트는 최신 ML 최적화 기술과 실무 경험을 결합하여, 대규모 비용 절감과 성능 향상을 동시에 달성합니다. 체계적인 리스크 관리와 지속적인 개선 프로세스를 통해 장기적인 경쟁력을 확보하고, 조직 전체의 ML 역량을 한 단계 끌어올릴 것으로 기대됩니다.
---
*작성일: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}*
*작성자: 협력적 AI 시스템 (감독자, 조사자, 실행자 AI)*
*버전: 2.0 (피드백 완전 반영)*"""
}
# 프롬프트 내용에 따라 적절한 응답 선택
if role == "supervisor" and "조사자 AI의 1차 조사 결과" in messages[0]["content"]:
response = test_responses["supervisor_research_review"]
elif role == "supervisor" and "조사자 AI가 정리한 최종 조사 내용" in messages[0]["content"]:
response = test_responses["supervisor_execution"]
elif role == "supervisor" and messages[0]["content"].find("실행자 AI의 답변") > -1:
response = test_responses["supervisor_review"]
elif role == "supervisor":
response = test_responses["supervisor_initial"]
elif role == "researcher" and "추가 조사" in messages[0]["content"]:
response = test_responses["researcher_additional"]
elif role == "researcher":
response = test_responses["researcher_initial"]
elif role == "executor" and "최종 보고서" in messages[0]["content"]:
response = test_responses["executor_final"]
else:
response = test_responses["executor"]
yield from self.simulate_streaming(response, role)
return
# 실제 API 호출 (기존 코드와 동일)
try:
system_prompts = {
"supervisor": "당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.",
"researcher": "당신은 정보를 조사하고 체계적으로 정리하는 조사자 AI입니다.",
"executor": "당신은 세부적인 내용을 구현하는 실행자 AI입니다."
}
full_messages = [
{"role": "system", "content": system_prompts.get(role, "")},
*messages
]
payload = {
"model": self.model_id,
"messages": full_messages,
"max_tokens": 2048,
"temperature": 0.7,
"top_p": 0.8,
"stream": True,
"stream_options": {"include_usage": True}
}
logger.info(f"API 스트리밍 호출 시작 - Role: {role}")
response = requests.post(
self.api_url,
headers=self.create_headers(),
json=payload,
stream=True,
timeout=10
)
if response.status_code != 200:
logger.error(f"API 오류: {response.status_code}")
yield f"❌ API 오류 ({response.status_code}): {response.text[:200]}"
return
for line in response.iter_lines():
if line:
line = line.decode('utf-8')
if line.startswith("data: "):
data = line[6:]
if data == "[DONE]":
break
try:
chunk = json.loads(data)
if "choices" in chunk and chunk["choices"]:
content = chunk["choices"][0].get("delta", {}).get("content", "")
if content:
yield content
except json.JSONDecodeError:
continue
except requests.exceptions.Timeout:
yield "⏱️ API 호출 시간이 초과되었습니다. 다시 시도해주세요."
except requests.exceptions.ConnectionError:
yield "🔌 API 서버에 연결할 수 없습니다. 인터넷 연결을 확인해주세요."
except Exception as e:
logger.error(f"스트리밍 중 오류: {str(e)}")
yield f"❌ 오류 발생: {str(e)}"
# 시스템 인스턴스 생성
llm_system = LLMCollaborativeSystem()
def process_query_streaming(user_query: str):
"""스트리밍을 지원하는 쿼리 처리 (대화 기록 제거)"""
if not user_query:
return "", "", "", "", "❌ 질문을 입력해주세요."
all_responses = {"supervisor": [], "researcher": [], "executor": []}
try:
# 1단계: 감독자 AI 초기 분석 및 키워드 추출
supervisor_prompt = llm_system.create_supervisor_initial_prompt(user_query)
supervisor_initial_response = ""
supervisor_text = "[1. 초기 분석] 🔄 생성 중...\n"
for chunk in llm_system.call_llm_streaming(
[{"role": "user", "content": supervisor_prompt}],
"supervisor"
):
supervisor_initial_response += chunk
supervisor_text = f"[1. 초기 분석] - {datetime.now().strftime('%H:%M:%S')}\n{supervisor_initial_response}"
yield supervisor_text, "", "", "", "🔄 감독자 AI가 분석 중..."
all_responses["supervisor"].append(supervisor_initial_response)
keywords = llm_system.extract_keywords(supervisor_initial_response)
# 2단계: 1차 브레이브 검색
researcher_text = "[2. 1차 웹 검색] 🔍 검색 중...\n"
yield supervisor_text, researcher_text, "", "", "🔍 웹 검색 수행 중..."
search_results = {}
for keyword in keywords:
results = llm_system.brave_search(keyword)
if results:
search_results[keyword] = results
researcher_text += f"✓ '{keyword}' 검색 완료\n"
yield supervisor_text, researcher_text, "", "", f"🔍 '{keyword}' 검색 중..."
# 3단계: 조사자 AI 1차 정리
researcher_prompt = llm_system.create_researcher_prompt(user_query, supervisor_initial_response, search_results)
researcher_response = ""
researcher_text = "[3. 1차 조사 정리] 🔄 생성 중...\n"
for chunk in llm_system.call_llm_streaming(
[{"role": "user", "content": researcher_prompt}],
"researcher"
):
researcher_response += chunk
researcher_text = f"[3. 1차 조사 정리] - {datetime.now().strftime('%H:%M:%S')}\n{researcher_response}"
yield supervisor_text, researcher_text, "", "", "📝 조사자 AI가 정리 중..."
all_responses["researcher"].append(researcher_response)
# 4단계: 감독자 AI가 조사 내용 검토 및 추가 지시
supervisor_review_prompt = llm_system.create_supervisor_research_review_prompt(user_query, researcher_response)
supervisor_review_response = ""
supervisor_text += "\n\n---\n\n[4. 조사 검토 및 추가 지시] 🔄 생성 중...\n"
for chunk in llm_system.call_llm_streaming(
[{"role": "user", "content": supervisor_review_prompt}],
"supervisor"
):
supervisor_review_response += chunk
temp_text = f"{all_responses['supervisor'][0]}\n\n---\n\n[4. 조사 검토 및 추가 지시] - {datetime.now().strftime('%H:%M:%S')}\n{supervisor_review_response}"
supervisor_text = f"[1. 초기 분석] - {datetime.now().strftime('%H:%M:%S')}\n{temp_text}"
yield supervisor_text, researcher_text, "", "", "🔍 감독자 AI가 추가 조사 지시 중..."
all_responses["supervisor"].append(supervisor_review_response)
additional_keywords = llm_system.extract_keywords(supervisor_review_response)
# 5단계: 2차 브레이브 검색
researcher_text += "\n\n---\n\n[5. 2차 웹 검색] 🔍 추가 검색 중...\n"
yield supervisor_text, researcher_text, "", "", "🔍 추가 웹 검색 수행 중..."
additional_search_results = {}
for keyword in additional_keywords:
results = llm_system.brave_search(keyword)
if results:
additional_search_results[keyword] = results
researcher_text += f"✓ '{keyword}' 추가 검색 완료\n"
yield supervisor_text, researcher_text, "", "", f"🔍 '{keyword}' 추가 검색 중..."
# 6단계: 조사자 AI 최종 정리
additional_researcher_prompt = llm_system.create_researcher_additional_prompt(
user_query, researcher_response, supervisor_review_response, additional_search_results
)
final_researcher_response = ""
researcher_text += "\n\n---\n\n[6. 최종 조사 정리] 🔄 생성 중...\n"
for chunk in llm_system.call_llm_streaming(
[{"role": "user", "content": additional_researcher_prompt}],
"researcher"
):
final_researcher_response += chunk
temp_text = researcher_text.split("\n\n---\n\n")
temp_text[-1] = f"[6. 최종 조사 정리] - {datetime.now().strftime('%H:%M:%S')}\n{final_researcher_response}"
researcher_text = "\n\n---\n\n".join(temp_text)
yield supervisor_text, researcher_text, "", "", "📝 조사자 AI가 최종 정리 중..."
all_responses["researcher"].append(final_researcher_response)
# 7단계: 감독자 AI가 최종 실행 지시
supervisor_execution_prompt = llm_system.create_supervisor_execution_prompt(user_query, final_researcher_response)
supervisor_execution_response = ""
supervisor_text += "\n\n---\n\n[7. 실행 지시] 🔄 생성 중...\n"
for chunk in llm_system.call_llm_streaming(
[{"role": "user", "content": supervisor_execution_prompt}],
"supervisor"
):
supervisor_execution_response += chunk
parts = supervisor_text.split("\n\n---\n\n")
parts[-1] = f"[7. 실행 지시] - {datetime.now().strftime('%H:%M:%S')}\n{supervisor_execution_response}"
supervisor_text = "\n\n---\n\n".join(parts)
yield supervisor_text, researcher_text, "", "", "🎯 감독자 AI가 실행 지시 중..."
all_responses["supervisor"].append(supervisor_execution_response)
# 8단계: 실행자 AI 초기 구현
executor_prompt = llm_system.create_executor_prompt(user_query, supervisor_execution_response, final_researcher_response)
executor_response = ""
executor_text = "[8. 초기 구현] 🔄 생성 중...\n"
for chunk in llm_system.call_llm_streaming(
[{"role": "user", "content": executor_prompt}],
"executor"
):
executor_response += chunk
executor_text = f"[8. 초기 구현] - {datetime.now().strftime('%H:%M:%S')}\n{executor_response}"
yield supervisor_text, researcher_text, executor_text, "", "🔧 실행자 AI가 구현 중..."
all_responses["executor"].append(executor_response)
# 9단계: 감독자 AI 검토 및 피드백
review_prompt = f"""당신은 거시적 관점에서 분석하고 지도하는 감독자 AI입니다.
사용자 질문: {user_query}
실행자 AI의 답변:
{executor_response}
이 답변을 검토하고 개선점과 추가 고려사항을 제시해주세요. 구체적이고 실행 가능한 개선 방안을 제시하세요."""
review_response = ""
supervisor_text += "\n\n---\n\n[9. 검토 및 피드백] 🔄 생성 중...\n"
for chunk in llm_system.call_llm_streaming(
[{"role": "user", "content": review_prompt}],
"supervisor"
):
review_response += chunk
parts = supervisor_text.split("\n\n---\n\n")
parts[-1] = f"[9. 검토 및 피드백] - {datetime.now().strftime('%H:%M:%S')}\n{review_response}"
supervisor_text = "\n\n---\n\n".join(parts)
yield supervisor_text, researcher_text, executor_text, "", "🔄 감독자 AI가 검토 중..."
all_responses["supervisor"].append(review_response)
# 10단계: 실행자 AI 최종 보고서
final_executor_prompt = llm_system.create_executor_final_prompt(
user_query, executor_response, review_response, final_researcher_response
)
final_executor_response = ""
executor_text += "\n\n---\n\n[10. 최종 보고서] 🔄 작성 중...\n"
for chunk in llm_system.call_llm_streaming(
[{"role": "user", "content": final_executor_prompt}],
"executor"
):
final_executor_response += chunk
parts = executor_text.split("\n\n---\n\n")
parts[-1] = f"[10. 최종 보고서] - {datetime.now().strftime('%H:%M:%S')}\n{final_executor_response}"
executor_text = "\n\n---\n\n".join(parts)
yield supervisor_text, researcher_text, executor_text, "", "📄 최종 보고서 작성 중..."
all_responses["executor"].append(final_executor_response)
# 최종 결과 생성
final_summary = f"""## 🎯 최종 종합 보고서
### 📌 사용자 질문
{user_query}
### 📄 최종 보고서 (실행자 AI - 피드백 완전 반영)
{final_executor_response}
---
<details>
<summary>📋 전체 협력 과정 보기</summary>
#### 1. 거시적 분석 (감독자 AI)
{all_responses['supervisor'][0]}
#### 2. 1차 조사 결과 (조사자 AI)
{all_responses['researcher'][0]}
#### 3. 조사 검토 및 추가 지시 (감독자 AI)
{all_responses['supervisor'][1]}
#### 4. 최종 조사 결과 (조사자 AI)
{all_responses['researcher'][1]}
#### 5. 실행 지시 (감독자 AI)
{all_responses['supervisor'][2]}
#### 6. 초기 구현 (실행자 AI)
{all_responses['executor'][0]}
#### 7. 검토 및 개선사항 (감독자 AI)
{all_responses['supervisor'][3]}
</details>
---
*이 보고서는 2차 웹 검색과 AI들의 완전한 협력을 통해 작성되었습니다.*"""
yield supervisor_text, researcher_text, executor_text, final_summary, "✅ 최종 보고서 완성!"
except Exception as e:
error_msg = f"❌ 처리 중 오류: {str(e)}"
yield "", "", "", error_msg, error_msg
def clear_all():
"""모든 내용 초기화"""
return "", "", "", "", "🔄 초기화되었습니다."
# Gradio 인터페이스
css = """
.gradio-container {
font-family: 'Arial', sans-serif;
}
.supervisor-box textarea {
border-left: 4px solid #667eea !important;
padding-left: 10px !important;
font-size: 13px !important;
}
.researcher-box textarea {
border-left: 4px solid #10b981 !important;
padding-left: 10px !important;
font-size: 13px !important;
}
.executor-box textarea {
border-left: 4px solid #764ba2 !important;
padding-left: 10px !important;
font-size: 13px !important;
}
"""
with gr.Blocks(title="협력적 LLM 시스템", theme=gr.themes.Soft(), css=css) as app:
gr.Markdown(
f"""
# 🤝 강화된 협력적 LLM 시스템
> 감독자, 조사자, 실행자 AI가 10단계 협력 프로세스를 통해 완전한 보고서를 작성합니다.
**상태**:
- LLM: {'🟢 실제 모드' if not llm_system.test_mode else '🟡 테스트 모드'}
- Brave Search: {'🟢 활성화' if llm_system.bapi_token != "YOUR_BRAVE_API_TOKEN" else '🟡 테스트 모드'}
**10단계 협력 프로세스:**
1. 🧠 감독자: 초기 분석 및 키워드 추출
2. 🔍 조사자: 1차 웹 검색
3. 🔍 조사자: 1차 조사 정리
4. 🧠 감독자: 조사 검토 및 추가 지시
5. 🔍 조사자: 2차 웹 검색
6. 🔍 조사자: 최종 조사 정리
7. 🧠 감독자: 실행 지시
8. 👁️ 실행자: 초기 구현
9. 🧠 감독자: 검토 및 피드백
10. 👁️ 실행자: 최종 보고서
"""
)
# 입력 섹션
with gr.Row():
with gr.Column(scale=4):
user_input = gr.Textbox(
label="질문 입력",
placeholder="예: 기계학습 모델의 성능을 향상시키는 최신 방법은?",
lines=2
)
with gr.Column(scale=1):
submit_btn = gr.Button("🚀 분석 시작", variant="primary", scale=1)
clear_btn = gr.Button("🗑️ 초기화", scale=1)
status_text = gr.Textbox(
label="상태",
interactive=False,
value="대기 중...",
max_lines=1
)
# AI 출력 섹션 (가로 3분할)
with gr.Row():
# 감독자 AI 출력
with gr.Column(scale=1):
gr.Markdown("### 🧠 감독자 AI")
supervisor_output = gr.Textbox(
label="거시적 분석 및 지시",
lines=20,
max_lines=25,
interactive=False,
elem_classes=["supervisor-box"]
)
# 조사자 AI 출력
with gr.Column(scale=1):
gr.Markdown("### 🔍 조사자 AI")
researcher_output = gr.Textbox(
label="웹 검색 및 정리",
lines=20,
max_lines=25,
interactive=False,
elem_classes=["researcher-box"]
)
# 실행자 AI 출력
with gr.Column(scale=1):
gr.Markdown("### 👁️ 실행자 AI")
executor_output = gr.Textbox(
label="구체적 구현",
lines=20,
max_lines=25,
interactive=False,
elem_classes=["executor-box"]
)
# 최종 결과
with gr.Row():
with gr.Column():
gr.Markdown("### 📊 최종 종합 결과")
final_output = gr.Markdown(
value="*질문을 입력하면 결과가 여기에 표시됩니다.*"
)
# 예제
gr.Examples(
examples=[
"기계학습 모델의 성능을 향상시키는 최신 방법은?",
"2024년 효과적인 프로젝트 관리 도구와 전략은?",
"지속 가능한 비즈니스 모델의 최신 트렌드는?",
"최신 데이터 시각화 도구와 기법은?",
"원격 팀의 생산성을 높이는 검증된 방법은?"
],
inputs=user_input,
label="💡 예제 질문"
)
# 이벤트 핸들러
submit_btn.click(
fn=process_query_streaming,
inputs=[user_input],
outputs=[supervisor_output, researcher_output, executor_output, final_output, status_text]
).then(
fn=lambda: "",
outputs=[user_input]
)
user_input.submit(
fn=process_query_streaming,
inputs=[user_input],
outputs=[supervisor_output, researcher_output, executor_output, final_output, status_text]
).then(
fn=lambda: "",
outputs=[user_input]
)
clear_btn.click(
fn=clear_all,
outputs=[supervisor_output, researcher_output, executor_output, final_output, status_text]
)
gr.Markdown(
"""
---
### 📝 사용 방법
1. 질문을 입력하고 Enter 또는 '분석 시작' 버튼을 클릭하세요.
2. 10단계 협력 프로세스가 진행됩니다:
- 감독자의 2차 조사 검토로 더 완전한 정보 수집
- 각 AI의 작업이 실시간으로 표시됩니다
3. 최종 보고서가 하단에 표시됩니다.
### ⚙️ 환경 설정
- **LLM API**: `export FRIENDLI_TOKEN="your_token"`
- **Brave Search API**: `export BAPI_TOKEN="your_brave_api_token"`
- **테스트 모드**: `export TEST_MODE=true` (API 없이 작동)
### 💡 특징
- **강화된 조사**: 감독자가 조사 내용을 검토하고 추가 조사 지시
- **가독성 개선**: 3개 AI 출력을 가로로 배치하여 동시 확인
- **완전한 피드백 루프**: 모든 개선사항이 최종 보고서에 반영
"""
)
if __name__ == "__main__":
app.queue() # 스트리밍을 위한 큐 활성화
app.launch(
server_name="0.0.0.0",
server_port=7860,
share=True,
show_error=True
)