Geta
디스코드 페르소나 챗봇
여러 사람이 함께 쓰는 디스코드 채널에서 성격과 말투를 바꿔 가며 대화하는 AI 챗봇을 만들고, 여러 캐릭터가 함께 떠드는 단톡방 모드까지 확장했다.
무엇을 만들었나
여러 사람이 동시에 대화하는 디스코드 채널에서, 누구나 성격과 말투를 바꿀 수 있는 AI 챗봇을 만들었다. 이후 캐릭터 여러 명이 서로 다른 이름과 프로필로 대화에 끼어드는 단톡방 모드, 답변이 생성되는 대로 바로 나타나는 빠른 응답, 외부 화면에서 봇 상태를 읽고 설정을 바꿀 수 있는 연결 구조를 더했다. 이미 운영 중인 봇을 고치는 작업이어서, 기존 기능이 깨지지 않는지를 자동 테스트로 계속 확인했다.
구현 방식과 보안 설계는 ‘기술 상세’에 있습니다.
구조와 설계
봇은 순수 로직 계층과 디스코드 클라이언트 계층으로 나누고, 모델은 OpenAI 호환 chat/completions 방식으로 호출해 접속 주소와 모델명 두 값만 바꾸면 공급자를 교체할 수 있게 했다. 이 필드를 모르는 공급자는 요청을 거부하기 때문에, 추론 강도 설정은 끄는 값을 보내는 대신 요청에서 필드를 통째로 생략하는 방식으로 구현했다. 체감 속도는 스트리밍 응답, 봇 수명 동안 재사용하는 HTTP 클라이언트, 전역 락을 세마포어로 바꾼 동시 처리로 높였고, 같은 채널의 기억 갱신 구간만 락으로 보호해 대화 순서가 꼬이지 않게 했다. 출연진(최대 5명)은 추가 모델 호출 없이 이름 지목, 가중 랜덤, 직전 화자 가중치 감소 순의 규칙으로 화자를 고르며, 웹훅 권한이 없으면 임베드 표시로 자동 폴백한다. 상태는 JSON 파일에 임시 파일 후 교체 방식으로 저장해 재시작을 견디고, 외부 화면과는 상태 파일(봇에서 외부)과 제어 파일(외부에서 봇) 두 개만으로 통신해 포트를 열지 않는다.
사용 기술
Python 3, discord.py, httpx(비동기·스트리밍), asyncio, pytest, Gemini API(OpenAI 호환 방식), JSON 파일 기반 상태·제어, macOS launchd
보안·안정성 설계
- 페르소나(1500자)와 세계관(3000자) 변경에 길이 상한을 두고, 기본값 복원 옵션과 변경자 공개 기록으로 되돌릴 수 있는 상태를 유지
- 사용자별 호출 빈도 제한(기본 300초당 15회)과 동시 호출 수 제한
- 캐릭터 프로필 이미지 주소 검증에서 사설·루프백·내부망 대역 주소를 거부
- 웹훅 토큰은 메모리에만 두고 로그와 상태 파일에 남기지 않음
- 모델 호출 실패 시 채널에는 짧은 오류 한 줄만 보이고 원문 예외는 로그로만 기록
- 운영 환경 설정 파일은 줄 추가만 허용하고, 값을 출력하지 않은 채 길이 비교로 비밀값 보존을 검증
- 상태·제어 파일은 원자적으로 쓰고, 깨진 제어 입력은 연속 2회 실패 시에만 격리해 크래시 없이 처리
- 모델이 코드블록 밖에 섞어 내보내는 ANSI 제어 시퀀스를 제거하는 출력 정제 계층(스트리밍 조각에도 동일 적용)
작업 기록
페르소나 챗봇 신규 구축과 전면 이름 변경
여러 사람이 섞여 대화하는 채널용 봇을 새로 만들었다. 호환 API 방식으로 공급자 교체가 가능하고 기억과 페르소나는 재시작 후에도 유지되며, 이어서 기능 변경 없이 프로젝트 이름을 전면 변경해 잔여 표기 0건과 테스트 54개 동일 통과로 확인했다.
추론 강도 설정 추가와 기본 모델 전환
사고 토큰 때문에 느려지고 비싸지는 문제를 줄이는 설정을 넣되, 필드를 모르는 공급자에서는 요청에서 필드를 생략하도록 했다. 테스트 8개를 더해 62개가 통과했다.
봇 외부 제어용 파일 인터페이스
상태 파일과 제어 파일 두 개로 외부 화면과 통신하는 구조를 설계했다. 원자적 쓰기와 연속 2회 실패 시에만 격리하는 규칙으로 경쟁 조건과 깨진 입력을 처리했고, 테스트는 94개가 통과했다.
체감 속도와 디스코드 출력 품질 개선
스트리밍 응답, HTTP 연결 재사용, 코드블록 인지 분할, 모달 입력과 세계관 분리를 넣어 체감 속도와 출력 품질을 높였다. 테스트는 94개에서 151개로 늘었다.
다중 페르소나 단톡방 확장과 결함 4건 수정
캐릭터 최대 5명이 함께 대화하는 단톡방 모드를 추가하고, 검수와 라이브 테스트에서 나온 결함 4건을 같은 날 수정했다. 테스트는 205개에서 241개로 늘었고 서식 버그 수정에서 21개를 더 추가했으며, 기존 테스트는 약화하거나 건너뛰지 않았다.
이 페이지는 작업 기록 문서 5건을 바탕으로 정리했습니다. 고객 정보, 접속 주소, 비밀값은 공개 전에 걸러 냅니다.