📊 ENGINE · 기획 계획서 (PLANNING)

선호 계량화 모듈
'잘 먹음 · 잘 못 먹음'을 집·다축·수준·시계열로 계량한다

추천 엔진이 "잘 먹는 소고기"라고 말하려면, 그게 측정된 사실이어야 합니다. 기관 급식을 빼고 집에서 챙긴 끼니만으로, 식재료·메뉴·조리형태별 수용 수준을 시계열로 쌓아 확신도와 함께 판정하는 모듈 — 추천 네트워크가 딛고 설 토대입니다.

0

요약 — 가장 큰 병목은 알고리즘이 아니라 신호다

실측

아린이 21일 데이터를 엄격히 계량하면(집만·노이즈 제거·명시 수용신호만·Wilson 하한) 확신할 수 있는 '잘 먹는' 식재료가 0개입니다. 지금 추천이 쓰던 "잘 먹는 소고기"는 미입력(unknown)을 수용으로 오판한 허상이었습니다. 추천을 고치기 전에 선호를 측정해야 합니다.

40끼니
집 끼니 (선호 신호원)
기관 38·기타 8 제외
30%
수용 '수준' 있는 끼니
명시 4 + 추정 8 / 40
0
확신 '잘 먹음' 식재료
21일 내내 (Wilson 게이트)
28
자유텍스트 오염
'한두입씩먹음'이 식재료로
3
선호 계량 축
식재료·메뉴·조리형태
📌 이 문서 = 푸드체이닝 모듈이 입력으로 쓰는 '잘 먹음/잘 못 먹음' 계량 모듈의 설계. 이사님 지적(Day1 "잘 먹는 소고기"는 말이 안 됨 + 기관 제외 집 기준 + 식재료/메뉴/조리형태 다지표 + 수용 '수준' 데이터화 + 시계열)을 전부 반영. 개발 전 설계 — 검토용.
1

왜 Day1 "잘 먹는 소고기"가 틀렸나 — 4가지 결함 (실측)

근본 원인
① served ≠ liked
엄마가 자주 차린 것이 아이가 좋아하는 것은 아니다. 빈도는 부모의 선택 신호.
소고기: 집에서 10번 차림 · 수용 확인 2번
② 수용 여부 미입력
ate_well이 거의 안 찍힌다. 미상(null)을 '수용'으로 오판해 "잘 먹는"이 양산됨.
집 40끼니 · true 4 · false 0 · null 28
③ 자유텍스트 노이즈
거부·메모가 자유텍스트라 '한두입씩먹음'이 식재료로 잡힌다. 신호가 오염됨.
오염 28종: 한두입씩먹음 · 피자아주조금먹음 · 배탈나서조금먹음 · 몇조각주워먹음 · 물 · 소스 · 토마토케찹 …
④ 기관 급식 혼입
선호는 집 기준이어야 하는데 기관·기타가 섞이면 '급식이라 먹은 것'을 선호로 오판.
기관 38 · null/외식 8 끼니 (집 40과 혼입)
⚠️ 네 결함이 합쳐져, 현재 엔진은 "미상인데 집에서 자주 차린 것"을 "잘 먹는 것"으로 단정합니다. Day1처럼 기록이 거의 없을 때 특히 위험 — 계량·확신도·콜드스타트 게이트가 없기 때문.
2

원칙 4

설계 사상
집만 (기관 제외)
선호 신호는 집에서 엄마가 챙긴 끼니만. 기관 급식은 영양 커버리지엔 쓰되 선호엔 안 쓴다(급식이라 먹은 것 ≠ 선호).
계량 + 확신도
'잘 먹음'은 점수와 확신도를 동반. 표본이 적으면 단정 금지(Wilson 하한·콜드스타트).
다축 (식재료·메뉴·조리형태)
한 칸이 아니라 여러 지표로 쪼갠다. '감자전은 먹는데 감자조림은 거부'를 구분해야 추천이 똑똑해진다.
수준 + 시계열
먹음/안먹음 이진이 아니라 수용 '수준'을, 시간 흐름으로(최근 가중·추세·food jag).
3

⭐ 수용 '수준' 척도 — 어느 정도로 받아들였나

graded

이사님 지적: "수용을 어느 수준으로 했나"가 데이터로 있어야 한다. 먹음/안먹음 이진을 버리고 5단계 척도로(SOS 노출 위계 + 섭취량 결합). 안 먹어도 만지면 전진으로 기록 → 푸드체이닝 진척을 측정.

0거부 안 봄·치움·울음SOS 0 · 섭취 0
1탐색 같은 식탁 OK·만짐·냄새SOS 견딤~만짐 · 섭취 0
2한 입 맛봄·뱉어도 OKSOS 맛봄 · 섭취 소량
3조금 일부 섭취SOS 먹음 · 섭취 일부
4잘 먹음 대부분·완식SOS 먹음 · 섭취 대부분
이 척도가 있으면 "당근 = 안 먹음(0)"이 아니라 "당근 = 지금 2단계(한 입), 3주 전엔 1단계 → 오르는 중"으로 읽힌다. 거부도 0과 1을 구분(완전 거부 vs 식탁 위 허용)해 진척을 인정 → 부모 동기·노출 설계의 핵심.
⚠️ 현재 데이터로는 이 척도가 30%만 채워집니다(집 40끼니 중 명시 4 + 메모추정 8). 나머지 28끼니는 수준 미상 → §9 신호 포착이 1순위 과제인 이유.
4

신호 3티어 — 무엇을 믿을 수 있나

신뢰도
티어 1 · 명시 수용 수준 강 · 골드
부모가 직접 찍은 5단계 수준 / 구조화 거부 사유(맛·식감·양·환경). 가장 신뢰하나 현재 거의 없음(집 40끼니 중 4).
티어 2 · 메모 추정
"다 먹음"·"한두입"·"안 먹음" 같은 자유 메모를 수준으로 파싱. 현재 8끼니 추정 가능. 구조화 입력으로 승격 대상.
티어 3 · 드러난 선호(re-serving) 약 · 추정
집에서 거부 신호 없이 반복해 차린 식재료 = 약한 양성 추정(부모는 거부한 걸 잘 안 다시 차림). 단 교란 많음 → 저확신 prior로만. 아린 예: 바나나(3회) · 우유(3회) · 김(3회).
확신도 = 어느 티어가 기여했나로 결정. 티어1·2가 임계 미만이면 '미확정'으로 두고, 티어3은 "추정"이라고 라벨해서만 쓴다.
5

⭐ 다축 모델 — 식재료 · 메뉴 · 조리형태

child_food_pref

선호를 세 축으로 따로 쌓고 롤업한다. 한 식재료가 형태에 따라 호불호가 갈리는 걸 잡아야(감자전 O / 감자조림 X) 추천이 정밀해진다.

🥕 식재료축 (ingredient)
당근 자체에 대한 종합 선호. 체이닝 앵커·사촌 대상.
당근 = 형태들의 롤업
🍲 메뉴축 (dish)
당근볶음 같은 완성 음식 단위. 분해하면 식재료 신호로.
당근볶음 · 미역국 …
🍳 조리형태축 (ingredient×method)
당근×볶음 vs 당근×조림. 형태별 호불호 → '조리법 바꿔 재도전'의 근거.
감자×전 O / 감자×조림 X

점수 산식 (축 공통)

아린 실측 — 식재료축 (집만·노이즈 제거·오늘 기준)

식재료차림수용신호확신도Wilson↓상태
소고기104 (수용2/거부2)10.15탐색 중
계란52 (수용0/거부2)10잘 못 먹음
미역42 (수용1/거부1)10.09탐색 중
감자41 (수용0/거부1)10탐색 중
돼지고기32 (수용0/거부2)0.750잘 못 먹음
바나나31 (수용1/거부0)0.750.21탐색 중
31 (수용0/거부1)0.750탐색 중
우유30 (수용0/거부0)0.750미확정
30 (수용0/거부0)0.750미확정
치즈21 (수용0/거부1)0.50미확정
닭고기21 (수용0/거부1)0.50미확정
크림21 (수용0/거부1)0.50미확정
가자미10 (수용0/거부0)0.250미확정
포도11 (수용0/거부1)0.250미확정
오렌지11 (수용0/거부1)0.250미확정
토마토11 (수용0/거부1)0.250미확정
잘 먹음탐색 중잘 못 먹음미확정

조리형태축 (예)

형태차림수용상태
미역×국·탕41/2탐색 중
소고기×국·탕41/2탐색 중
바나나×기타31/1탐색 중
계란×기타30/0미확정
소고기×기타31/1탐색 중
우유×기타30/0미확정
감자×기타30/1탐색 중
김×기타20/0미확정
닭고기×기타20/1미확정
계란×튀김20/2미확정

메뉴축 (예)

메뉴차림수용상태
202/6탐색 중
미역국41/2탐색 중
바나나31/1탐색 중
짜파게티31/1탐색 중
30/0미확정
20/0미확정
우유20/0미확정
La갈비20/0미확정
실측 결론: 아린이는 '잘 먹음'으로 확신할 식재료가 0개, 대부분 미확정. 차림은 많아도(소고기 10번) 수용 신호가 비어서다. 계량 모델이 정직하게 "아직 모른다"고 말하는 것 — 이게 옳은 동작.
6

콜드스타트 게이트 — Day1을 고친다

성숙도

확신 '잘 먹음'이 생기기 전엔 추천 엔진이 단정하지 않는다. 아래는 아린이 21일 성숙도 — 잘 먹음(초록)이 끝내 0이라, 지금이라면 매일 "수집 중" 온보딩이 맞다.

잘 먹음탐색잘 못 먹음미확정
05-26
집0 · 잘먹음 0
05-27
집0 · 잘먹음 0
05-28
집0 · 잘먹음 0
05-29
집1 · 잘먹음 0
05-30
집4 · 잘먹음 0
05-31
집9 · 잘먹음 0
06-01
집10 · 잘먹음 0
06-02
집13 · 잘먹음 0
06-03
집14 · 잘먹음 0
06-04
집17 · 잘먹음 0
06-05
집19 · 잘먹음 0
06-06
집21 · 잘먹음 0
06-07
집25 · 잘먹음 0
06-08
집27 · 잘먹음 0
06-09
집29 · 잘먹음 0
06-10
집30 · 잘먹음 0
06-11
집32 · 잘먹음 0
06-12
집33 · 잘먹음 0
06-13
집36 · 잘먹음 0
06-14
집37 · 잘먹음 0
06-15
집39 · 잘먹음 0
06-16
집40 · 잘먹음 0

Day1 편지 — Before / After

✗ 지금 (계량 없음)
잘 먹는 소고기 곁에 현미를 조금 곁들여주세요(곡물 보충).
→ 소고기 수용 신호 0. 단정 불가인데 단정함.
✓ 콜드스타트 게이트
아직 아린이의 입맛을 보는 중이에요. 집에서 먹은 끼니를 며칠 기록해주시면, 아린이가 좋아하는 것에서 시작하는 맞춤 한 걸음을 찾아드릴게요. 오늘은 한 끼만 편하게 기록해볼까요?
게이트 규칙(안): 자녀 성숙도(집 끼니 수·확신 식재료 수) 미만 → 온보딩 모드(추천 단정 금지). 식재료별로도 확신도 임계 미만이면 앵커로 안 씀. 티어3(re-serving)만 있을 땐 "아린이가 자주 먹는 ○○" 정도로 약하게·추정 라벨.
7

DB 설계 — 이벤트 원장 + 다축 롤업 (시계열)

스키마
meal_logs — 이벤트 원장(있음·보강) 시계열 원천
끼니마다 place(집/기관) · ingredients · menus · 수용 수준(신규 5단계) · 거부 사유 구조화(신규: 맛·식감·양·환경). 자유텍스트는 보조. → 모든 선호의 원천 진실.
▼ 야간 집계(집 끼니만)
child_food_pref — 다축 롤업(신규) 빠른 읽기
(child_id, axis, key) — axis ∈ {ingredient·dish·form} · served · 수준합/수용·거부 카운트 · pref_score · confidence · state · trend · first/last_seen · exposure · inst_seen(영양용 별도). 매일 materialize.
▼ 읽기(결정론)
③ 소비처 — 추천·편지·도감 신뢰
푸드체이닝 모듈은 state='liked'·confidence≥임계만 앵커로, form-dislike는 조리법축 기회로, ingredient-dislike는 회피로 읽는다. 판단은 여기서 안 함 — 계량은 ②에서 끝.
시계열 = meal_logs가 원장(append-only), child_food_pref는 최신 롤업 + 추세. 과거 추적이 필요하면 pref_history(주차 스냅샷) 추가. 기관 급식은 inst_seen으로 따로 — 영양 거울엔 쓰고 선호엔 안 씀.
8

추천 네트워크로의 확장 — 닫힌 루프

왜 토대인가

이사님 말씀대로, 계량된 선호가 있어야 음식·식재료 추천 네트워크가 굴러간다. 선호 모듈은 추천 네트워크에 정확히 이걸 공급한다:

선호 신호네트워크/추천에서 쓰임
잘 먹음 식재료 (확신)체이닝 앵커(F) — food-graph 사촌으로 다리 / 곁들임 pair의 기준점
잘 못 먹음 — 조리형태축조리법 바꿔 재도전(감자조림 X → 감자전 O). food jag 해소
잘 못 먹음 — 식재료축추천 회피 + 먼 사촌으로 우회 / 장기 노출 대상
탐색 중 + 노출 수준반복노출 진척("지금 2단계/8회") — 같은 것 반복 권유 근거
추세 rising/fallingrising=성공 신호(다음 사촌 승급) · falling=권태(형태 전환)
닫힌 루프: 집 끼니 기록 → 수용 수준 계량(이 엔진) → 확신 선호 → 푸드체이닝 추천 → 편지·도감 → 부모 실행 → 새 끼니 기록 → 다시 계량. 이 엔진이 루프의 첫 칸이라, 여기가 비면 뒤가 전부 허상 위에 선다(= 지금 "잘 먹는 소고기").
9

⭐ 신호 포착 개선 — 가장 큰 레버

최우선

모델보다 입력이 먼저다. 지금은 집 끼니의 70%가 수용 수준 미상. 한 번의 가벼운 탭으로 채우게 한다.

🍽️ 저녁 기록 — 당근볶음
아린이가 당근, 어느 정도 먹었어요?
🙅거부
👀만짐
😋한 입
🍴조금
💯잘 먹음
거부 사유 ▾식감

3가지 포착 장치

  • 원탭 5단계 수용 수준 — 끼니 기록 시 식재료(또는 끼니)별 이모지 한 번. 티어1 골드 신호를 매끼 확보.
  • 구조화 거부 사유칩 — 맛·식감·양·환경. '자유텍스트→식재료 오염' 차단 + 거부 원인별 처방(식감거부→조리법 전환).
  • 드러난 선호 자동 추론 — 명시 입력이 없어도 re-serving·완식 패턴으로 티어3 약신호 보충(추정 라벨).
입력 마찰 ↓ 가 핵심 — 끼니당 탭 1번. 미입력 시에도 티어3로 저확신 추정은 돌되, 절대 '단정'하지 않는다.
10

로드맵 · 리스크

단계
A · 계량 코어 (~1일)
집만 필터(엄격 place) + 노이즈 제거(식재료 화이트리스트) + 다축 집계 + 점수/확신도/상태 + child_food_pref 야간 materialize. 읽기 전용·라이브 무영향.
B · 콜드스타트 게이트 (~0.5일)
성숙도/확신도 미만 → 추천 단정 차단·온보딩 모드. Day1 "잘 먹는 소고기" 즉시 제거.
C · 수용 수준 포착 UX (~1~2일)
기록 화면에 원탭 5단계 + 구조화 거부칩. meal_logs에 수준·사유 필드. 신호 채우기 = 최대 레버.
D · 추세·food jag + 네트워크 배선 (후속)
수준 추세·권태 감지 → 체이닝 앵커/회피/형태전환 공급. 선호 모듈 → 추천 네트워크 닫힌 루프 완성.
리스크 — ① 입력 마찰: 수준 포착이 귀찮으면 신호가 또 빈다 → 탭 1번·선택사항·미입력도 degrade. ② 티어3 과신 금지: re-serving은 약신호, 단정 라벨 금지. ③ 기관 데이터 유혹: 양 많아도 선호엔 안 씀(영양만). ④ 표기 정합: 쇠고기→소고기 등 캐논 매핑 선행(노이즈와 별개).
이사님 확인 — ① 수용 5단계 척도(거부·만짐·한입·조금·잘먹음) 이 구성 OK? ② 다축(식재료·메뉴·조리형태) 이대로 갈지 ③ A·B(계량 코어+콜드스타트 게이트)부터 착수 ④ 포착 UX(C)를 어디까지 강제 vs 선택으로.