Code › tail-villain

결과를 복습 일정으로 바꾸기

Study와 Interview의 결과를 FSRS 복습 일정으로 연결해 고정 알림을 적응형 복습 루프로 바꾼 과정

tail-villain의 복습 기능을 만들면서 가장 먼저 걸린 건 알림 자체가 아니었다. 특정 날짜가 되면 사용자에게 다시 보라고 말하는 것은 어렵지 않지만, 그 날짜가 왜 오늘이어야 하는지는 설명하기 어려웠다.

처음에는 고정된 간격도 충분해 보였다. 오늘 배운 것은 내일, 며칠 뒤, 일주일 뒤에 다시 꺼내게 만들면 그럴듯한 복습 루프가 된다. 그런데 Study에서 어렵게 답한 주제와 Interview에서 거의 막힘없이 설명한 주제가 같은 간격으로 돌아온다면, 제품은 사용자의 실제 상태를 보지 않는 셈이다.

면접 연습 플랫폼에서는 그게 꽤 이상한 일인데, 사용자는 이미 답을 하고 있고, AI는 그 답의 품질을 보고 있으며, 세션도 그 결과를 저장하기 때문이다. 그런데 복습 일정만 달력 알림처럼 움직이면 학습의 가장 중요한 신호를 버리는 구조가 된다.


고정 알림으로는 부족했다

Ebbinghaus의 망각 곡선은 이 제품을 만들 때부터 중요한 배경이었다. 사람은 한 번 본 내용을 그대로 오래 들고 가지 못하고, 다시 꺼내는 일이 없으면 기억은 빠르게 약해진다. 그래서 tail-villain은 단순한 모의 면접 도구가 아니라, 압박 속에서 답을 꺼내고 다시 복습하는 루프를 목표로 했다.

다만 제품 안에서 필요한 것은 망각 곡선을 문자 그대로 재현하는 일이 아니었고, 모든 사람과 모든 주제를 같은 계산식으로 설명할 수 있다는 식으로 말하고 싶지도 않았으며, 더 현실적인 목표는 원칙을 제품 행동으로 바꾸는 것이었다. 기억은 꺼내지 않으면 약해지고, 잘 꺼낸 기억은 조금 더 늦게 다시 봐도 되며, 어렵게 꺼낸 기억은 더 빨리 돌아와야 한다.

고정 알림은 이 차이를 담지 못한다. 사용자가 어떤 주제를 한 번 열었다는 사실만으로 그 기억이 강해졌다고 볼 수 없고, 알림을 보고 페이지에 들어갔다고 해서 복습이 끝난 것도 아니다. 특히 면접 준비에서는 내가 안다고 느끼는 것과 실제로 말로 설명할 수 있는 것 사이에 간격이 크다.

그래서 복습의 기준을 방문이나 클릭이 아니라 **능동 회상(active recall)**으로 잡았다. 먼저 떠올리고, 말해 보고, 틀리거나 막히는 지점을 드러내야 한다. 답을 보기 전에 꺼내는 시도 자체가 학습 이벤트이고, 그 시도의 품질이 다음 일정을 정하는 입력이 된다.


Study와 Interview의 결과를 복습 입력으로 연결했다

이미 Study와 Interview에는 사용자의 상태를 볼 수 있는 신호가 있었다. Study는 주제를 설명하고 질문을 던지며 사용자가 어느 정도 이해했는지 평가한다. Interview는 더 압박적인 상황에서 답변의 깊이와 일관성을 확인하고, 마지막 보고서에서 전체 세션의 결과를 정리한다.

이 신호를 복습 일정과 연결하지 않으면 기능들이 따로 논다. Study는 Study대로 피드백을 주고, Interview는 Interview대로 점수를 남기며, 복습은 정해진 날에 다시 나타나는 식이다. 사용자 입장에서는 같은 제품 안에서 공부와 면접, 복습이 이어지는 것처럼 보이지만, 시스템 내부에서는 서로 다른 섬처럼 남게 된다.

이번 작업에서는 세션 결과가 주제의 복습 상태를 갱신하도록 묶었다. 사용자가 잘 설명한 주제는 다음 복습 간격이 길어지고, 어렵게 답했거나 다시 확인이 필요한 주제는 더 빨리 돌아온다. 중요한 점은 매 턴의 작은 점수를 바로 최종 학습 결과처럼 쓰지 않는 것이다. 면접 중 한 번의 follow-up 답변은 힌트를 주지만, 주제 진행도와 복습 일정은 마지막 보고서 평가처럼 더 안정적인 결과를 기준으로 갱신해야 한다.

FSRS를 붙인 이유도 여기에 있었다. FSRS는 단순히 1일, 3일, 7일 같은 표를 따라가는 방식이 아니라, 항목마다 난이도와 기억 안정성을 갱신하고 사용자의 회상 품질에 따라 다음 간격을 조정한다. 잘 떠올린 항목은 더 긴 간격으로 밀고, 다시 틀린 항목은 짧은 간격으로 되돌리며, 제품에서는 이 원리를 Study와 Interview의 평가 결과에 연결해 주제별 다음 복습 시점을 계산했다.

FSRS를 쓴다고 해서 어떤 주제의 복습이 완전히 끝났다고 말할 수는 없다. 그래서 UI에서도 확정적인 표현을 피했다. due, upcoming, strengthened memory 같은 상태는 현재 일정과 최근 결과를 보여 주는 신호이지, 사용자의 머릿속에 지식이 고정됐다는 증명은 아니다. 기억은 계속 다시 꺼내 봐야 하고, 일정은 그 기록을 따라 조정된다.


Quick Review는 새 엔진이 아니라 Study 엔진을 다시 썼다

복습 화면을 만들 때 별도의 미니 퀴즈 엔진을 새로 만들 수도 있었다. 빠르게 due topic을 보여 주고, 사용자가 답을 적으면 점수만 매기는 방식인데, 겉으로는 간단하지만 그렇게 만들면 기존 Study와 같은 문제를 다시 풀어야 한다.

Study Mode에는 이미 필요한 것이 있었다. 주제별 진행 상태를 알고, 질문을 이어 가며, 사용자의 목표와 배경을 RAG로 가져오고, 답변 평가를 저장한다. 복습도 결국 같은 일을 한다. 다른 점은 출발점이 새 학습이 아니라 due 상태의 주제라는 점이고, 화면이 오늘 다시 꺼내야 할 항목을 더 직접적으로 보여 줘야 한다는 점이었다.

그래서 Quick Review는 Study 엔진을 재사용했다. 대시보드에서 바로 들어갈 수 있는 입구를 만들고, 복습 전용 워크스페이스에서는 due topic과 upcoming topic, 최근 강화된 기억을 보여 줬다. 내부 질문과 평가 흐름은 Study가 맡고, 복습 화면은 오늘 무엇을 꺼내야 하는지와 끝난 뒤 다음 일정이 어떻게 바뀌었는지를 드러내는 역할로 나눴다.

화면도 한 번에 끝나지 않았다. 처음에는 카드가 너무 넓고 정보 밀도가 낮아서 복습 목록이 아니라 대시보드 장식처럼 보였다. 이후에는 주요 목록과 메모리 요약을 더 촘촘하게 배치하고, 긴 제목이 잘릴 때는 NEXT UP 라벨을 접었다 펼칠 수 있게 바꿨다. 복습은 사용자가 빨리 들어와서 바로 말해 봐야 하는 기능이라, 화면 자체가 무겁게 느껴지면 루프가 끊긴다.


RAG는 근거를 주고, FSRS는 시점을 정한다

이 작업에서 헷갈리기 쉬운 부분은 RAG와 FSRS의 역할이다. 둘 다 개인화처럼 보이지만, 해결하는 문제가 다르다.

RAG는 사용자의 목표와 배경, 현재 Roadmap에 연결된 근거를 가져온다. 예를 들어 같은 커뮤니케이션 질문을 연습하더라도 누군가는 이직 면접을 준비하고, 누군가는 대학원 면접을 준비하며, 누군가는 영업 프레젠테이션을 준비할 수 있다. RAG는 이 차이를 Study와 Interview가 참고할 수 있게 만든다.

FSRS는 그 근거가 무엇인지 판단하지 않는다. 대신 사용자가 해당 주제를 얼마나 잘 떠올렸는지, 이번 시도 후 다음 복습 간격을 얼마나 잡을지를 결정한다. 다시 말해 RAG는 무엇을 근거로 질문하고 피드백할지를 도와주고, FSRS는 언제 다시 꺼내야 하는지를 계산한다.

둘을 섞으면 제품 설명이 쉽게 과장된다. RAG가 개인화된 근거를 넣었으니 더 잘 기억할 것이라고 말하거나, FSRS가 일정을 계산했으니 기억이 보장된다고 말하면 틀린 설명이 된다. 실제로 제품이 할 수 있는 말은 더 좁다. 사용자의 답변 품질을 기록하고, 그 결과를 바탕으로 다음 복습 시점을 조정하며, 다시 연습할 때는 사용자의 목표와 배경을 근거로 더 관련 있는 질문을 던진다.

그 정도가 지금의 정직한 설명이다.


Roadmap은 무엇을 공부할지 정하고, Study와 Interview는 사용자가 실제로 꺼낼 수 있는지 확인하며, FSRS는 그 결과를 다음 복습 시점으로 바꾼다. RAG는 다시 연습할 때 사용자의 목표와 배경을 근거로 공급한다.

아직 할 일은 남아 있다. 복습 결과가 충분히 쌓이기 전에는 임계값을 크게 조정하거나 기억 유지에 대해 강한 문구를 써서는 안 된다. 이메일이나 푸시 알림도 나중 문제다. 먼저 제품 안에서 사용자가 due topic을 열고, 답을 떠올리고, 평가를 받고, 다음 일정이 바뀌는 흐름이 자연스럽게 돌아가야 한다.

면접 준비에서는 내용을 다시 보는 것보다 질문 앞에서 내 말로 꺼내는 능동 회상이 복습 결과가 된다. FSRS는 그 결과를 다음 일정으로 연결하고, 사용자가 다시 답을 꺼내야 할 시점을 조정한다.