중소기업·소상공인이 자신에게 맞는 정책자금을 쉽게 찾을 수 있도록, 사용자 의도를 분류하고 전문 에이전트로 라우팅하는 LangGraph 기반 멀티 에이전트 시스템을 직접 설계·구현했습니다.


1. 시스템 개요

항목 내용
프레임워크 LangGraph (StateGraph)
LLM (진단·시뮬레이션) GPT-4o
LLM (라우팅·RAG 답변) GPT-4o-mini
상태 영속화 PostgreSQL Checkpointer
대화 단위 thread_id = ChatRoom.id
장기 기록 Write-through → ChatLog 테이블 즉시 기록

2. 전체 그래프 구조

Guard 로직: 진단 리포트 없이 시뮬레이터가 실행되면 자동으로 hard_filter로 리다이렉트해 진단을 먼저 수행한 뒤 복귀합니다. 사용자가 순서를 잘못 입력해도 시스템이 스스로 올바른 흐름을 찾아갑니다.


3. 노드별 상세 설계

flowchart TD
    %% 시작점
    START([<b>START</b><br/>사용자 질문 입력]):::st
    
    %% 라우터 (상담)
    ROUTER{<b>상담 라우터</b><br/>GPT-4o-mini Router}:::rt

    %% 4대 전문 에이전트
    subgraph AGENTS [전문 에이전트 그룹]
        DIAG[<b>정책 진단</b><br/>Diagnosis]:::process
        SIM[<b>시뮬레이터</b><br/>Simulator]:::process
        RAG[<b>정책 Q&A</b><br/>Hybrid RAG]:::process
        STATS[<b>통계 분석</b><br/>Market Stats]:::process
    end

    %% 상세 로직 (진단 파이프라인)
    HF["<b>1차 필터 (hard_filter)</b><br/>지역/업종/규모 룰 필터링"]:::sub_process
    LE["<b>정밀 채점 (llm_evaluator)</b><br/>GPT-4o 기반 수혜 점수 산출"]:::ai

    %% 결과 노드
    END([<b>ANSWER</b><br/>답변 생성 및 로그 저장]):::fi

    %% 흐름 연결
    START --> ROUTER

    %% 라우팅 경로
    ROUTER -- "진단/추천" --> DIAG
    ROUTER -- "사업장 조건 변경" --> SIM
    ROUTER -- "상세 질문" --> RAG
    ROUTER -- "동종업계 비교" --> STATS

    %% 진단 상세 흐름
    DIAG ==> HF
    HF ==> LE
    LE ==>|리포트 생성| END

    %% 시뮬레이션 및 가드 로직
    SIM -->|진단 데이터 확인| CHECK{데이터 존재?}:::decision
    CHECK -- "Yes" --> SIM_RUN[시뮬레이션 가동]:::sub_process
    CHECK -- "No (Guard)" --> HF
    
    SIM_RUN ==> END
    LE -- "연속 실행" --> SIM_RUN

    %% 기타 에이전트 종료
    RAG ==> END
    STATS ==> END

    %% 스타일 설정
    classDef st fill:#f8f9fa,stroke:#333,stroke-width:2px
    classDef fi fill:#f8f9fa,stroke:#333,stroke-width:2px
    classDef rt fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
    classDef process fill:#e3f2fd,stroke:#2196f3,stroke-width:2px
    classDef sub_process fill:#ffffff,stroke:#2196f3,stroke-dasharray: 5 5
    classDef ai fill:#f3e5f5,stroke:#9c27b0,stroke-width:2px
    classDef decision fill:#fff3e0,stroke:#ef6c00,stroke-width:2px

3-1. router — 의도 분류

왜 이렇게 만들었나

사용자 질문은 "지원금 받을 수 있나요?"처럼 모호한 경우가 많습니다. LLM 한 번으로 분류하되, 실패 시 키워드 매칭으로 폴백해 안정성을 확보했습니다.

2단계 폴백 구조:

flowchart TD
    %% 노드 정의 (한글화)
    IN([<b>사용자 메시지 입력</b>]):::input
    
    STEP1{<b>1단계</b><br/>AI 의도 분석}:::ai
    STEP2{<b>2단계</b><br/>키워드 매칭}:::process
    
    CONFIRM{<b>최종 결정</b><br/>의도 확정}:::decision
    DEFAULT[<b>기본값</b><br/>정책 진단]:::fallback

    %% 흐름 연결
    IN --> STEP1
    
    STEP1 -- "분류 성공" --> CONFIRM
    STEP1 -- "분류 실패" --> STEP2
    
    STEP2 -- "키워드 일치" --> CONFIRM
    STEP2 -- "일치 없음" --> DEFAULT
    
    DEFAULT --> CONFIRM

    %% 디자인 설정 (노션 최적화)
    classDef input fill:#ffffff,stroke:#333,stroke-width:2px
    classDef ai fill:#f3e5f5,stroke:#9c27b0,stroke-width:2px,color:#4a148c
    classDef process fill:#e3f2fd,stroke:#2196f3,stroke-width:2px,color:#0d47a1
    classDef decision fill:#e8f5e9,stroke:#2d6a4f,stroke-width:2px,color:#1b4332
    classDef fallback fill:#fff3e0,stroke:#ef6c00,stroke-width:2px,stroke-dasharray: 5 5,color:#e65100

의도 분류 기준:

의도 설명 예시 질문
diagnosis 받을 수 있는 정책 진단·추천 "어떤 지원금 받을 수 있나요?"
simulator 조건 변경 시 시뮬레이션 "직원 늘리면 어떻게 돼요?"
rag 특정 정책에 대한 질의응답 "청년 창업 패키지가 뭔가요?"
stats 동종업계 통계 비교 "같은 업종 평균 매출은?"

3-2. hard_filter — 1차 룰 기반 필터

왜 이렇게 만들었나