솔이봇에 Jev 도입하기
판단 전용 AI 모델 Jev를 솔이의 '메시지로 명령하기' 기능에 적용해봤습니다.
솔이에는 메시지로 명령하기 라는 기능이 있습니다. 이 기능은 아무 채널에서나 "솔이야 @게스트 타임아웃 1시간 해줘"와 같이 말하면 솔이가 이를 인식하고 자동으로 해당 명령을 수행하는 기능으로, 기존의 /명령어나 사용자 우클릭 상호작용보다 빠르게 사용자를 처벌하면서 동시에 멤버들에게 특정 유저를 처벌한다는걸 직관적인 메시지로 보여줄수 있다는 특징이 있습니다.
하지만 단점으로, AI를 통해 사용자가 전송한 자연어 형태의 처벌 요청 메시지를 처벌 요청 메시지가 맞는지, 어떤 사용자에게 어떤 처벌을 얼마나 내리길 원하는건지 판단해야하기 때문에 처리 시간이 4초에서 최대 30초까지도 걸리는 문제가 있었습니다.

기존 '메시지로 명령하기'의 작동 방식
메시지로 명령하기 기능은 기존에 OpenAI의 GPT를 사용해 사용자의 메시지를 분류하는 방식으로 처리해왔습니다. "솔이야 @게스트 욕설사용으로 5회 경고 넣어줘"와 같이 말하면, 솔이는 이 메시지가 멤버 관리권한을 가진 사람이 보낸 메시지인지 확인한 후 OpenAI API로 해당 메시지가 어떤 처벌을 얼마나 누구에게 하려는건지 판단해달라고 요청을 보내서 자연어 형태의 처벌 요청 메시지를 판단했습니다. 이를 기반으로 솔이는 해당 요청자가 적절한 권한을 가지고 있는지 확인한 후 요청한 명령을 이행하는 방식을 사용해왔습니다.
하지만 이러한 방식은 위에서 말한것과 같이 OpenAI API를 사용하기에 GPT 모델의 답변 시간에 따라서 솔이 작동이 느려질수 있다는 큰 문제가 있었으며, 평균적으로 5,200ms의 응답 속도를 보여줬습니다. 사용자가 명령 메시지를 보내도 5초 뒤에나 명령이 실행되고 명령이 이행되기에, 사용자 입장에서는 자신의 명령이 제대로 처리되고있는게 맞는지 즉각적으로 알기 어렵고, 명령이 처리되는 사이에 처벌 대상자가 우발적인 행동을 하는 경우도 잦았습니다.
비용또한 문제였습니다. 간단한 판별 내용이지만 OpenAI의 gpt-5-nano를 사용하고 있었기에 건당 평균 $0.000305의 비용이 발생하였으며, 이는 1만회당 4,000원 정도의 비용이였습니다.
'메시지로 명령하기'에 Jev 도입하기
최근 Jev라는 이름의 판단 전용 AI 모델이 TypeSafe AI에서 출시했습니다. 긴 글을 생성하는 일반적인 대화형 LLM과 달리, 입력된 데이터에 대해 구조화된 확률과 결정을 곧바로 반환하는 특징을 가지고 있으며, 결정적으로 기존 자연어 생성 AI 모델보다 더 빠르고 저렴합니다. 기존 GPT 방식의 단점을 보완해줄수 있다 판단해 곧바로 솔이에 도입했습니다.
디스코드 메시지 "솔이야 @유저 도배해서 2시간 타임아웃해줘"
│
▼ events/messageCommand.ts
│ "솔이야 " 접두사 + 관리 권한 있는 사용자 여부 확인
▼ tryJev()
│ ① preparse.ts : 코드가 후보 추출 (멘션·시간·개수·사유)
│ ② jev.ts : Jev에게 보낼 질문지 구성
│ ③ Jev API 호출
│ ④ jev.ts : 답을 기준표로 검사
│
├─ 비정확 → GPT(gpt-6.1-sol)로 재판단
│
▼ 처벌 실행 (권한 확인·차단·타임아웃 등)
위와 같이 적용했으며, Jev의 판단 확신도가 0.93 미만이거나 오류가 발생할 경우 GPT 모델이 기존방식대로 재확인 하는 방식으로 개발했습니다. Jev에게 하는 질문은 아래와 같이 총 5종류입니다.
-
명령 의도 확인 (comman/unrelated)
사용자가 보낸 메시지가 명령 메시지인지 아닌지 분류합니다. -
대상별 처벌 종류 분류 (11개중 선택)
사용자가 어떤 명령을 요청했는지 아래 선택지중 하나를 선택해 분류합니다.
none/timeout/untimeout/kick/ban/unban/quarantine/unquarantine/warn_add/warn_remove/verbalWarn -
타임아웃 시간 선택 (후보중에 선택)
2번 질문의 분류 결과가 timeout일 경우에 사용자가 얼만큼의 타임아웃을 요청했는지 선택합니다.
사용자가 보낸 메시지를 Jev에 보내기 전에 시간과 관련된 문구를 추출해서 후보로 만듭니다.
확신도가 0.75 미만이면 GPT로 넘깁니다. -
경고 갯수 선택 (후보중에 선택)
2번 질문의 분류 결과가 warn_add이거나 warn_remove일 경우에 사용자가 얼만큼의 경고를 요청했는지 선택합니다.
사용자가 보낸 메시지를 Jev에 보내기 전에 갯수와 관련된 문구를 추출해서 후보로 만듭니다.
확신도가 0.75 미만이면 GPT로 넘깁니다. -
사유 선택 (확률)
후보중에 어떤게 명령에 대한 사유에 해당되는지 확률로 판단합니다.
사용자가 보낸 메시지를 Jev에 보내기 전에 문장을 나눠서 후보로 만듭니다.
개선 성과
사실 별 기대 안했는데, 생각보다 큰 개선이 있어서 놀랐습니다.
평가 세트를 기반으로 기존 GPT와 Jev를 돌려본 결과 GPT는 113/118(96%)의 정확도를, Jev는 177/177(100%)의 정확도를 보여줬습니다. 오히려 GPT보다 Jev가 더 정확한 결과를 보여줬습니다. 응답는 평균시간 5,189ms에서 707ms으로 7.3배 속도가 빨라졌습니다. 비용은 건당 $0.000305에서 $0.000063로 감소하며 79% 절감되었습니다. 1만회당 처리 비용은 4,000원에서 850원으로 줄었습니다.
| 항목 | 기존 방식 | Jev 방식 | 개선 |
|---|---|---|---|
| 정확도 | 96% (113/118) | 100% (177/177) | +4%p |
| 평균 응답 | 5,189ms | 707ms | 약 7.3배 |
| 명령 1건 비용 | $0.000305 | $0.000063 | 79% 절감 |
| 1만건당 비용 | ₩4,000 | ₩850 |
몇가지 보안테스트를 진행한 후 솔이 v3.6.6 버전으로 릴리즈를 완료했습니다.
Newsletter
새 글을 메일로 받아보세요
글이 올라오면 가장 먼저 알려드릴게요.