How We Built a 2ms Real-Time AI Inference Pipeline in .NET (By Abandoning Generative AI)

개요

.NET 환경에서 50,000명 이상의 동시 접속자를 관리하는 실시간 디스코드 채팅 환경의 병목 현상을 해결하기 위해, 생성형 AI를 포기하고 $O(1)$ 상수 시간 실행 및 제로 할당 메모리에 기반한 네이티브 .NET 모더레이션 파이프라인을 구축했습니다.

주요 내용

  • 표준 봇의 한계: 기존 봇은 대량의 문자열 객체 할당과 느린 정규식(Regex) 필터링으로 인해 실시간 채팅 처리 시 충돌을 일으키고, Regular Expression Denial of Service (ReDoS) 및 Scunthorpe 문제에 취약합니다. 또한, 외부 생성형 AI 사용은 높은 지연 시간, 환각(hallucination), 데이터 로깅 등의 문제를 야기합니다.
  • $O(1)$ 메모리 관리: Hetzner 베어메탈 노드와 Cloudflare를 통해 들어오는 트래픽을 처리하며, JSON 웹훅을 관리 힙에 불변 문자열로 역직렬화하는 대신 Span<T>를 이용한 스택 할당 메모리 뷰를 사용합니다. 텍스트 정규화는 스택 버퍼에서 직접 수행되며, 64비트 수치 해시를 생성하여 L0 Mirror Cache에 저장합니다. 이를 통해 $O(1)$ 시간 복잡도로 즉각적인 위협 차단이 가능합니다.
  • 듀얼 게이트 의미론적 행렬: 긴 메시지의 처리 지연 시간을 줄이기 위해 64자 제한의 Head-Tail Compression Heuristic을 도입했습니다. 메시지가 64자를 초과하면 처음 32자와 마지막 32자를 추출하여 하나의 평가 창으로 결합합니다. 이를 MiniLM-L6-v2 기반의 듀얼 파이프라인으로 처리합니다.
  • Gate 1 (Toxicity Triage): 원시 의미론적 의도를 평가하여 0.0 ~ 1.0 범위의 정규화된 신뢰도 벡터를 생성합니다. "Nuclear" 분류 임계값을 0.95 ~ 0.98로 고정하여 실제 적대성을 일반적인 게임 채팅과 구분합니다.
  • Gate 2 (Target Mapping): Gate 1에서 플래그가 지정된 경우, 적대성을 Personnel (0), Self (1), System (2)의 0-인덱스 행렬에 매핑합니다.
  • 결정론적 대체 (Deterministic Replacement): 생성형 AI를 통한 메시지 재작성 대신, Context-Aware De-Escalation Stubs를 사용합니다. Gate 2에서 적대성의 정확한 타겟 인덱스를 식별하면, 해당 페이로드를 삭제하고 문맥에 맞는 플레이스홀더로 대체합니다. 120개의 사전 검증된 De-Escalation Stub을 활용하여 환각 없이 즉각적이고 결정론적인 무력화를 보장합니다.
  • 마이크로소프트 OpenAPI 제거 및 회로 차단기 패턴: .NET 환경에서 Microsoft OpenAPI와 같은 취약한 블로트웨어를 제거하고, 외부 노드 연결 실패 시 무한 StackOverflow 루프를 방지하기 위해 회로 차단기 패턴을 적용하여 시스템 스텁을 배포합니다.
  • 텔레메트리 및 데이터 주권: 생성형 재작성 없이 결정론적 실행을 통해 위협이 클라이언트에 렌더링되기 전에 채팅 페이로드를 가로채고 평가, 삭제, 대체합니다. 모든 처리를 엣지에서 네이티브로 수행하고 외부 데이터베이스를 회피하여, 채팅 기록을 디스크에 저장하거나 제3자 AI 모델 학습에 사용되지 않도록 Zero Data Retention (ZDR)을 보장합니다.

시사점

$O(1)$ 패턴을 처음부터 설계함으로써 성능과 프라이버시를 동시에 확보하고, 대규모 실시간 고처리량 시스템 구축 시 발생하는 병목 현상을 극복할 수 있음을 보여주며, 유사한 확장성 문제에 직면한 개발자들에게 유용한 아키텍처 패턴을 제시합니다.

원문 읽기 →
원문을 불러오는 중...

댓글

GitHub Discussions