AI 사주풀이, 왜 볼 때마다 말이 바뀔까? '판정은 코드로, 서술은 LLM으로' 푼 방울당 이야기

한눈에 보기
사주를 AI에게 통째로 맡기면 그럴듯한 말은 잘 하지만, 만세력 계산이나 용신 판정처럼 '정답이 정해진 영역'에서 슬쩍 환각이 섞여버립니다. 개발자 '방울당' 팀은 이 문제를 해결하기 위해 판정(계산)은 결정론적 코드로, 개인화된 서술만 LLM에게 맡기는 구조로 사주 리포트 서비스를 만들었습니다. 로그인 없이 비회원도 바로 이용할 수 있다는 점도 특징입니다.
왜 이런 서비스를 만들었나
기존 AI 사주 서비스들을 써보면, 같은 생년월일을 입력해도 볼 때마다 용신(用神)이나 풀이가 달라지는 경우가 흔했다고 합니다. 이유는 명확합니다.
- 용신을 계산하는 방식만 해도 억부용신법, 조후용신법, 통관용신법, 병약용신법 등 여러 갈래가 있고, 어떤 방법을 쓰느냐에 따라 풀이 자체가 달라집니다.
- 이런 판단을 LLM에게 그대로 맡기면, LLM이 매번 다른 논리로 결론을 내리면서 신뢰도가 무너질 수밖에 없습니다.
방울당은 이 구조적인 문제를 아예 설계 단계에서 막아보고자 했습니다.
어떻게 만들었나: "판정은 코드가, 서술만 LLM이"
핵심 아이디어는 역할 분리입니다.
1. 만세력 엔진 (결정론)
오행 가중치, 십성, 12운성, 신살, 대운·세운 계산까지 모두 코드로 처리합니다. 심지어 태어난 지역에 따른 진태양시 보정까지 코드 단에서 계산합니다.
2. 판정 레이어 (결정론)
연애·직업·재물·건강 판정과 월별 흐름까지 전부 코드가 결정합니다. LLM은 이 결과를 절대 뒤집을 수 없는 구조입니다.
3. LLM은 '서술'만 담당
LLM이 하는 일은 "이 기운이 이 사람에게 구체적으로 어떻게 작동하는가"를 풀어 쓰는 것뿐입니다. "십성이란 무엇인가" 같은 개념 정의는 하드코딩된 사전이 그대로 렌더링하기 때문에, 이 영역에서는 토큰 소모도 환각 위험도 0입니다.
4. 가드레일 파이프라인
파싱 → 스키마 검증 → 금지어·톤 체크 → 엔진 결과와 대조하는 팩트체크 → 실패 시 재시도, 순서로 여러 겹의 검증을 거칩니다. 또한 리포트를 5개 그룹으로 쪼개 병렬 생성해 응답 지연도 줄였습니다.
만들면서 얻은 인사이트
개발 과정에서 얻은 배움도 눈에 띕니다.
- 프롬프트에 '하지 마라' 목록을 늘리는 것보다, 애초에 LLM이 결정할 수 없도록 입력과 역할 자체를 좁히는 것이 훨씬 효과적이었다고 합니다.
- 결정론 레이어를 두껍게 만들수록 LLM 호출 비용과 재시도율이 함께 떨어졌습니다. 즉, 환각을 막기 위한 설계가 곧 비용 최적화로 이어진 셈입니다.
- 팀은 사주를 예언서가 아니라 '빅데이터'로 바라봅니다. 태어난 시각에 따른 기운을 파악하고 이에 대처하는 것 자체가 삶에 도움이 된다는 관점입니다.
마무리
LLM을 도입할 때 흔히 빠지는 함정은 '모든 걸 LLM에게 맡기면 편하다'는 생각입니다. 하지만 정답이 명확한 도메인일수록, 계산과 판정은 결정론적 로직에 맡기고 LLM은 자연어 표현에만 집중시키는 이런 하이브리드 설계가 신뢰도와 비용 두 마리 토끼를 잡는 데 효과적이라는 걸 방울당 사례가 잘 보여줍니다.