본문 바로가기

AI

[AI Study] Multi-Agent 시스템 구축하기

[AI Study] Multi-Agent 시스템 구축하기

여러 AI Agent가 협력하여 복잡한 문제를 해결하는 시스템 만들기


🎯 만들 것

"Multi-Agent 고객 지원 시스템"

기능:

  1. 자동 문의 분류 (기술/결제/일반)
  2. 전문 분야별 Agent 자동 배정
  3. 각 Agent가 전문 지식으로 답변
  4. 최종 품질 관리 및 답변 정리
  5. 투명한 처리 과정 표시

🛠️ 기술 스택

  • Python 3.11+
  • LangChain - AI 워크플로우 프레임워크
  • OpenAI API - GPT-4o-mini
  • 객체지향 설계 - Agent 클래스 분리

💡 Multi-Agent란?

하나의 Agent vs 여러 Agent:

구분 단일 Agent Multi-Agent
역할 모든 일 처리 역할 분담
전문성 평균적 높음
확장성 어려움 쉬움
유지보수 복잡 간단

 

Multi-Agent 처리 흐름:

고객 질문
    ↓
[접수 Agent] - "어떤 유형의 문의인가?"
    ↓
┌───────┼───────┐
│       │       │
🔧      💳      📞
기술    결제    일반
│       │       │
└───────┼───────┘
    ↓
[관리 Agent] - "답변 정리 및 품질 검토"
    ↓
최종 답변

📦 Step 1. 패키지 설치

1-1 가상환경 활성화

source venv/bin/activate

 

1-2 패키지 설치

pip install langchain langchain-openai python-dotenv

📂 Step 2. 프로젝트 구조

agent/
└── multi_agent/
    ├── __init__.py
    ├── main.py              # 실행 파일
    ├── system.py            # 전체 시스템
    └── agents/
        ├── __init__.py
        ├── classifier.py    # 분류 Agent
        ├── technical.py     # 기술 Agent
        ├── payment.py       # 결제 Agent
        ├── general.py       # 일반 Agent
        └── supervisor.py    # 관리 Agent

💻 Step 3. Agent 구현

3-1. 분류 Agent (agents/classifier.py)

"""접수 Agent - 고객 문의 분류"""
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage


class ClassifierAgent:
    """고객 문의를 카테고리별로 분류하는 Agent"""
    
    CATEGORIES = ['technical', 'payment', 'general']
    
    CATEGORY_NAMES = {
        'technical': '기술 지원',
        'payment': '결제/환불',
        'general': '일반 문의'
    }
    
    def __init__(self, llm: ChatOpenAI):
        self.llm = llm
        self.prompt = """당신은 고객 문의 분류 전문가입니다.

다음 카테고리 중 하나로 정확하게 분류하세요:

1. technical - 기술 문제
   예: 앱이 안 켜져요, 오류가 나요, 로그인이 안 돼요
   
2. payment - 결제/환불 문제
   예: 환불 받고 싶어요, 결제가 안 돼요, 요금제 변경
   
3. general - 일반 문의
   예: 영업시간, 사용법, 서비스 소개

분류 결과만 답하세요: technical, payment, general 중 정확히 하나만"""
    
    def classify(self, question: str) -> str:
        """문의를 분류합니다."""
        response = self.llm.invoke([
            SystemMessage(content=self.prompt),
            HumanMessage(content=f"고객 질문: {question}")
        ])
        
        category = response.content.strip().lower()
        
        # 유효성 검사
        if category not in self.CATEGORIES:
            category = 'general'
        
        return category
    
    def get_category_name(self, category: str) -> str:
        """카테고리의 한글 이름을 반환합니다."""
        return self.CATEGORY_NAMES.get(category, category)

 

3-2. 기술 Agent (agents/technical.py)

"""기술 Agent - 기술 문제 해결"""
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage


class TechnicalAgent:
    """기술 문제를 해결하는 전문 Agent"""
    
    def __init__(self, llm: ChatOpenAI):
        self.llm = llm
        self.prompt = """당신은 기술 지원 전문가입니다.

고객의 기술 문제를 친절하고 명확하게 해결하세요:

1. 문제 상황 파악 및 공감
2. 가능한 원인 분석
3. 해결 방법을 단계별로 제시
   - 쉬운 방법부터
   - 각 단계를 명확하게
4. 해결 안 되면 추가 지원 안내

답변 형식:
- 친절한 톤
- 전문 용어는 쉽게 설명
- 단계별 번호 사용"""
    
    def solve(self, question: str) -> str:
        """기술 문제를 해결합니다."""
        response = self.llm.invoke([
            SystemMessage(content=self.prompt),
            HumanMessage(content=question)
        ])
        
        return response.content

 

3-3. 관리 Agent (agents/supervisor.py)

"""관리 Agent - 최종 답변 정리 및 품질 관리"""
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage


class SupervisorAgent:
    """전문가 답변을 검토하고 최종 정리하는 Agent"""
    
    def __init__(self, llm: ChatOpenAI):
        self.llm = llm
        self.prompt = """당신은 고객 서비스 관리자입니다.

전문가의 답변을 검토하고 최종 정리하세요:

1. 인사말로 시작
2. 핵심 내용을 간결하게 요약
3. 전문가 답변의 주요 포인트 강조
4. 추가 도움 제안
5. 따뜻한 마무리

품질 기준:
- 명확하고 이해하기 쉽게
- 고객 만족도 최우선
- 전문적이면서도 친근하게
- 불필요한 내용 제거"""
    
    def review(self, question: str, specialist_response: str, category: str) -> str:
        """전문가 답변을 검토하고 최종 답변을 작성합니다."""
        response = self.llm.invoke([
            SystemMessage(content=self.prompt),
            HumanMessage(content=f"""
원래 질문: {question}
문의 유형: {category}
전문가 답변:
{specialist_response}

위 내용을 바탕으로 고품질의 최종 답변을 작성해주세요.
""")
        ])
        
        return response.content

🎮 Step 4. 시스템 통합 (system.py)

"""Multi-Agent 고객 지원 시스템"""
from langchain_openai import ChatOpenAI
import os
from dotenv import load_dotenv

from agents.classifier import ClassifierAgent
from agents.technical import TechnicalAgent
from agents.payment import PaymentAgent
from agents.general import GeneralAgent
from agents.supervisor import SupervisorAgent

load_dotenv()


class CustomerSupportSystem:
    """멀티 에이전트 고객 지원 시스템"""
    
    def __init__(self):
        # LLM 초기화 (모든 Agent가 공유)
        self.llm = ChatOpenAI(
            model="gpt-4o-mini",
            api_key=os.getenv("OPENAI_API_KEY"),
            temperature=0
        )
        
        # 각 Agent 초기화
        self.classifier = ClassifierAgent(self.llm)
        self.technical_agent = TechnicalAgent(self.llm)
        self.payment_agent = PaymentAgent(self.llm)
        self.general_agent = GeneralAgent(self.llm)
        self.supervisor = SupervisorAgent(self.llm)
        
        print("✅ Multi-Agent 시스템 초기화 완료!")
    
    def process(self, question: str) -> dict:
        """고객 질문을 Multi-Agent 시스템으로 처리합니다."""
        
        print("\n" + "="*70)
        print(f"👤 고객 질문: {question}")
        print("="*70)
        
        # Step 1: 분류
        print("\n🏢 Step 1: 접수 Agent - 문의 분류 중...")
        category = self.classifier.classify(question)
        category_name = self.classifier.get_category_name(category)
        print(f"   ✅ 분류 완료: [{category_name}]")
        
        # Step 2: 전문 Agent 처리
        print(f"\n🔧 Step 2: 전문 Agent - {category_name} 처리 중...")
        
        if category == "technical":
            specialist_response = self.technical_agent.solve(question)
            agent_icon = "🔧"
        elif category == "payment":
            specialist_response = self.payment_agent.solve(question)
            agent_icon = "💳"
        else:
            specialist_response = self.general_agent.solve(question)
            agent_icon = "📞"
        
        print(f"   ✅ {agent_icon} 전문가 답변 완료")
        
        # Step 3: 최종 정리
        print(f"\n👔 Step 3: 관리 Agent - 최종 답변 정리 및 품질 검토 중...")
        final_response = self.supervisor.review(question, specialist_response, category)
        print(f"   ✅ 최종 답변 완성!")
        
        # 최종 결과 출력
        print("\n" + "="*70)
        print("💬 최종 답변:")
        print("="*70)
        print(final_response)
        print("="*70)
        
        return {
            'question': question,
            'category': category,
            'specialist_response': specialist_response,
            'final_response': final_response
        }

🚀 Step 5. 실행 및 테스트

5-1 프로그램 실행

python agent/multi_agent/main.py

 

5-2 예제 테스트

기술 문의 테스트:

============================================================
👥 Multi-Agent 고객 지원 시스템
============================================================

질문: 앱이 자꾸 꺼져요

======================================================================
👤 고객 질문: 앱이 자꾸 꺼져요
======================================================================

🏢 Step 1: 접수 Agent - 문의 분류 중...
   ✅ 분류 완료: [기술 지원]

🔧 Step 2: 전문 Agent - 기술 지원 처리 중...
   ✅ 🔧 전문가 답변 완료

👔 Step 3: 관리 Agent - 최종 답변 정리 및 품질 검토 중...
   ✅ 최종 답변 완성!

======================================================================
💬 최종 답변:
======================================================================
안녕하세요! 앱이 계속 종료되는 문제로 불편을 드려 죄송합니다.

다음 방법을 순서대로 시도해보세요:

1. 앱 완전 종료 후 재시작
2. 캐시 데이터 삭제 (설정 > 앱 > 저장공간 > 캐시 삭제)
3. 앱 업데이트 확인 (최신 버전 설치)
4. 기기 재시작

문제가 계속되면 고객센터(1234-5678)로 연락주세요!
추가 도움이 필요하시면 언제든 문의해주세요. 😊
======================================================================

📊 Multi-Agent의 장점

항목 설명
전문성 각 Agent가 특정 분야에 특화
확장성 새 Agent 추가 쉬움
유지보수 Agent별 독립적 수정 가능
품질 관리 Agent의 최종 검토
투명성 각 단계 과정 표시

🎯 핵심 개념 복습

1. Agent 분리

# 각 Agent = 하나의 클래스
ClassifierAgent  - 분류 전문
TechnicalAgent   - 기술 전문
PaymentAgent     - 결제 전문
SupervisorAgent  - 품질 관리

→ 역할 분담으로 전문성 향상

 

2. 파이프라인 구조

질문 → 분류 → 처리 → 검토 → 답변

→ 단계별 처리로 품질 보장

 

3. LLM 공유

self.llm = ChatOpenAI(...)  # 하나만 생성
classifier = ClassifierAgent(self.llm)  # 공유
technical = TechnicalAgent(self.llm)    # 공유

→ 자원 효율적 사용


✅ 완료 체크리스트

  • Multi-Agent 개념 이해
  • Agent별 클래스 분리
  • 분류 Agent 구현
  • 전문 Agent 구현 (기술/결제/일반)
  • 관리 Agent 구현
  • 시스템 통합
  • 테스트 완료

🚀 다음 단계

다음은 LangGraph를 배웁니다!

LangGraph = 복잡한 워크플로우를 그래프로 관리

Multi-Agent:
- Agent들이 협력
- if문으로 분기

LangGraph:
- 상태 관리 자동화
- 그래프로 흐름 제어
- 반복/조건/병렬 처리

 

반응형