AI 기반 서비스

Today
-
Total
-
← 목록으로

Zodiac Guesser 개발 - 틀려도 재미있게, 맞으면 더 재미있게

이창연•2025년 12월 25일•Zodiac Guesser

Zodiac Guesser 개발 - 틀려도 재미있게, 맞으면 더 재미있게

Life EXP 경험을 살려서

Life EXP를 Claude Code로 하루 만에 만든 경험이 있었다. Zodiac Guesser도 비슷한 속도를 기대했다.

기획서(proposals/zodiac.md)를 읽고 Next.js로 구현해줘.
- 10개 Yes/No 문항
- 별자리 예측 알고리즘
- 결과 페이지에 맞춤 멘트
- Supabase를 PostgreSQL로 변경 (로컬 서버 사용)

예상대로 반나절 만에 기본 구조가 나왔다. 두 번째 프로젝트라 지시도 더 효율적이었다. Life EXP에서 배운 "추상적으로 지시하고 세부는 AI에게 맡기기" 전략이 통했다.

다만 첫 번째와 다른 점이 있었다. Life EXP는 단순 O/X + LLM 멘트였지만, Zodiac Guesser는 예측 알고리즘이 필요했다. 가중치 기반 점수 계산, 원소 분류, 2회차 보정 로직. 이 부분은 기획서에 상세히 적어서 Claude Code에게 넘겼다.

예측 알고리즘

단순한 점수 합산이 아니다. 각 문항에 별자리별 가중치가 있다.

// 예시: "People call me stubborn" 문항
weights: {
  taurus: 0.8,    // 황소자리 핵심 특성
  leo: 0.4,       // 사자자리 부분 해당
  scorpio: 0.5,   // 전갈자리 부분 해당
  // ... 나머지는 0.1 이하
}

10개 문항의 가중치를 합산해서 가장 높은 별자리를 예측한다. 동점이면 원소(Element)로 2차 판단.

가중치를 설정하는 것 자체가 흥미로운 작업이었다. "고집이 세다"는 특성을 황소자리(0.8)에만 높게 줄 건지, 전갈자리(0.5)와 사자자리(0.4)에도 분배할 건지. 점성술 문헌과 대중적 인식 사이에서 밸런스를 잡아야 했다.

너무 학문적으로 가면 대중의 기대와 어긋나고, 너무 대중적으로 가면 별자리 간 변별력이 떨어진다. 결국 "별자리 밈에서 자주 언급되는 특성"을 기준으로 가중치를 잡았다. 학술적 정확성보다 사용자의 "맞췄다!" 체감이 더 중요하니까.

2회차 트릭

1회차에서 틀리면 "What's your actual sign?"을 물어본다. 사용자가 실제 별자리를 선택하면:

  1. 해당 별자리 가중치를 1.5배로 상향
  2. 선택 별자리와 충돌하는 문항 가중치 하향
  3. 2회차에서 거의 맞춤

이게 핵심 트릭이다. 사용자는 "오 2회차엔 맞췄네!" 하면서 공유한다.

사실 이건 2003년 혈액형 테스트에서 이미 검증된 메커니즘이다. 당시에도 1회차 적중률은 40% 정도였지만, 2회차에서 80% 이상으로 올라갔다. "틀렸다 → 다시 해보자 → 맞았다!"의 서사가 공유 욕구를 자극한다. 한 번에 맞추는 것보다 "두 번째에 맞추는 스토리"가 더 재미있는 것이다.

기술적으로는 간단하다. 사용자가 실제 별자리를 알려주면, 그 정보를 가중치에 반영해서 다시 계산하면 된다. 하지만 너무 노골적이면 안 된다. "아, 얘가 그냥 내가 알려준 걸 그대로 말하는 거 아냐?"라는 의심이 들면 안 되니까. 2회차에서도 약간의 불확실성을 남겨두는 게 포인트다.

결과 멘트가 승부처

맞췄을 때:

"Classic Taurus! Your grounded stubbornness was impossible to miss."

틀렸을 때 (예측 Scorpio, 실제 Libra):

"Interesting... You're a Libra with serious Scorpio rising energy."

별자리 문화의 "Sun sign / Moon sign / Rising sign" 개념을 활용하면 틀린 결과도 그럴듯하게 포장된다. "Rising energy"가 마법의 주문이다.

이 포장 전략은 핵심 중의 핵심이다. 틀렸을 때 "아 틀렸네요. 다시 해보세요"라고 하면 사용자가 이탈한다. 하지만 "너의 표면은 천칭자리인데, 내면에는 전갈자리 에너지가 강해"라고 하면? "오... 그럴듯한데?"가 된다.

12 x 12 = 144가지 조합(예측 x 실제)에 대해 각각 멘트를 준비해야 한다. 수동으로는 불가능하다. LLM이 각 조합에 대해 자연스러운 멘트를 생성하되, "Rising energy", "Moon sign influence", "cusp energy" 같은 점성술 용어를 활용하도록 프롬프트를 설계했다.

영어 네이티브 검수

미국 시장을 노리니까 영어가 자연스러워야 한다. ChatGPT로 초안을 쓰고, 영어권 친구에게 검수를 부탁했다.

수정 전: "Your answers show Scorpio characteristics clearly." 수정 후: "Textbook Scorpio. Your mysterious intensity was written all over those answers."

"Textbook [sign]" 표현이 미국에서 실제로 쓰이는 표현이라고 한다. 이런 뉘앙스는 비원어민이 잡기 어렵다.

다른 예시들:

  • "Such a Leo move" → 사자자리 특유의 행동이라는 의미
  • "Very on-brand for a Virgo" → 처녀자리답다는 의미
  • "Peak Aquarius energy" → 물병자리 기운 최고치라는 의미

이런 표현들이 미국 TikTok, Twitter에서 실제로 쓰이는 별자리 밈 언어다. LLM이 생성하는 멘트에 이런 표현을 자연스럽게 녹이는 게 영어 시장 공략의 핵심이다.

로컬 서버의 장점

원래 기획은 Vercel + Supabase 조합이었다. 무료 티어로 시작하려고.

그런데 이미 DGX Spark가 있으니 그냥 로컬로 가기로 했다. 장점:

  • DB 비용 없음
  • 응답 속도 빠름 (같은 서버에서 LLM도 돌리니까 네트워크 지연 0)
  • 데이터 완전 통제
  • 로컬 LLM 사용으로 API 비용도 0원

zodiac.craftbay.io로 배포 완료. Cloudflare Tunnel로 외부 접근.

Vercel + 외부 LLM API 조합이었으면 트래픽에 비례해서 비용이 증가했을 것이다. 바이럴 콘텐츠는 트래픽 예측이 불가능해서, 갑자기 수천 달러 청구서가 올 수도 있다. 로컬 서버는 트래픽이 아무리 늘어도 추가 비용 0원. 인프라 투자를 이미 한 DGX Spark의 장점이 여기서 빛난다.

소셜 공유 최적화

바이럴을 노리려면 공유 기능이 깔끔해야 한다. 구현한 것들:

  1. OG 이미지 동적 생성: 결과에 따라 별자리 이미지 + 멘트가 포함된 이미지 자동 생성
  2. Twitter Card: 큰 이미지 카드로 타임라인에서 눈에 띄게
  3. 복사 버튼: "내 결과: AI가 나를 전갈자리로 맞췄다! 🦂" 원클릭 복사
  4. 재도전 유도: "친구도 테스트해보게 공유하기" CTA

아직 할 일

  • 문항 변별력 데이터 수집 후 가중치 튜닝
  • 2회차 트릭 비율 조정 (너무 뻔하면 안 됨)
  • TikTok용 세로형 결과 이미지 추가
  • Reddit r/astrology 등 커뮤니티 시딩

일단 런칭하고 데이터를 모으면서 개선할 생각이다. 바이럴은 계획할 수 있는 게 아니다. 준비하고 기다리는 수밖에.