본문으로 건너뛰기

Advancing the Lightweight Model-Based Scenario Detection Agent

· 약 9분
Seongwoo Kong
Seongwoo Kong
AI Specialist
Jisu Kang
Jisu Kang
AI Specialist
Keewon Jeong
Keewon Jeong
Solution Architect

Detection과 Exception을 분리해 알람 품질을 끌어올린 실전 아키텍처

CCTV 안전 모니터링, 왜 2-Step Inference가 답이었나
사고는 놓치지 않되, 쓸데없는 알람은 줄이기.

리소스 효율성과 실시간 응답성을 고려하여, Qwen2.5-32B 대신 더 가벼우면서도 경쟁력 있는 모델 아키텍처로 전환하고 2-Step Inference 방식을 도입하였습니다. EVA Beta Test시, Qwen3 8B 모델은 Qwen2.5 32B 모델보다 전반적인 추론 능력은 더 뛰어났지만, 한 번에 여러 가지 답변을 일관성 있게 생성하는 데에는 어려움이 있었고, 사용자 언어에 맞춰 alert response를 출력하는 태스크에서도 한계를 보였습니다.

예를 들어, 실제로는 alert가 True인 상황인데도, 모델이 생성한 alert response에서는 마치 alert가 False인 경우처럼 서술하는 식의 모순이 발생하곤 했습니다. 저희는 이런 식의 long-context inference에 한계가 있는 8B 모델을 더 효과적으로 활용하기 위한 방법으로 2-Step Inference를 설계했습니다.

따라서 본 포스트는 2-Step Inference 아키텍처에 초점을 맞추어, 기존 1-Step Inference의 한계2-Step Inference로 Detection과 Exception 판단을 분리했을 때 precision / recall 트레이드오프가 어떻게 변화했는지를 중심으로 정리했습니다.




1. 1-step inference : 한 번에 모든 Output 생성의 구조적 한계

초기 시스템은 다음을 하나의 이미지 / 하나의 응답으로 처리하는 1-step 구조를 사용했습니다.

Output 응답 예시)

  • 사람이 쓰러져 있는가? True (Detection)
  • 이건 예외 상황(예: 폰만 보고 누워 있음)이 아닌가? True (Exception)
  • 최종적으로 알람을 보낼 것인가? True (Alert)

겉으로 보기에는 단순하고 좋아 보이지만, 실제 운영에서는 치명적인 문제가 있었습니다.

  • VLM의 환각 문제

    • Exception은 alert가 True인 경우, 정말로 알람을 울릴지 최종적으로 판별하기 위한 장치이므로, Exception 항목 중 하나라도 True라면 최종 alert는 False가 되는 것이 올바른 동작입니다.
    • 그러나 Detection, Exception, Alert를 한 번에 출력하는 1-step 구조 특성상, VLM의 환각(hallucination)이 발생하여 이러한 논리를 어기는 응답이 종종 나타나는 문제가 있었습니다.
    • 즉, Detection / Exception / Alert를 한 번에 판단하면, 모델은 보통 Detection 결론에 맞춰 직관적으로 알람 여부를 정리해버립니다.
    • 결국 예외는 JSON에 존재는 하지만, 실제로는 거의 활용되지 않는 형식적인 장식에 가까운 상태가 됐습니다.

이건 단순 구현 문제라기보다는, 한 모델 호출에서 모든 판단을 동시에 하려는 설계 자체의 한계에 가깝습니다.




2. 2-Step Inference: Detection과 Exception의 역할 분리

VLM 환각 문제를 해결하기 위해 구조를 다음과 같이 업데이트 하였습니다.



전체 파이프라인은 크게 다음 4단계로 구성됩니다.

  1. 입력 정규화: User Scenario → Enriched Input
  2. 1단계 Detection 전용 VLM 추론
  3. 2단계 Exception 전용 VLM 추론
  4. 알람 Aggregation 및 한국어 Alert 메시지 생성

위의 흐름을 통해 무엇을 기준으로 알람을 울렸는지/막았는지를 기록할 수 있는 시각 알람 로직을 구현했습니다.

좀 더 직관적으로 로직을 표현하면, 아래와 같습니다.

이미지 → [Detection VLM] → (조건 불충족) → 정상 종료
└→ (조건 충족) → [Exception VLM] → (예외 True) → 알람 억제
└→ (예외 False) → 알람 발행



3. 2-Step Inference 설계 디테일

3.1 Detection 단계: 조건만 확인

Detection 프롬프트의 핵심은 사고 조건을 충족하는지 여부만 본다는 것입니다. 즉, 의도적으로 Exception을 detection step 판별 시 고려하지 않으며, Detection step은 단순히 사고 후보 샘플 필터 역할만 수행하는 것이 포인트입니다.

  • 입력 예시
    • 이미지
    • 시나리오별 detection_steps (Enriched Input에서 파생)
  • 출력 예시
    • {"사람이 존재함": true, "최소 한 명 이상의 사람이 쓰러져 있음": true }
  • 규칙
    • 하나라도 false곧바로 알람 없음
    • 모두 true일 때만 Exception 단계로 전달

3.2 Exception 단계: 전역 예외만 확인

Exception 프롬프트는 반대로, 전역 조건(global exception) 위주로 설계했습니다.

  • 입력
    • 이미지
    • 해당 시나리오의 exceptions
  • 출력 (마스크 예시)
    • {"모든 사람이 마스크를 착용한 경우": false, "카메라 각도로 인해 모든 사람의 마스크 착용 여부를 확인할 수 없는 경우": false}
  • 정책
    • 어느 하나라도 true면 → 정상 상황으로 보고 알람 억제
    • 모두 false면 → 최종 알람 발행

여기서 v2.2.5 설계의 중요한 포인트는 예외 항목에 모든(all, every, 모든)을 명시적으로 넣어 전역 조건이라는 점을 강하게 강조했다는 것입니다.

  • 예:
    • 쓰러져 있는 사람은 모두 휴대폰을 보고 있는 경우
    • 모든 사람이 마스크를 착용한 경우

이렇게 정의하면, 예외가 특정 사람 하나의 상태가 아니라 전체 장면에 대한 필터로 작동해 실제 운영에서 false positive를 안정적으로 줄이는 데 기여했습니다.




4. 정량 결과: 1-step → 2-step으로 바꾸면 실제로 뭐가 달라지나?

4.1 쓰러짐 탐지

구성accuracyprecisionrecall
Qwen 3 8B + Enriched + 1-step0.990.870.97
Qwen 3 8B + Enriched + 2-step0.990.990.91

핵심 관찰:

2-step 적용 시, precision이 0.87 → 0.99로 크게 향상되어 오탐(false positive)을 크게 줄일 수 있습니다.
반면 recall은 0.97 → 0.91로 감소해 실제 쓰러짐 일부가 탐지되지 않을 위험이 다소 증가되었습니다.
두 구성 모두 accuracy는 0.99로 동일하여 전체적인 분류 성능은 유지되며, 운영 환경에 따라 precision vs. recall 트레이드오프를 고려한 선택이 필요하다.


4.2 마스크 미착용 탐지

구성accuracyprecisionrecall
Qwen 3 8B + Enriched + 1-step0.590.730.52
Qwen 3 8B + Enriched + 2-step0.610.700.63

핵심 관찰:

자연어 규칙을 그대로 쓰면, 모델은 조금이라도 애매하면 알람으로 치는 방향으로 움직여 recall 1.0에 근접하지만 recall 이 0.5 수준으로 떨어집니다.
반면, Detection / Exception을 명확히 분리한 2-step + 구조화 입력(Enriched v2.2.5)을 쓰면 recall이 향상되는 결과를 얻을 수 있습니다.


4.3 기타(방화, 버스 탐지 등)  

구성accuracyprecisionrecall
Qwen 3 8B + Enriched + 1-step0.600.630.53
Qwen 3 8B + Enriched + 2-step0.610.700.63

핵심 관찰:

자연어 규칙 → Detection steps + Exception으로 구조화하고 2-step으로 돌리기만 해도, precision/recall 커브 전체가 오른쪽 위로 이동하는 것을 확인할 수 있습니다.




5. Detection Evidence를 Exception에 넘겼을 때 생긴 Bias

실험 중에 가장 흥미로운 포인트 중 하나가 바로 evidence 재사용입니다.

5.1 실험 설정

Detection 단계에서 생성한 detection_evidence를 Exception 프롬프트에 그대로 넣어 주는 버전을 테스트했습니다.

detection_evidence = "사진에는 한 명의 사람이 존재하며, 그 사람은 마스크를 착용하고 있지 않습니다." exception_evidence = detection_evidence 와 거의 동일한 서술


5.2 관찰된 현상

Detection에서 마스크 미착용을 강하게 주장하는 evidence가 들어가면 Exception은 모든 사람이 마스크를 착용한 경우자동으로 False로 처리하는 방향으로 bias가 생겼습니다. 즉, Exception이 독립적인 판단을 하기보다, Detection 결론을 재검토하지 않고 그대로 따르는 경향이 강해졌습니다.

이건 구조적으로 보면 **레이블 누수(label leakage) + 확인 편향(confirmation bias)**에 가깝습니다.

LLM 분야에서도, 한 번 내려진 결론과 그에 대한 이유 텍스트를 다음 단계에 함께 넘기면 후속 단계가 기존 결론을 비판적으로 검토하기보다, 이를 전제로 합리화(rationalization)를 하는 경향이 있다는 관찰이 많이 보고됩니다. (MDPI)


5.3 결론: Evidence는 부연 설명용으로만

마스크 미착용처럼 카메라 각도·가림·해상도에 민감한 태스크에서는 Exception이 Detection을 견제하는 역할이 매우 중요한데, Detection Evidence를 Evidence 판단에 강하게 주입하면 이 견제 장치가 사실상 무력화되는 것을 확인하였습니다.

따라서 evidence 판단은 Detection step 판단과 최대한 분리하는 것이 전체 성능 측면에서 더 유리하다는 것을 확인할 수 있었습니다.




6. 운영 관점에서 본 2-Step Inference 실무 팁

실제 시스템에 적용하면서 얻은 실무 팁을 정리하면 다음과 같습니다.

6.1 Detection Step에서 의심스러운 정황은 모두 잡기

  • Detection Step은 최소한의 조건 위주로 설계합니다.
  • 쓰러진 것 같지만, 앉아 있는 걸 수도 같은 애매한 상황이면
    • Detection에서는 일단 True로 통과시켜 두고
    • Exception에서 더 정교하게 필터링하는 편이 안전합니다.

6.2 Exception은 전역 조건 + all/every 중심

  • 예외는 되도록 전역 조건(global)으로 정의합니다.

    • 모든 사람이 마스크를 착용한 경우
    • 쓰러져 있는 사람은 모두 휴대폰을 보고 있는 경우
  • 이렇게 해야 예외가 최종 알람을 억제하는 스위치 역할을 안정적으로 수행합니다.


6.3 Evidence는 로깅·설명용

  • Detection / Exception 각 단계에서 생성된 evidence는 운영자·관제센터가 알람 발생 이후 상황을 이해하는 데 도움을 주기 위해 저장되며,ALERT 발생 시 사용자에게 전달하는 알림 메시지 텍스트를 생성하는 데에도 활용됩니다.

6.4 vLLM + Qwen3 조합의 의미

  • vLLM의 PagedAttention·연속 배칭 덕분에 수십~수백 채널 CCTV의 Detection / Exception 호출을 효율적으로 처리할 수 있습니다. (GitHub)
  • Qwen3-VL은 다국어·멀티모달·JSON 출력이 강화되어 한국어 규칙 기반의 안전 모니터링 시나리오에서도 구조화된 Detection / Exception 응답을 안정적으로 반환해 줍니다. (Hugging Face)



7. 마무리: 고정밀 + 실용적인 재현율을 위한 기본 아키텍처

이번 작업을 통해 얻은 핵심 결론을 요약하면:

  1. 2-Step Inference(Detection / Exception 분리)는 선택이 아니라 사실상 필수
    • 쓰러짐, 마스크 미착용 등 주요 시나리오에서 precision을 크게 개선하면서도 실용적인 수준의 recall을 유지할 수 있었습니다.
    • Detection은 사고 누락 최소화, Exception은 오경보 최소화라는 역할 분리가 명확해졌습니다.

  1. 예외는 전역 조건 + all/every로 정의
    • 모든 사람이 마스크를 착용한 경우, 쓰러진 사람이 없는 경우 같은 전역 예외는 실제 운영에서 알람 노이즈를 줄이는 안전장치로 안정적으로 동작했습니다.

  1. Evidence는 설명용, 판단은 각 단계에서 독립적으로
    • Detection evidence를 Exception에 세게 주입하면 Exception이 사실상 작동하지 않는 편향이 생길 수 있음을 확인했습니다.
    • 따라서, Detection과 Exception을 논리적으로 분리하고, Evidence는 주로 설명용/로깅용으로만 사용하는 것이 더 안전한 설계입니다.

  1. 엔진·모델 진화(Qwen2.5 → Qwen3, vLLM 도입)는 구조와 만나야 진가를 발휘
    • Qwen3-VL + vLLM의 조합은 멀티모달 이해력과 고처리량 서빙을 동시에 제공하지만(Hugging Face), 이를 2-step 구조, JSON 스키마 기반 설계와 결합했을 때 비로소 실제 CCTV 안전 모니터링에서 쓰일 수 있는 알람 품질을 구현할 수 있었습니다.



참고 자료

  • vLLM GitHub & 문서 – PagedAttention, continuous batching, 고처리량 서빙 구조 (GitHub)
  • PagedAttention 해설 한국어 블로그 (Pangyoalto Blog)
  • Qwen2.5 / Qwen3 / Qwen3-VL 소개 및 Hugging Face 카드 (Hugging Face)
  • 2-stage / cascade detector에서 false positive 감소 패턴 (MathWorks)
  • LLM 환각(hallucination) 및 단계적 완화 파이프라인에 대한 서베이/연구 (MDPI)