중소기업·소상공인이 자신에게 맞는 정책자금을 쉽게 찾을 수 있도록, 사용자 의도를 분류하고 전문 에이전트로 라우팅하는 LangGraph 기반 멀티 에이전트 시스템을 직접 설계·구현했습니다.
| 항목 | 내용 |
|---|---|
| 프레임워크 | LangGraph (StateGraph) |
| LLM (진단·시뮬레이션) | GPT-4o |
| LLM (라우팅·RAG 답변) | GPT-4o-mini |
| 상태 영속화 | PostgreSQL Checkpointer |
| 대화 단위 | thread_id = ChatRoom.id |
| 장기 기록 | Write-through → ChatLog 테이블 즉시 기록 |
Guard 로직: 진단 리포트 없이 시뮬레이터가 실행되면 자동으로
hard_filter로 리다이렉트해 진단을 먼저 수행한 뒤 복귀합니다. 사용자가 순서를 잘못 입력해도 시스템이 스스로 올바른 흐름을 찾아갑니다.
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
왜 이렇게 만들었나
사용자 질문은 "지원금 받을 수 있나요?"처럼 모호한 경우가 많습니다. 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 |
동종업계 통계 비교 | "같은 업종 평균 매출은?" |
왜 이렇게 만들었나