M3: 고도화 및 최적화¶
| 항목 | 내용 |
|---|---|
| 기간 | 2026-04-28 -- 2026-05-22 (Week 9--12) |
| 상태 | 부분 완료 (46%) |
| 핵심 목표 | AWQ 양자화 v2, vLLM 서빙, RAG 파이프라인, 에이전트 시스템 |
개요¶
M3 단계에서는 M2 MVP에서 미달했던 핵심 KPI를 대폭 개선했다. vLLM 0.17.0 도입으로 추론 속도를 9.29초에서 2.43초로 단축하고, 분류 정확도를 2%에서 90%로 끌어올렸다. 또한 FAISS 기반 RAG 파이프라인과 멀티턴 에이전트 시스템 아키텍처를 설계하여 시스템의 기능을 확장하고 있다.
M2 대비 KPI 개선 현황¶
| 지표 | M2 MVP | M3 최적화 후 | 개선폭 | 목표 | 달성 |
|---|---|---|---|---|---|
| 분류 정확도 | 2.00% | 90.0% | +88.0%p | >= 85% | 달성 |
| 추론 속도 (Avg) | 9.291s | 2.43s | -6.86s | < 2s | 근접 |
| BERTScore F1 | -- | 46.05 | 신규 확보 | 베이스라인 | 달성 |
| GPU VRAM | 4.95GB | 4.17GB | -0.78GB | < 8GB | 달성 |
AWQ v2 + vLLM KPI 평가 (1,265건)¶
M3에서 AWQ v2 모델(umyunsang/GovOn-EXAONE-AWQ-v2)을 vLLM으로 서빙한 종합 평가 결과이다. 8개 민원 카테고리, 1,265건의 테스트 데이터셋을 대상으로 평가했다.
레이턴시 성능¶
| 항목 | 측정값 | 목표 | 판정 |
|---|---|---|---|
| 답변 생성 p50 | 1.56s | -- | -- |
| 답변 생성 p95 | 2.85s | < 3.0s | PASS |
| 검색 p50 | 23.08ms | -- | -- |
| 검색 p95 | 39.76ms | < 1,000ms | PASS |
| Throughput | 178.4 tok/s | -- | -- |
답변 품질¶
| 항목 | 측정값 | 목표 | 판정 |
|---|---|---|---|
| BERTScore F1 | 71.04 | >= 55 | PASS |
| SacreBLEU | 7.74 | >= 30 | 미달 |
| ROUGE-L F1 | 18.76 | >= 40 | 미달 |
| EOS 정상 종료율 | 88.6% | >= 80% | PASS |
리소스 사용¶
| 항목 | 측정값 | 목표 | 비고 |
|---|---|---|---|
| VRAM 사용량 | 29.41GB | <= 5.0GB | KV 캐시 + vLLM 런타임 오버헤드 포함, A100 40GB 기준 |
VRAM 목표 미달 설명
VRAM 5GB 목표는 모델 가중치만의 크기 기준이다. vLLM 런타임에서 KV 캐시, CUDA Graph, 토크나이저 등 추가 메모리를 사용하므로 실제 서빙 시 A100 40GB급 이상이 필요하다.
vLLM 엔진 설정¶
| 파라미터 | 값 | 설명 |
|---|---|---|
max_model_len |
2,048 | 최대 시퀀스 길이 |
gpu_memory_utilization |
0.60 | GPU 메모리 활용률 |
enforce_eager |
False | CUDA Graph 활성화 |
repetition_penalty |
1.1 | 반복 억제 |
| 양자화 커널 | awq_marlin |
Ampere+ 최적화 GEMM |
W&B 리포트: m3-exaone-vllm-final-success
에이전트 시스템 아키텍처¶
M3에서 설계한 멀티턴 대화형 Agent 시스템은 공무원이 AI와 자연어로 대화하며 민원 분류, 유사 사례 검색, 답변 초안 생성을 처리하는 구조이다.
Agent Loop 동작 흐름¶
User Input --> Session Load --> RAG Search
|
v
Response <-- LLM Generate <-- Prompt Build
|
v
Save to DB --> Wait for next input
Agent의 핵심 역할¶
| 역할 | 설명 |
|---|---|
| 민원 분류 | 민원 본문을 입력받아 카테고리를 자동 분류 |
| 유사 사례 검색 | FAISS 벡터 검색으로 유사 민원 Top-K건 검색 |
| 답변 초안 생성 | RAG 컨텍스트 기반 표준 답변 초안 생성 |
| 대화형 수정 | 멀티턴 대화를 통한 답변 수정 및 정제 |
| 감사 로그 | 모든 대화 이력을 DB에 저장 (추적성 확보) |
기존 API 대비 Agent 확장¶
| 구성요소 | 기존 (단일 턴) | Agent 확장 |
|---|---|---|
| API 서버 | FastAPI + vLLM | 멀티턴 대화 루프 + WebSocket |
| 프롬프트 | 정적 EXAONE Chat Template | 동적 멀티턴 프롬프트 빌더 |
| 세션 관리 | 없음 (Stateless) | DB 기반 세션 + 대화 이력 |
| RAG | FAISS 검색 (단일 쿼리) | 대화 문맥 기반 동적 검색 |
| Frontend | 없음 (API 전용) | 에이전트 사이드바 UI |
RAG 파이프라인¶
설계 구조¶
FAISS IndexFlatIP 기반의 벡터 검색과 BM25를 결합한 하이브리드 검색을 구현한다.
| 구성요소 | 기술 | 역할 |
|---|---|---|
| 임베딩 모델 | multilingual-e5-large (dim=1024) | 민원 텍스트 벡터화 |
| 벡터 인덱스 | FAISS IndexFlatIP | 의미 기반 유사도 검색 |
| 인덱스 관리 | MultiIndexManager | CASE/LAW/MANUAL/NOTICE 4종 인덱스 관리 |
| 하이브리드 검색 | FAISS + BM25 | 의미 검색 + 키워드 검색 결합 |
검색 쿼리 형식¶
임베딩 모델 사용 시 query: prefix가 필수이다.
query_text = "query: 보도블록 파손으로 인한 안전 문제 민원"
기술적 이슈 및 해결¶
1. vLLM 토크나이저 충돌¶
증상: ExaoneTokenizer 클래스 인식 오류
해결: PreTrainedTokenizerFast 강제 매핑 및 로컬 설정 패치
2. 구조적 NoneType 에러¶
증상: transformers 버전 업데이트로 rope_parameters 및 get_interface 누락
해결: 로컬 소스 하드 패치 및 런타임 인젝션 (vllm_stabilizer.py)
3. 분류 정확도 90% 달성¶
방법: <thought> 태그 완벽 분리 파서 + add_generation_prompt=True 적용으로 모델의 추론 능력을 극대화
산출물 체크리스트¶
| 산출물 | 상태 |
|---|---|
| vLLM 0.17.0 서버 구축 및 검증 | 완료 |
vllm_stabilizer.py (EXAONE용 런타임 패치) |
완료 |
M3 최종 평가 스크립트 (evaluate_m3_vllm_final.py) |
완료 |
M3 완료 리포트 (FINAL_M3_COMPLETION_REPORT.md) |
완료 |
| W&B KPI 평가 보고서 | 완료 |
| Agent 아키텍처 ADR | 완료 |
| FAISS 벡터 검색 시스템 | 구현 중 |
| RAG 파이프라인 | 구현 중 |
| FastAPI 백엔드 서버 | 구현 중 |
| Docker 컨테이너화 | 예정 |
| Figma MCP 기반 프론트엔드 | 예정 |
관련 GitHub 이력¶
| PR / Issue | 내용 |
|---|---|
| PR #24 | M2 MVP Final Report & M3 Optimization Complete |
| Issue #20 | 추론 속도 개선: vLLM 배포로 p50 < 2초 달성 |
| Issue #21 | 민원 분류 정확도 평가 방법론 개선 |
| Issue #27 | RAG 통합, FAISS 벡터 검색 및 전용 분류기 구축 |
| Issue #67 | QLoRA 하이퍼파라미터 최적화 |
| Issue #68 | 답변 생성 품질 고도화 |
| Issue #69 | 추론 속도 추가 최적화 |
| Issue #128 | Agent 시스템 아키텍처 설계 |
고도화 의존성 흐름¶
#70 데이터 증강 ---+
+--> #67 QLoRA HP 최적화 --> #68 답변 품질 고도화
| |
#54 RAG 파이프라인 -+--------------------------------+
|
#69 추론 속도 최적화 <------------------------------+