제품 사례
SajuBase
정확해야 하는 사주 계산은 코드로 고정하고, AI는 계산 결과와 사용자의 고민을 이어받아 상담하게 만든 공개 운영 서비스입니다.
바로 확인하기

이 제품이 필요했던 이유
사주 서비스 안에는 성격이 완전히 다른 두 문제가 있습니다.
생년월일, 시간과 지역에서 원국과 대운을 계산하는 과정은 같은 입력에 같은 결과가 나와야 합니다. 반면 사용자가 정말 알고 싶은 것은 이 결과가 지금 내 관계와 일, 선택에 어떤 의미인가이고, 답은 질문과 상황에 따라 달라집니다.
둘을 모두 LLM에 맡기면 계산값이 흔들리고, 이상한 답이 계산 오류인지 해석 오류인지 구분하기 어렵습니다. 계산 결과만 정적 리포트로 보여주면 사용자의 실제 고민으로 이어지지 않습니다.
고정해야 하는 계산과 달라져야 하는 상담을 분리했습니다
TypeScript 계산 엔진이 원국·십성·지장간·대운을 구조화 데이터로 만듭니다. AI 상담사는 이미 계산된 결과와 사용자의 현재 질문만 받아 대화를 이어갑니다.
사용자는 프로필을 만들고 메인 상담사와 대화한 뒤 관계·궁합·커리어·타이밍 같은 전문 상담으로 들어갑니다. 동의한 사실과 관심사는 기억 후보가 되고, 사용자는 기억을 수정·끄기·삭제할 수 있습니다.
실제 서비스 수명주기
- 생년월일·시간·지역 기반 계산
- 계산 결과와 현재 질문을 사용하는 메인 상담
- 문제별 전문 상담과 대화 이력
- 장기 기억·대화 요약과 사용자 기억 관리
- 무료 상담·시간 이용권·월 구독과 비회원 결제
- 결제 내역, 구독 해지, 문의·환불과 계정 삭제
코드·모델·사용자의 책임
| 주체 | 맡긴 일 |
|---|---|
| 계산 엔진 | 같은 입력을 재현 가능한 원국·대운 데이터로 계산 |
| 상담 모델 | 구조화된 계산 결과와 질문을 현재 고민의 언어로 해석 |
| 기억 시스템 | 출처와 범위를 가진 장기 기억·대화 요약 관리 |
| 결제·계정 시스템 | 구매 상태, 접근 권한과 데이터 소유권 연결 |
| 사용자 | 기억의 저장·수정·삭제와 상담 방향 통제 |
만들면서 해결한 문제
Deterministic Core: 재현해야 하는 계산을 언어 생성 밖으로 뺐습니다
- 문제: 시간대, 지역, 절기와 여러 규칙이 얽힌 값을 모델이 만들면 같은 입력에서도 결과가 달라질 수 있었습니다.
- 판단: 반복 가능한 도메인 계산은 코드가 책임지고, 모델은 완성된 결과만 해석해야 했습니다.
- 구현: TypeScript 엔진이 계산 결과를 구조화하고 상담에는 이 결과만 전달했습니다.
- 달라진 점: 답이 이상할 때 계산, 상담 지시문, 기억과 모델 응답을 서로 다른 실패 영역으로 점검할 수 있게 됐습니다.
User-Controlled Memory: 많이 기억하기보다 고칠 수 있게 했습니다
- 문제: 모델의 추측이나 오래된 관심사가 사실처럼 저장되면 다음 상담 전체가 잘못된 전제 위에서 이어집니다.
- 판단: 기억의 양보다 출처·범위와 사용자 통제가 중요했습니다.
- 구현: 장기 기억과 대화 요약을 분리하고, 사용자가 명시한 사실·선호·목표를 제한적으로 저장했습니다. 기억 없이 상담하기와 수정·보관·삭제 화면도 제공했습니다.
- 달라진 점: 이전 맥락을 이어가면서도 사용자가 잘못된 기억을 바로잡을 수 있게 됐습니다.
Entitlement Recovery: 결제 성공보다 권한과 소유권을 맞췄습니다
- 문제: 로그인 전 상담과 결제, OAuth 가입, 기록 가져오기와 이용권 부여가 이어지면 권한 누락과 중복 연결이 생길 수 있었습니다.
- 판단: 결제 상태, 상담 세션과 회원 계정을 한 번에 합치지 않고 검증 가능한 전환으로 나눠야 했습니다.
- 구현: 제한된 연결 정보와 중복 확인을 두고 인증 콜백에서 이용권과 상담을 계정에 연결했습니다. 임시 상담 복원과 유료 권한 연결 순서도 분리했습니다.
- 달라진 점: 사용자는 로그인 전에 시작한 상담과 구매를 가입 뒤 이어가고, 중간 전환이 실패해도 구매한 경험으로 돌아갈 수 있게 됐습니다.
직접 확인하기
이 사례의 핵심은 재현해야 하는 도메인 로직과 달라져야 하는 생성 경험을 분리하고, 이를 실제 유료 서비스의 기억·권한·복구까지 연결한 제품 판단입니다.