AI

MoE란 무엇인가? 인기 AI 아키텍처 심층 분석

이 심층 가이드를 통해 머신러닝에서 전문가 혼합(Mixture of Experts)의 힘을 발견하세요. 아키텍처, 이점 및 구현 단계를 다룹니다.
6 분 읽기
What is MoE blog image

이 전문가 혼합(Mixture of Experts) 가이드에서는 다음을 배울 수 있습니다:

  • MoE(전문가 혼합)란 무엇이며 기존 모델과 어떻게 다른지
  • 사용 시 장점
  • 구현 방법에 대한 단계별 튜토리얼

자, 시작해 보겠습니다!

MoE란 무엇인가요?

MoE(전문가 혼합)는 더 큰 시스템 내에서 여러 개의 전문화된 하위 모델, 즉 “전문가”들을 결합하는 머신 러닝 아키텍처입니다. 각 전문가는 작업의 서로 다른 측면이나 별개의 데이터 유형을 처리하는 법을 학습합니다.

이 아키텍처의 핵심 구성 요소는 “게이팅 네트워크” 또는 “라우터”입니다. 이 구성 요소는 특정 입력을 처리할 전문가 또는 전문가 조합을 결정합니다. 게이팅 네트워크는 또한 각 전문가의 출력에 가중치를 할당합니다. 가중치는 점수와 유사하며, 각 전문가의 결과가 얼마나 큰 영향을 미쳐야 하는지를 나타냅니다.

The MoE architecture

간단히 말해, 게이팅 네트워크는 가중치를 사용하여 최종 답변에 대한 각 전문가의 기여도를 조정합니다. 이를 위해 입력의 특정 특징을 고려합니다. 이로 인해 시스템은 단일 모델보다 다양한 유형의 데이터를 더 잘 처리할 수 있습니다.

MoE와 기존 밀집 모델의 차이점

신경망 맥락에서 전통적인 덴스 모델은 MoE와 다른 방식으로 작동합니다. 덴스 모델은 입력된 모든 정보에 대해 내부 매개변수 전체를 활용해 계산을 수행합니다. 따라서 입력마다 계산 장치의 모든 부분이 동원됩니다.

핵심은 덴시 모델에서는 모든 작업에 모든 부분이 동원된다는 점입니다. 이는 관련 전문가 하위 섹션만 활성화하는 MoE와 대조됩니다.

MoE와 촘촘한 모델 간의 주요 차이점은 다음과 같습니다:

  • 매개변수 사용:
    • 밀집 모델: 주어진 입력에 대해 모델은 계산에 모든 매개변수를 사용합니다.
    • MoE 모델: 주어진 입력에 대해, 모델은 선택된 전문가(들)과 게이트 네트워크의 파라미터만 사용합니다. 따라서 MoE 모델이 많은 수의 파라미터를 가질 경우, 단일 계산에 대해 이들 파라미터의 일부만 활성화합니다.
  • 계산 비용:
    • 밀집 모델: 밀집 레이어의 계산량은 모든 입력에 대해 고정되어 있습니다. 모든 부분이 항상 작동하기 때문입니다.
    • MoE 모델: MoE 레이어를 통한 입력 처리의 계산 비용은 동일한 총 매개변수 크기의 덴스 레이어보다 낮을 수 있습니다. 이는 모델의 일부(선택된 전문가)만이 작업을 수행하기 때문입니다. 이를 통해 MoE 모델은 개별 입력당 계산 비용이 비례적으로 증가하지 않으면서도 훨씬 더 많은 총 매개변수로 확장할 수 있습니다.
  • 전문화와 학습:
    • 밀집 모델: 밀집 레이어의 모든 부분은 접하는 모든 유형의 입력 처리에 기여하도록 학습합니다.
    • MoE 모델: 서로 다른 전문가 네트워크는 전문화될 수 있습니다. 예를 들어, 한 전문가는 역사 관련 질문 처리에 능숙해지고, 다른 전문가는 과학 개념에 특화될 수 있습니다. 게이트 네트워크는 입력 유형을 식별하고 가장 적합한 전문가에게 전달하는 법을 학습합니다. 이는 더 미묘하고 효과적인 처리를 가능하게 합니다.

전문가 혼합(MoE) 아키텍처의 장점

MoE 아키텍처는 현대 AI, 특히 대규모 언어 모델(LLM)을 다룰 때 매우 중요합니다. 그 이유는 모델의 용량(정보 학습 및 저장 능력)을 사용 시 계산 비용의 비례적 증가 없이 확장할 수 있는 방법을 제공하기 때문입니다.

AI에서 MoE의 주요 장점은 다음과 같습니다:

  • 추론 지연 시간 감소: MoE 모델은 예측 또는 출력 생성(추론 지연 시간)에 소요되는 시간을 줄일 수 있습니다. 이는 가장 관련성이 높은 전문가만 활성화하는 능력 덕분입니다.
  • 훈련 확장성 및 효율성 향상: AI 훈련 과정에서 MoE 아키텍처의 병렬 처리 특성을 활용할 수 있습니다. 서로 다른 전문가들이 다양한 데이터 하위 집합이나 특수화된 작업에 대해 동시에 훈련될 수 있습니다. 이는 더 빠른 수렴과 훈련 시간 단축으로 이어질 수 있습니다.
  • 모델 모듈성 및 유지보수성 향상: 전문가 서브네트워크의 분리된 특성은 모델 개발 및 유지보수에 모듈식 접근을 용이하게 합니다. 개별 전문가들은 전체 모델을 완전히 재훈련할 필요 없이 독립적으로 업데이트, 재훈련 또는 개선된 버전으로 교체될 수 있습니다. 이는 새로운 지식이나 기능의 통합을 단순화하고 특정 전문가의 성능이 저하될 경우 보다 표적화된 개입을 가능하게 합니다.
  • 해석 가능성 향상 가능성: 전문가의 전문화는 모델의 의사 결정 과정에 대한 명확한 통찰력을 제공할 수 있습니다. 특정 입력에 대해 지속적으로 활성화되는 전문가를 분석하면 모델이 문제 공간을 분할하고 관련성을 부여하는 방식을 파악하는 단서를 얻을 수 있습니다. 이 특성은 단일 밀집 네트워크에 비해 복잡한 모델 동작을 더 잘 이해할 수 있는 잠재적 방법을 제공합니다.
  • 대규모 환경에서의 높은 에너지 효율성: MoE 기반 모델은 기존 밀집형 모델 대비 쿼리당 에너지 소비량을 낮출 수 있습니다. 이는 추론 과정에서 사용 가능한 매개변수의 일부만 입력당 활용하는 스파스 활성화 방식 덕분입니다.

MoE 구현 방법: 단계별 가이드

이 튜토리얼 섹션에서는 MoE 사용법을 배웁니다. 특히 스포츠 뉴스를 포함한 데이터셋을 활용할 것입니다. MoE는 다음 모델을 기반으로 한 두 가지 전문가를 활용합니다:

  1. sshleifer/distilbart-cnn-6-6: 각 뉴스의 내용을 요약합니다.
  2. distilbert-base-uncased-finetuned-sst-2-english: 각 뉴스의 감정을 계산합니다. 감정 분석에서 “감정”은 텍스트에 표현된 감정적 어조, 의견 또는 태도를 의미합니다. 출력 결과는 다음과 같습니다:
    • 긍정적: 호의적인 의견, 행복감 또는 만족감을 표현합니다.
    • 부정적: 불리한 의견, 슬픔, 분노 또는 불만을 표현함.
    • 중립: 강한 감정이나 의견을 표현하지 않으며, 종종 사실에 기반합니다.

프로세스 종료 시, 각 뉴스 항목은 다음을 포함하는 JSON 파일에 저장됩니다:

  • ID, 헤드라인, URL.
  • 내용 요약.
  • 신뢰도 점수와 함께 제공되는 콘텐츠 감정 분석 결과.

뉴스를 포함한 데이터셋은 Bright Data의 웹 스크레이퍼 API를 사용하여 검색할 수 있습니다. 이 API는 100개 이상의 도메인에서 실시간으로 구조화된 웹 데이터를 검색하기 위한 전문 스크레이핑 엔드포인트입니다.

입력 JSON 데이터가 포함된 데이터셋은 가이드 “벡터 데이터베이스 이해: 현대 AI의 엔진“에 있는 코드를 사용하여 생성할 수 있습니다. 구체적으로는 “실용적 통합: 단계별 가이드” 장의 1단계를 참조하십시오.

news-data.json이라는 입력 JSON 데이터셋은 아래와 같은 뉴스 항목 배열을 포함합니다:

[
  {
    "id": "c787dk9923ro",
    "url": "https://www.bbc.com/sport/tennis/articles/c787dk9923ro",
    "author": "BBC",
    "headline": "윔블던, '헨먼 힐' 수용 인원 및 접근성 확대 계획",
    "topics": [
      "테니스"
    ],
    "publication_date": "2026-04-03T11:28:36.326Z",
    "content": "윔블던은 대회 150주년을 맞아 상징적인 '헨먼 힐'을 리모델링하고 수용 인원을 늘릴 계획이다. 수천 명의 팬들이 쇼 코트 티켓 없이도 관람할 수 있는 잔디 경사면에서 대형 스크린으로 경기를 지켜봐 왔습니다. 아직 승인되지 않은 이 개편안은 2027년 대회에 맞춰 언덕 수용 인원을 20% 늘리고 접근성을 개선할 예정입니다. 이는 지난해 39개 코트 확장이 승인된 이후 올 잉글랜드 클럽이 계획한 최신 변화입니다. 광고 "이 지역 전체를 개선하는 것이 핵심입니다. 분명히 인기가 매우 높아졌지만 접근성은 모두에게 어려운 문제죠."라고 언덕의 이름을 딴 4회 윔블던 준결승 진출자 팀 헨먼이 말했다. "우리는 부지 내 어디든 항상 개선 방안을 모색하고 있습니다. 이번 프로젝트는 매우 흥미로울 것입니다."",
    "videos": [],
    "images": [
      {
        "image_url": "https://ichef.bbci.co.uk/ace/branded_sport/1200/cpsprodpb/31f9/live/0f5b2090-106f-11f0-b72e-6314f702e779.jpg",
        "image_description": "메인 이미지"
      },
      {
        "image_url": "https://ichef.bbci.co.uk/ace/standard/2560/cpsprodpb/31f9/live/0f5b2090-106f-11f0-b72e-6314f702e779.jpg",
        "image_description": "윔블던 헨먼 힐(Henman Hill) 개선 계획 렌더링 이미지"
      }
    ],
    "관련 기사": [
      {
        "기사 제목": "실시간 스코어, 결과 및 경기 순서실시간 스코어, 결과 및 경기 순서",
        "기사 URL": "https://www.bbc.com/sport/tennis/scores-and-schedule"
      },
      {
        "article_title": "휴대폰으로 테니스 뉴스 바로 받아보기휴대폰으로 테니스 뉴스 바로 받아보기",
        "article_url": "https://www.bbc.com/sport/articles/cl5q9dk9jl3o"
      }
    ],
    "keyword": null,
    "timestamp": "2026-05-19T15:03:16.568Z",
    "input": {
      "url": "https://www.bbc.com/sport/tennis/articles/c787dk9923ro",
      "keyword": ""
    }
  },
  // 생략...
]

아래 지침을 따라 MoE 예제를 구축하세요!

필수 조건 및 종속성

이 튜토리얼을 재현하려면 컴퓨터에 Python 3.10.1 이상이 설치되어 있어야 합니다.

프로젝트의 메인 폴더를 moe_project/라고 가정합니다 . 이 단계가 완료되면 폴더 구조는 다음과 같아집니다:

moe_project/
├── venv/
├── news-data.json
└── moe_analysis.py

여기서:

  • venv/에는 Python 가상 환경이 포함됩니다.
  • news-data.json은 웹 스크레이퍼 API로 수집한 뉴스 데이터가 포함된 입력 JSON 파일입니다.
  • moe_analysis.py는 코딩 로직이 포함된 Python 파일입니다.

다음과 같이 venv/ 가상 환경 디렉터리를 생성할 수 있습니다:

python -m venv venv

활성화하려면 Windows에서 다음을 실행하세요:

venvScriptsactivate

macOS 및 Linux에서는 다음과 같이 실행합니다:

source venv/bin/activate

활성화된 가상 환경에서 다음 명령어로 종속성을 설치하세요:

pip install transformers torch

이 라이브러리들은 다음과 같습니다:

  • transformers: Hugging Face의 최첨단 머신러닝 모델 라이브러리.
  • torch: 오픈소스 머신러닝 프레임워크인 PyTorch입니다.

1단계: 설정 및 구성

필요한 라이브러리를 임포트하고 상수를 설정하여 moe_analysis.py 파일을 초기화합니다:

import json
from transformers import pipeline

# 입력 JSON 파일 정의
JSON_FILE = "news-data.json"
# 요약 생성용 모델 지정
SUMMARIZATION_MODEL = "sshleifer/distilbart-cnn-6-6"
# 감정 분석용 모델 지정
SENTIMENT_MODEL = "distilbert-base-uncased-finetuned-sst-2-english"

이 코드는 다음을 정의합니다:

  • 스크랩된 뉴스가 포함된 입력 JSON 파일의 이름.
  • 전문가 분석에 사용할 모델들.

완벽합니다! 이제 Python으로 MoE를 시작할 준비가 되었습니다.

2단계: 뉴스 요약 전문가 정의

이 단계에서는 뉴스 요약 전문가의 기능을 캡슐화하는 클래스를 생성합니다:

class NewsSummarizationLLMExpert:
    def __init__(self, model_name=SUMMARIZATION_MODEL):
        self.model_name = model_name
        self.summarizer = None

        # 요약 파이프라인 초기화
        self.summarizer = pipeline(
            "summarization",
            model=self.model_name,
            tokenizer=self.model_name,
        )

    def analyze(self, article_content, article_headline=""):
        # 기사 내용으로 요약 파이프라인 호출
        summary_outputs = self.summarizer(
            article_content,
            max_length=300,
            min_length=30,
            do_sample=False
        )
        # 파이프라인 출력에서 요약 텍스트 추출
        summary = summary_outputs[0]["summary_text"]
        return { "summary": summary }

위의 코드:

  • Hugging Face의 pipeline() 메서드로 요약 파이프라인을 초기화합니다.
  • analyze() 메서드로 요약 전문가(expert)가 기사를 처리하는 방식을 정의합니다.

좋습니다! 방금 뉴스 요약 작업을 담당하는 MoE 아키텍처의 첫 번째 전문가를 생성했습니다.

단계 #3: 감정 분석 전문가 정의

요약 전문가와 유사하게, 뉴스에 대한 감정 분석을 수행하기 위한 전용 클래스를 정의합니다:

class SentimentAnalysisLLMExpert:
    def __init__(self, model_name=SENTIMENT_MODEL):
        self.model_name = model_name
        self.sentiment_analyzer = None 

        # 감정 분석 파이프라인 초기화
        self.sentiment_analyzer = pipeline(
            "sentiment-analysis",
            model=self.model_name,
            tokenizer=self.model_name,
        )

    def analyze(self, article_content, article_headline=""):
        # 감정 분석을 위한 최대 토큰 수 정의
        max_chars_for_sentiment = 2000
        # 콘텐츠가 최대 한도를 초과할 경우 잘라내기
        truncated_content = article_content[:max_chars_for_sentiment]
        # 감정 분석 파이프라인 호출
        sentiment_outputs = self.sentiment_analyzer(truncated_content)
        # 감정 라벨 추출
        label = sentiment_outputs[0]["label"]
        # 감정 점수 추출
        score = sentiment_outputs[0]["score"]
        return { "sentiment_label": label, "sentiment_score": score }

이 코드 조각은:

  • 감정 분석 파이프라인을 pipeline() 메서드로 초기화합니다.
  • 감정 분석을 수행하는 메서드 analyze() 를 정의합니다. 또한 감정 레이블(부정적 또는 긍정적)과 신뢰도 점수를 반환합니다.

훌륭합니다! 이제 뉴스 텍스트의 감정을 계산하고 표현하는 또 다른 전문가를 갖게 되었습니다.

단계 #4: 게이트 네트워크 구현

이제 전문가들을 라우팅하기 위한 게이트 네트워크의 논리를 정의해야 합니다:

def route_to_experts(item_data, experts_registry):
    chosen_experts = []
    # 요약기 및 감정 분석기 선택
    chosen_experts.append(experts_registry["summarizer"])
    chosen_experts.append(experts_registry["sentiment_analyzer"])
    return chosen_experts

이 구현에서 게이트 네트워크는 간단합니다. 모든 뉴스 항목에 대해 항상 두 전문가를 모두 사용하지만 순차적으로 수행합니다:

  1. 텍스트를 요약합니다.
  2. 감정을 계산합니다.

참고: 이 예시에서 게이트 네트워크는 상당히 단순합니다. 동시에, 단일 대형 모델로 동일한 목표를 달성하려면 훨씬 더 많은 계산이 필요했을 것입니다. 반면, 두 전문가는 각자 관련 있는 작업에만 활용됩니다. 이는 전문가 혼합(Mixture of Experts) 아키텍처를 간단하면서도 효과적으로 적용한 사례입니다.

다른 시나리오에서는 특정 전문가를 활성화하는 방법과 시점을 학습하도록 ML 모델을 훈련함으로써 이 과정의 해당 부분을 개선할 수 있습니다. 이를 통해 게이팅 네트워크가 동적으로 반응할 수 있게 됩니다.

훌륭합니다! 게이트 네트워크 로직이 설정되어 운영 준비가 완료되었습니다.

단계 #5: 뉴스 데이터 처리를 위한 주요 오케스트레이션 로직

다음 작업으로 정의된 전체 워크플로를 관리하는 핵심 기능을 정의합니다:

  1. JSON 데이터셋을 로드합니다.
  2. 두 전문가를 초기화합니다.
  3. 뉴스 항목을 반복 처리합니다.
  4. 선택된 전문가에게 라우팅합니다.
  5. 결과를 수집합니다.

다음 코드로 구현할 수 있습니다:

def process_news_json_with_moe(json_filepath):
    # JSON 파일에서 뉴스 항목을 열고 로드
    with open(json_filepath, "r", encoding="utf-8") as f:
        news_items = json.load(f)

    # 전문가 클래스 인스턴스를 저장할 사전 생성
    experts_registry = {
        "summarizer": NewsSummarizationLLMExpert(),
        "sentiment_analyzer": SentimentAnalysisLLMExpert()
    }

    # 분석 결과 저장용 리스트
    all_results = []

    # 로드된 데이터의 각 뉴스 항목 반복 처리
    for i, news_item in enumerate(news_items):
        print(f"n--- 기사 {i+1}/{len(news_items)} 처리 중 ---")
        # 뉴스 항목에서 관련 데이터 추출
        id = news_item.get("id")
        headline = news_item.get("headline")
        content = news_item.get("content")
        url = news_item.get("url")

        # 진행 상황 출력
        print(f"ID: {id}, 헤드라인: {headline[:70]}...")

        # 게이트 네트워크를 사용하여 사용할 전문가를 결정
        active_experts = route_to_experts(news_item, experts_registry)

        # 분석 결과를 저장할 사전 준비
        news_item_analysis_results = {
            "id": id,
            "headline": headline,
            "url": url,
            "analyses": {}
        }

        # 전문가들을 순회하며 분석 적용
        for expert_instance in active_experts:
            expert_name = expert_instance.__class__.__name__ # 전문가 클래스 이름 획득
            try:
                # 전문가의 analyze 메서드 호출
                analysis_result = expert_instance.analyze(article_content=content, article_headline=headline)
                # 결과를 전문가 이름 아래 저장
                news_item_analysis_results["분석 결과"][expert_name] = analysis_result

            except Exception as e:
                # 특정 전문가 분석 중 발생한 오류 처리
                print(f"{expert_name} 분석 중 오류: {e}")
                news_item_analysis_results["analyses"][expert_name] = { "error": str(e) }

        # 현재 항목의 결과를 전체 목록에 추가
        all_results.append(news_item_analysis_results)

    return all_results

이 코드 조각에서:

  • for 루프는 로드된 모든 뉴스를 반복합니다.
  • try-except 블록은 분석을 수행하고 발생할 수 있는 오류를 처리합니다. 이 경우 발생 가능한 오류는 주로 이전 함수에서 정의된 max_lengthmax_chars_for_sentiment 매개변수 때문입니다. 가져온 모든 콘텐츠의 길이가 동일하지 않기 때문에 예외를 효과적으로 처리하려면 오류 관리가 필수적입니다.

자, 이제 전체 프로세스의 오케스트레이션 함수를 정의했습니다.

6단계: 처리 함수 실행

스크립트의 마지막 부분으로, 다음과 같이 주요 처리 함수를 실행한 후 분석 결과를 출력 JSON 파일에 저장해야 합니다:

# 입력 JSON 파일로 메인 처리 함수 호출
final_analyses = process_news_json_with_moe(JSON_FILE)

print("nn--- MoE 분석 완료 ---")

# 최종 분석 결과를 새 JSON 파일에 기록
with open("analyzed_news_data.json", "w", encoding="utf-8") as f_out:
    json.dump(final_analyses, f_out, indent=4, ensure_ascii=False)

위 코드에서:

  • final_analyses 변수는 MoE로 데이터를 처리하는 함수를 호출합니다.
  • 분석된 데이터는 출력 파일 analyzed_news_data.json 에 저장됩니다.

자, 이제 완성되었습니다! 전체 스크립트가 마무리되었고, 데이터가 분석되어 저장되었습니다.

7단계: 모든 것을 통합하고 코드 실행하기

아래는 moe_analysis.py 파일에 포함되어야 할 내용입니다:

import json
from transformers import pipeline

# 입력 JSON 파일 정의
JSON_FILE = "news-data.json"
# 요약 생성용 모델 지정
SUMMARIZATION_MODEL = "sshleifer/distilbart-cnn-6-6"
# 감정 분석용 모델 지정
SENTIMENT_MODEL = "distilbert-base-uncased-finetuned-sst-2-english"

# 뉴스 요약 전문가 클래스 정의
class NewsSummarizationLLMExpert:
    def __init__(self, model_name=SUMMARIZATION_MODEL):
        self.model_name = model_name
        self.summarizer = None

        # 요약 파이프라인 초기화
        self.summarizer = pipeline(
            "summarization",
            model=self.model_name,
            tokenizer=self.model_name,
        )

    def analyze(self, article_content, article_headline=""):
        # 기사 내용으로 요약 파이프라인 호출
        summary_outputs = self.summarizer(
            article_content,
            max_length=300,
            min_length=30,
            do_sample=False
        )
        # 파이프라인 출력에서 요약 텍스트 추출
        summary = summary_outputs[0]["summary_text"]
        return { "summary": summary }


# 감정 분석을 위한 전문가 클래스 정의
class SentimentAnalysisLLMExpert:
    def __init__(self, model_name=SENTIMENT_MODEL):
        self.model_name = model_name
        self.sentiment_analyzer = None

        # 감정 분석 파이프라인 초기화
        self.sentiment_analyzer = pipeline(
            "sentiment-analysis",
            model=self.model_name,
            tokenizer=self.model_name, 
        )


    def analyze(self, article_content, article_headline=""):
        # 감정 분석용 최대 토큰 수 정의
        max_chars_for_sentiment = 2000
        # 최대 한도를 초과할 경우 콘텐츠 잘라내기
        truncated_content = article_content[:max_chars_for_sentiment]
        # 감정 분석 파이프라인 호출
        sentiment_outputs = self.sentiment_analyzer(truncated_content)
        # 감정 레이블 추출
        label = sentiment_outputs[0]["label"]
        # 감정 점수 추출
        score = sentiment_outputs[0]["score"]
        return { "sentiment_label": label, "sentiment_score": score }


# 게이트 네트워크 정의
def route_to_experts(item_data, experts_registry):
    chosen_experts = []
    # 요약기 및 감정 분석기 선택
    chosen_experts.append(experts_registry["summarizer"])
    chosen_experts.append(experts_registry["sentiment_analyzer"])
    return chosen_experts


# 오케스트레이션 프로세스 관리 메인 함수
def process_news_json_with_moe(json_filepath):
    # JSON 파일에서 뉴스 항목 열기 및 로드
    with open(json_filepath, "r", encoding="utf-8") as f:
        news_items = json.load(f)

    # 전문가 클래스 인스턴스를 저장할 사전 생성
    experts_registry = {
        "summarizer": NewsSummarizationLLMExpert(),
        "sentiment_analyzer": SentimentAnalysisLLMExpert()
    }

    # 분석 결과를 저장할 리스트
    all_results = []

    # 로드된 데이터의 각 뉴스 항목을 반복 처리
    for i, news_item in enumerate(news_items):
        print(f"n--- 기사 {i+1}/{len(news_items)} 처리 중 ---")
        # 뉴스 항목에서 관련 데이터 추출
        id = news_item.get("id")
        headline = news_item.get("headline")
        content = news_item.get("content")
        url = news_item.get("url")

        # 진행 상황 출력
        print(f"ID: {id}, 헤드라인: {headline[:70]}...")

        # 게이트 네트워크를 사용하여 사용할 전문가를 결정
        active_experts = route_to_experts(news_item, experts_registry)

        # 분석 결과를 저장할 사전 준비
        news_item_analysis_results = {
            "id": id,
            "headline": headline,
            "url": url,
            "analyses": {}
        }

        # 전문가들을 순회하며 분석 적용
        for expert_instance in active_experts:
            expert_name = expert_instance.__class__.__name__ # 전문가 클래스 이름 획득
            try:
                # 전문가의 analyze 메서드 호출
                analysis_result = expert_instance.analyze(article_content=content, article_headline=headline)
                # 결과를 전문가 이름 아래 저장
                news_item_analysis_results["analyses"][expert_name] = analysis_result

            except Exception as e:
                # 특정 전문가 분석 중 발생한 오류 처리
                print(f"{expert_name} 분석 중 오류: {e}")
                news_item_analysis_results["analyses"][expert_name] = { "error": str(e) }

        # 현재 항목의 결과를 전체 목록에 추가
        all_results.append(news_item_analysis_results)

    return all_results

# 입력 JSON 파일로 메인 처리 함수 호출
final_analyses = process_news_json_with_moe(JSON_FILE)

print("nn--- MoE 분석 완료 ---")

# 최종 분석 결과를 새 JSON 파일에 기록
with open("analyzed_news_data.json", "w", encoding="utf-8") as f_out:
    json.dump(final_analyses, f_out, indent=4, ensure_ascii=False)

훌륭합니다! 약 130줄의 코드로 첫 번째 MoE 프로젝트를 완료했습니다.

다음 명령어로 코드를 실행하세요:

python moe_analysis.py

터미널 출력에는 다음 내용이 포함되어야 합니다:

# 간략화를 위해 생략...

--- 6/10번째 기사 처리 중 ---
ID: cdrgdm4ye53o, 헤드라인: 일본 그랑프리: 루이스 해밀턴, '100% 확신' 표명...

--- 기사 7/10 처리 중 ---
ID: czed4jk7eeeo, 헤드라인: F1 엔진: V10 복귀 또는 하이브리드 - 미래는?...
NewsSummarizationLLMExpert 분석 중 오류: self에서 인덱스 범위를 벗어남

--- 기사 8/10 처리 중 ---
ID: cy700xne614o, 헤드라인: 몬테카를로 마스터스: 노박 조코비치, 100번째 타이틀 도전 중 패배...
NewsSummarizationLLMExpert 분석 중 오류: self에서 인덱스 범위를 벗어남

# 간결함을 위해 생략...

--- MoE 분석 완료 ---

실행이 완료되면 프로젝트 폴더에 analyzed_news_data.json 출력 파일이 생성됩니다. 파일을 열고 뉴스 항목 중 하나를 선택하세요. analyses 필드에는 두 전문가 모델이 생성한 요약 및 감정 분석 결과가 포함됩니다:

The result of the MoE approach in the JSON file

보시다시피, MoE 접근법은:

  • 기사의 내용을 요약하여 summary 항목에 보고했습니다.
  • 0.99 신뢰도로 긍정적 감정을 정의했습니다.

미션 완료!

결론

이 글에서는 단계별 섹션을 통해 MoE와 실제 시나리오에서 이를 구현하는 방법을 배웠습니다.

더 많은 MoE 시나리오를 탐색하고 이를 위해 새로운 데이터가 필요하다면, Bright Data는 스크래핑 장애물을 극복하면서 웹 페이지에서 업데이트된 실시간 데이터를 검색하도록 설계된 강력한 도구 및 서비스 제품군을 제공합니다.

이러한 솔루션에는 다음이 포함됩니다.

  • 웹 언락커(Web Unlocker): 스크래핑 방어 기능을 우회하고 최소한의 노력으로 모든 웹 페이지에서 깨끗한 HTML을 제공하는 API입니다.
  • Scraping Browser: 자바스크립트 렌더링이 가능한 클라우드 기반 제어형 브라우저입니다. CAPTCHA, 브라우저 지문 인식, 재시도 등을 자동으로 처리합니다.
  • 웹 스크레이퍼 API: 수십 개의 인기 도메인에서 구조화된 웹 데이터에 프로그래매틱하게 접근할 수 있는 엔드포인트입니다.

기타 머신러닝 시나리오를 위해 AI 허브도 살펴보세요.

지금 Bright Data에 가입하고 무료 체험을 시작하여 스크래핑 솔루션을 테스트해 보세요!