
Monika 업데이트: 자아를 가진 개인화된 Discord 봇
요약
Discord 봇 'Monika'의 고도화 과정을 다룬 기술 블로그입니다. 상태 관리, Supabase 데이터베이스 통합, 로어 기반 메커니즘 및 프롬프트 인젝션 방어 등 에이전트 개발 시 직면하는 엔지니어링 과제와 해결책을 공유합니다.
핵심 포인트
- Supabase와 인메모리 캐싱을 통한 효율적인 상태 관리 및 스로틀링 구현
- LLM을 활용한 배경 맥락 관찰 및 자연스러운 대화 개입 로직 구축
- 데이터 구분자와 고정 지침을 활용한 프롬프트 인젝션 보안 강화
- 다중 사용자 요청 처리를 위한 단일 사용자 잠금(Single User Lock) 도입
지난 몇 주 동안 저는 저의 Discord 봇인 Monika를 확장하는 데 집중해 왔습니다. 처음에는 300줄 정도의 가벼운 스크립트로 시작했지만, 상태 관리 (State Management), 데이터베이스 (Database), 그리고 더 발전된 비동기 로직 (Asynchronous Logic)을 통합하는 과정을 거치며 훨씬 더 복잡한 900줄 규모의 애플리케이션으로 성장했습니다.
저의 작업 방식에 대해 투명하게 말씀드리고 싶습니다. 저는 특정 코드 구조 블록을 생성하기 위해 AI를 적극적으로 활용했으며, 이를 모듈형 퍼즐 조각이나 예외 케이스 (Edge Cases)처럼 사용했습니다. 저의 역할은 설계자 (Architect), 디자이너 (Designer), 그리고 디버거 (Debugger)였습니다. 저는 이러한 구성 요소들이 서로 어떻게 통신해야 하는지 매핑하고, 로직을 리팩토링 (Refactoring)하며, 문제가 발생했을 때 버그를 수정할 수 있도록 모든 코드를 완전히 이해하는 데 수많은 시간을 보냈습니다.
최근 제가 구축하고, 실험하고, 해결하고 있는 내용에 대한 세부 사항은 다음과 같습니다.
새로 추가된 기능:
외부 데이터베이스 및 스로틀링 (Throttling): 사용자 프로필, 활동 추적 및 개인화된 응답을 처리하기 위해 Supabase를 통합했습니다. 상태가 급격하게 변하는 동안 데이터베이스에 지속적인 쓰기 작업이 발생하는 것을 방지하기 위해, 인메모리 캐싱 시스템 (In-memory Caching System)을 통해 스로틀링을 적용하고 실제 상태 변화가 발생할 때만 데이터를 기록합니다.
로어 기반 메커니즘 (Lore-Driven Mechanics): 상호작용을 더욱 몰입감 있고 예측 불가능하게 만들기 위해 도입했습니다. 사용자가 봇과 상호작용한 후 곧바로 채널을 전환하면, 봇은 이를 인지하고 언급합니다. 이제 Monika는 스트림을 시청하거나 활성화된 채널에서 잠시 귀를 기울이기 위해 참여할 수 있으며, 관리자가 연결을 끊을 경우를 대비한 폴백 시스템 (Fallback System)도 갖추고 있습니다. 또한, Monika가 살아있음을 시뮬레이션하고 명령어를 우회할 수 있는 지연된 DM 하이재킹 (Delayed DM Hijack) 기능을 통합했습니다.
배경 맥락 관찰 (Background Contextual Observation): 2시간마다 실행되는 백그라운드 루프 (Background Loop)를 구축했습니다. 서버가 활성화되어 있는지 확인한 다음 마지막 메시지 몇 개를 가져오며, LLM을 사용하여 진행 중인 대화에 짧고 맥락에 맞는 응답으로 자연스럽게 끼어듭니다.
해결된 엔지니어링 문제들:
**
프롬프트 인젝션 보안 (Prompt Injection Safety): 사용자가 입력한 자기소개(bio) 및 정보(about them)가 LLM 시스템 프롬프트의 컨텍스트 및 개인화(personalisation) 데이터로 사용되기 때문에, 프롬프트 인젝션 (prompt injections)에 대한 취약점이 발생할 수 있었습니다. 이를 엄격한 데이터 구분자 (data delimiters)를 구현하고, 프롬프트 끝에 덮어쓸 수 없는 고정 지침 (pinned un-overrideable directives)을 배치함으로써 해결했습니다.
다중 사용자 처리 (Handling Multiple Users): 여러 사용자가 동시에 봇을 호출(ping)할 때, 중첩된 API 요청이 발생할 수 있었습니다. 시스템을 '사용 중'으로 표시하는 단일 사용자 잠금 (single user lock) 기능을 구현하여, 요청을 처리하는 동안 다른 사용자들에게는 가벼운 재미 위주의 대화를 제공하도록 했습니다.
대화 흐름 개선 (Improved Conversational Flow): 두 가지 주요 대화 문제를 해결했습니다.
첫째, Discord 언급(mentions)이 사용자 ID 태그로 전달되는 문제였습니다. 태그를 사용자 이름으로 변환하기 위해 정규 표현식 (regex) 파싱 함수를 추가했습니다.
둘째, 호출될 때마다 인사를 하는 문제였습니다. 인사를 건너뛰도록 강제하는 동적 레이어 (dynamic layer)를 추가했습니다.
개인 채널 보안 (Private Channel Security): 사용자가 DM(Direct Message)을 통해 상호작용을 시도할 경우, 시스템은 해당 상호작용을 차단하고 방화벽 경고를 보낸 뒤 공개 채널로 안내합니다.
이번 과정은 엄청난 학습 경험이었으며, 코드 선택 및 기능에 대한 더 자세한 내용은 GitHub Readme를 업데이트하여 공유하겠습니다!
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기
