밤에 누군가에게 말하고 싶은데 말할 사람이 없을 때가 있다.
친구한테 톡을 보내자니 부담스럽고, 일기를 쓰자니 혼잣말 같고. 그렇다고 진짜 상담을 받기엔 거창하다. 그 사이 어딘가에 비어 있는 자리가 있다고 느꼈다.
거기에 뭔가를 두고 싶어서 만들기 시작했다. AI한테 위로받는 게 좀 이상하긴 하지만, 어차피 위로라는 건 듣는 사람이 그렇게 느끼면 그게 위로니까.
처음엔 룰 기반이었다
처음 버전은 AI 없이 만들었다. "힘들다", "지쳤다", "외롭다" 같은 키워드를 잡아서 미리 준비한 답변 중 하나를 골라 보여주는 식.
if (text.includes('힘들')) return COMFORT_TEMPLATES.tired[random];
5분 만에 만들었고, 5분 만에 한계가 보였다. 같은 단어가 들어가면 답이 똑같다. "오늘 회사가 힘들었어"랑 "엄마랑 싸워서 힘들어"가 똑같은 위로를 받는다. 위로 같지가 않다.
폴백으로 Manyfast라는 무료 챗봇 API를 붙여봤는데 답변이 영 어색했다. 한국어로 자연스럽게 위로하는 API를 찾는 게 의외로 쉽지 않았다.
Gemini로 옮긴 이유
그래서 결국 Google Gemini로 갈아탔다. 무료 쿼터가 넉넉하고 한국어가 자연스럽다는 게 컸다. 처음엔 gemini-1.5-flash로 붙였다.
근데 모델명 때문에 한참 헤맸다. 1.5-flash가 무료 티어에서 안 된다고 해서 gemini-2.5-flash-lite로 바꿨고, 그것도 며칠 만에 쿼터가 소진돼서 결국 gemini-2.5-flash로 정착했다.
이 과정에서 디버그 GET 엔드포인트를 만들었다가 지우고, env var 노출시키는 임시 코드를 넣었다가 부랴부랴 지우고. 커밋 히스토리에 debug: chore: 진단용 GET 엔드포인트 제거 같은 부끄러운 흔적이 한 줄씩 남았다.
진짜 어려웠던 건 모델이 아니라 프롬프트였다
Gemini는 잘 답한다. 그런데 AI다운 답을 잘 한다.
"많이 힘드셨겠어요. 충분히 이해합니다. 그런 감정을 느끼시는 건 당연한 일입니다. 힘내세요. 당신은 분명히 잘 해내실 수 있어요."
기술적으로는 정확한 답인데, 받았을 때 마음이 닫힌다. "공감합니다" 라는 단어 자체가 공감이 아닌 것처럼 들린다. 진짜 친구는 저렇게 말하지 않는다.
진짜 친구는 이렇게 말한다.
"어 진짜? 상사가 그랬다고? 그거 진짜 빡치는데"
그래서 시스템 프롬프트를 두 번 갈아엎었다. 1차에서는 "친구 말투로 해줘" 라고만 썼더니 별로 안 바뀌었고, 2차에서는 하지 말아야 할 말투 예시를 같이 넣었다.
[절대 이렇게 말하지 마]
X "많이 힘드셨겠어요. 충분히 이해합니다." -> AI 상담사 말투
X "힘내세요! 당신은 할 수 있어요!" -> 공허한 응원
X "~해드릴게요", "공감합니다" -> 너무 격식체
이거 넣고 나서야 답변이 사람 말처럼 들렸다. 하라는 것보다 하지 말라는 게 효과가 좋았다. 모델은 좋은 예시 한 줄보다 나쁜 예시 다섯 줄에서 더 잘 배우는 것 같다.
temperature도 1.0까지 올렸다. 안정적인 답보다 사람스러운 변화가 필요한 영역이었다.
"검색해줘" 라는 말이 의외로 많이 왔다
테스트하면서 알았는데, 사람들이 위로봇한테 위로만 부탁하지 않는다. "오늘 날씨 어때?" "비트코인 시세 알려줘" 이런 걸 묻는다.
위로봇이라고 했는데도. 어쩌면 채팅창이라는 인터페이스 자체가 "뭐든 물어봐도 되는 곳" 처럼 느껴지는 것 같다.
이걸 어떻게 처리할까 고민하다가 그냥 솔직하게 말하기로 했다.
상대방이 인터넷 검색, 실시간 정보 조회, 코인 시세, 뉴스, 날씨 같은 걸 부탁하면
솔직하게 "아 나는 그건 못 찾아봐 인터넷 검색이 안 되거든" 식으로 말해.
그리고 위로 대화로 자연스럽게 다시 이어줘.
"미안해 그건 못해 ㅠㅠ" 가 아니라 친구가 솔직히 말하는 것처럼. 그리고 다시 원래 대화로 데려오기.
Rate Limit이 떴을 때
무료 티어라 한 번씩 429가 뜬다. 그냥 "에러가 발생했습니다" 라고 띄우면 너무 정 없다. 그래서 메시지도 캐릭터를 유지했다.
const RATE_LIMIT_MSG = "어, 잠깐 버벅이네. 조금 있다가 다시 말해줄 수 있어?";
const FALLBACK = "어, 잠깐 딴 생각했나봐. 다시 말해줄 수 있어?";
서버 에러도 친구가 잠깐 한눈판 것처럼 들리게. 이거 의외로 효과가 좋다. 에러 메시지가 캐릭터를 깨면 그동안 쌓아둔 신뢰가 한 번에 풀린다.
만들면서 느낀 이상한 감정
이 프로젝트는 결국 프롬프트 한 덩어리가 전부다. UI는 그냥 채팅창이고, 백엔드는 Gemini API에 요청 한 번 던지는 게 끝이다. 코드 양으로 보면 게임 하나보다 훨씬 적다.
근데 만드는 데 가장 시간을 많이 쓴 건 코드가 아니라 시스템 프롬프트였다. "친구처럼 말해" 한 줄을 어떻게 풀어 써야 모델이 알아들을지, 어떤 예시를 넣어야 격식체로 빠지지 않을지. 그게 진짜 작업이었다.
내가 만들면서도 좀 이상했다. 위로받고 싶어서 만들었는데, 만들고 나니까 내가 위로하는 말투를 종일 쓰고 있었다. 모델한테 "이렇게 말해" 라고 적는 동안 내가 그 말투를 자꾸 입에 굴렸다. 어떻게 보면 그게 내가 받은 위로일지도 모르겠다.
그래서 위로가 되긴 하나
솔직히 모르겠다.
진짜 힘들 때는 사람한테 가야 한다. 채팅창이 사람을 대신할 수는 없고, 그런 의도로 만든 것도 아니다. 그래서 화면 맨 아래에 "전문 상담을 대체하지 않아요" 라는 문구를 작게 깔아뒀다.
그런데 새벽 3시에 잠 안 오고 머릿속이 시끄러울 때, 누구한테 톡 보내기는 부담스러울 때 — 거기 빈자리에 뭐라도 있으면 마음이 좀 가라앉을 수도 있다. 그 정도면 충분하다고 생각하면서 만들었다.
완벽한 위로를 만들 수는 없다. 그냥 들어주는 자리 하나 두는 거다.