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
점수 산식 (축 공통)
- 수용 점수 = 최근 가중 수용 수준 평균(0~4 → 0~1 정규화). 최근 끼니에 가중(반감기 ~2주).
- 확신도 = f(차림 횟수·티어). 표본 적으면 낮음 → 단정 차단.
- 상태 = 잘 먹음(Wilson 하한 ≥ 0.5) · 탐색 중(신호 있으나 부족) · 잘 못 먹음(반복 거부·수용 0) · 미확정(표본/신호 부족).
- 추세 = 수준이 오르면 'rising'(체이닝 작동), 떨어지면 'falling'(food jag — 같은 형태 권태 → 형태 바꿀 신호).
아린 실측 — 식재료축 (집만·노이즈 제거·오늘 기준)
| 식재료 | 차림 | 수용신호 | 확신도 | Wilson↓ | 상태 |
|---|---|---|---|---|---|
| 소고기 | 10 | 4 (수용2/거부2) | 1 | 0.15 | 탐색 중 |
| 계란 | 5 | 2 (수용0/거부2) | 1 | 0 | 잘 못 먹음 |
| 미역 | 4 | 2 (수용1/거부1) | 1 | 0.09 | 탐색 중 |
| 감자 | 4 | 1 (수용0/거부1) | 1 | 0 | 탐색 중 |
| 돼지고기 | 3 | 2 (수용0/거부2) | 0.75 | 0 | 잘 못 먹음 |
| 바나나 | 3 | 1 (수용1/거부0) | 0.75 | 0.21 | 탐색 중 |
| 빵 | 3 | 1 (수용0/거부1) | 0.75 | 0 | 탐색 중 |
| 우유 | 3 | 0 (수용0/거부0) | 0.75 | 0 | 미확정 |
| 김 | 3 | 0 (수용0/거부0) | 0.75 | 0 | 미확정 |
| 치즈 | 2 | 1 (수용0/거부1) | 0.5 | 0 | 미확정 |
| 닭고기 | 2 | 1 (수용0/거부1) | 0.5 | 0 | 미확정 |
| 크림 | 2 | 1 (수용0/거부1) | 0.5 | 0 | 미확정 |
| 가자미 | 1 | 0 (수용0/거부0) | 0.25 | 0 | 미확정 |
| 포도 | 1 | 1 (수용0/거부1) | 0.25 | 0 | 미확정 |
| 오렌지 | 1 | 1 (수용0/거부1) | 0.25 | 0 | 미확정 |
| 토마토 | 1 | 1 (수용0/거부1) | 0.25 | 0 | 미확정 |
잘 먹음탐색 중잘 못 먹음미확정
조리형태축 (예)
| 형태 | 차림 | 수용 | 상태 |
|---|---|---|---|
| 미역×국·탕 | 4 | 1/2 | 탐색 중 |
| 소고기×국·탕 | 4 | 1/2 | 탐색 중 |
| 바나나×기타 | 3 | 1/1 | 탐색 중 |
| 계란×기타 | 3 | 0/0 | 미확정 |
| 소고기×기타 | 3 | 1/1 | 탐색 중 |
| 우유×기타 | 3 | 0/0 | 미확정 |
| 감자×기타 | 3 | 0/1 | 탐색 중 |
| 김×기타 | 2 | 0/0 | 미확정 |
| 닭고기×기타 | 2 | 0/1 | 미확정 |
| 계란×튀김 | 2 | 0/2 | 미확정 |
메뉴축 (예)
| 메뉴 | 차림 | 수용 | 상태 |
|---|---|---|---|
| 밥 | 20 | 2/6 | 탐색 중 |
| 미역국 | 4 | 1/2 | 탐색 중 |
| 바나나 | 3 | 1/1 | 탐색 중 |
| 짜파게티 | 3 | 1/1 | 탐색 중 |
| 김 | 3 | 0/0 | 미확정 |
| 햄 | 2 | 0/0 | 미확정 |
| 우유 | 2 | 0/0 | 미확정 |
| La갈비 | 2 | 0/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/falling | rising=성공 신호(다음 사촌 승급) · 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 선택으로.