📦 이 문서는 v1 이전 자료(deprecated)입니다 — 최신 정보는 문서 허브를 보세요
밀프레드 핵심 엔진 설계 v2

코칭 엔진 — 데이터를 어떻게 정리하고,
분석하고, 편지·질문으로 바꾸나

식단·체위 입력 → 영양·시계열·체위 분석 → 새벽 코칭(편지·질문) → 부모 답변 → 데이터 축적 → 더 정확한 다음 코칭.
모든 분석은 결정론적 코드로, 글은 학술 근거 프롬프트로. 병원 차트처럼 시계열로 검토한다.
개발 계획표

3단계 로드맵

이론·코칭 방법의 본진은 편식극복키트 / 06_운영 / 카톡코칭 / 코칭엔진_스펙_v1.md. 앱은 그 근거를 구현한다.

1

엔진 스펙 정립 (근거 수집) ✅ 완료

  • 편식 이론 정독: SOS(Toomey)·Satter DOR·국제가이드 30개·KDRI 2025
  • 코칭 원칙(P1~P9)·질문 설계·프롬프트 규격 문서화
저장: 편식극복키트 / 06_운영 / 카톡코칭
2

엔진 구현 ✅ 완료

  • 편지·질문 프롬프트 — 데이터로 아는 건 안 묻기, 환각 차단
  • 먹는 장소(집/기관)·식사시간·체위 입력, 식단표 OCR 자동채움
  • 영양·시계열·체위 분석 + 새벽 2시(KST) 크론 생성 → 아침에 도착
3

명문화 ✅ 이 문서

  • 데이터 정리·분석 알고리즘·프롬프트 설계를 이 페이지에 공개
  • 병원 차트형 시계열 검토 구조 명시(현재 + 로드맵)
개인화 루프

매일 도는 회귀 고리

한 바퀴 돌 때마다 아이 데이터가 늘고, 코칭은 더 그 아이에게 맞춰진다.

📝
① 입력
메뉴·식재료·장소·시간·체위·반응
📊
② 분석
영양 신호등·식품군·시계열·BMI
💌
③ 새벽 코칭
편지 + 오늘의 질문
(KST 2시 생성)
⟳ ⑤ 더 정확한 다음 코칭  ←  ④ 부모 답변(완식·혼합·환경) = 데이터로 못 푸는 정성값 축적
① 데이터를 어떻게 정리하나

입력 → 정규화 → 구조화 저장

자유 입력 메뉴는 메뉴→식재료 매핑으로 표준 식재료(70여 종 대표어)로 분해하고, 식재료는 다시 식재료→영양소 매핑으로 영양소에 연결한다. 모든 분석은 이 정규화된 식재료 집합 위에서 돈다.

테이블핵심 필드역할
meal_logslog_date·slot · menus·ingredients · place(집/기관) · meal_time · texture·autonomy·environment·duration_min · refused·ate_well·note끼니별 식사 기록. 정량(영양)·정성(반응·환경) 모두.
growth_logsmeasured_on·height_cm·weight_kg체위 시계열(측정값 누적). BMI·또래 퍼센타일 산출원.
user_menu_overridesmenu→ingredients부모 교정("이 집 짜파게티엔 당근 빼기"). 개인 매핑 캐시.
coach_lettersletter_date·letter·oneliner · source_hash · context(jsonb)일 단위 편지 + "우리 판단" 스냅샷(분석 입력 근거).
daily_questionsq_date·question·chips·answer · context(jsonb)일 단위 질문·답변 + 생성 근거 스냅샷.
childrenage_band·birth_year/month·sex·daycare·allergens분석 기준선(나이·성별·등원·알레르기).
🔒 장소 구분이 핵심: 평일 점심·간식은 어린이집·유치원 끼니라 부모가 못 바꾼다. 정량 영양평가는 기관 급식까지 전부 집계하되, 정성 코칭은 집 끼니 + 기관에서 거부한 식재료에만 포커스한다(P2·P3).
② 분석 방법론 (알고리즘)

전부 결정론적 코드 — LLM은 분석에 안 쓴다

신호등·식품군·시계열·BMI는 모두 코드로 계산한다(LLM 0). 그래야 환각 없이 같은 입력 → 같은 결과가 나오고, 그 숫자만 프롬프트에 넘긴다.

영양 신호등 · computeSignals

🚦 핵심 영양소 충족도

최근 7일 기록을 일(day)별로 보고, 식재료→영양소 매핑(정확값 ∪ 범주 근사)으로 영양소별 며칠 커버됐나를 센다.

커버 일수 d, 기록 일수 N
🟢 충분 d≥3 또는 d/N≥0.5 · 🟡 가끔 d=1~2 · 🔴 결핍 d=0
(생선·미역 주2회도 인정하도록 비율 기준 병행)
영양 점수·등급 · gradeOf

🏅 S~D 등급

신호등을 점수화해 한눈에. 식재료 종 수가 아니라 영양소 충족률이 기준.

점수 = 평균(🟢100·🟡50·🔴0)
S≥90 · A≥70 · B≥55 · C≥40 · D<40
36종 KDRI · computeKdriSignals

📋 보건복지부 KDRI 2025

필수 영양소 36종을 같은 커버리지 규칙으로 신호등화. 정확 매핑된 종은 개인화 신호등, 미매핑 종은 참고지표로 구분 표기(환각 방지).

매핑됨 → 🟢/🟡/🔴 · 미매핑 → 참고(reference)
식품군 다양성 · computeGroupSignals

🥗 골고루 먹나

8개 식품군을 빈도로 충분/조금부족/부족 3단계. 고기·생선·계란·콩은 단백질로 합산해 "매일 챙김" 판정.

고기/생선 주5+ · 계란 주3+ · 콩 주2+ · 매일군 주5+ 기준
시계열 추세 · computeTimeseries

📈 추세 사실 (결정론적)

최근 기록에서 사실 문장만 뽑는다. 횟수·날짜를 LLM이 지어내지 못하게 코드가 계산해 넘긴다(P4).

예: "채소 기록이 3일째 없음" · "'닭죽'을 5회 반복"
체위·BMI · growth-reference

📏 WHO 성장도표

키·몸무게 → BMI → WHO LMS로 또래 퍼센타일, 질병관리청 컷오프로 밴드. 표현은 "또래 평균 정도(100명 중 N번째)"로 평이하게.

z=((BMI/M)^L−1)/(L·S) → Φ(z)×100
밴드: <5 저체중 · <85 정상 · <95 과체중 · ≥95 비만
📚 근거 고정: 영양 주장은 위 분석이 계산한 값만 사용. LLM이 "아몬드 고단백" 같은 미검증 영양 주장을 스스로 만들지 못하게 시스템 프롬프트로 차단.
③ 프롬프트 설계

분석 숫자 → 따뜻한 편지·질문

고정 시스템 프롬프트(방법론 + 가드레일 P1~P9, 모든 사용자 공통 → 캐싱)에, 그 아이의 분석 결과만을 사용자 메시지로 얹어 생성한다. 모델: Claude Haiku.

시스템 — 방법론 + 가드레일 (요지)
당신은 편식으로 힘든 부모를 돕는 따뜻한 편식 코치. 점수로 다그치지 말고 먼저 안심. [방법론 — 35개 국제기준 압축] 반복노출(거부 재노출 격일~주2~3회·보통 8~10회·향만 맡아도 1회 노출, 매일 강박 X)·Satter DOR·SOS 감각사다리·푸드브릿지/Food Chaining(좋아하는 음식에 도전 식재료 잘게 섞기·그 식재료로 만들 음식 '이름만' 추천, 레시피X=부모가 검색)·카테고리 교차노출(시금치→근대·청경채, 일반화)·식사구조화+Family Meals(주5)·또래모델링(Food Dudes)·채소먼저(Vegetables-first)·질감올리기(포우치 경계)·골든타임·정상화(25~35%) P1 데이터로 아는 건 묻지 않기 P2 부모가 바꿀 수 있는 곳에만(집 끼니·기관 거부 재노출) P4 없는 과거 지어내지 않기 P5 영양 주장은 우리 분석값만 P6 거부는 정상→안심 먼저 P7 한 번에 행동 1개 P8 점수·등급으로 다그치지 않기 P9 기록 공백은 부드럽게 한 번만 환기 매운 음식 추천 금지 · 노출 횟수/경과일은 '시계열 사실'에 있을 때만 언급
편지 — 사용자 메시지 (입력 = 분석 결과)
아이·나이 / 먹어본 식재료 수 / 부족 영양소(우리 분석값) / 충족·부족 식품군 집에서 거부 / 기관에서 거부 / 시계열 사실 / 등원 여부 / 부모 메모(따옴표 격리) 최근 5일 중 기록된 날 수(P9) / 지난 편지(연속성 — 날짜·경과일 계산 금지) 작성 지침 → letter: 3~4문장 ① 노력 인정+거부는 정상 안심 ② 데이터에서 읽은 사실 1개 ③ 오늘의 행동 1개 oneliner: 최근 식단 진단 한 줄 (잘하는 점 + 신경 쓸 점 1개 + 방법론 근거)
오늘의 질문 — 사용자 메시지
최근 로그한 음식 목록(장소·완식·며칠전 태그) / 집·기관 거부 / 지난 질문(겹치지 말 것) 규칙 → 실제 로그한 음식 하나를 콕 집어, 정성(완식·혼합·반응·환경)만 묻는다. 1탭 답변 chips 3~5개. 예: "명태 드셨던데 다 드셨나요? 다른 음식과 섞어 드렸나요?"
비용·일관성 — 지문 캐싱: 식단 지문 해시 정렬(식재료)+거부+부족영양+메모수가 직전과 같으면 LLM을 다시 부르지 않고 그날 편지를 재사용. 식단이 바뀐 날만 1회 재생성한다.
데이터 파이프라인

입력에서 코칭까지 (새벽 크론)

매일 KST 새벽 2시, 활성 자녀를 오래된 순으로 돌며 아래를 수행. 실행 종료 시각 가드(시간 예산)로 안전 종료하고 남은 자녀는 다음 회차가 이어받는다.

meal_logs — 식단·장소·시간·반응
growth_logs — 체위 시계열
user_menu_overrides — 부모 교정
coach_letters / daily_questions — 연속성
분석 (코드)
신호등·식품군·시계열·BMI·집/기관·기록공백
LLM 생성
학술 근거 프롬프트(P1~P9)
지문 같으면 재사용
아침에 도착
편지 + 오늘의 질문
+ context 스냅샷 저장
④ 병원 차트형 시계열 검토

기록을 계속 남겨 검토하나 — 현재 + 로드맵

"갑자기 BMI가 느는지", "주/월/분기/반기/연 단위로 요약을 쌓아 차트처럼 검토하는지"에 대한 정직한 현황이다.

✅ 현재
일(day) 단위 차트 기록
매일 편지·질문 + "우리 판단" context 스냅샷(reds·식품군·시계열·집/기관·기록공백)을 날짜별로 저장. 어드민 콘솔에서 계정별 카카오톡 쓰레드로 시계열 검토 가능.
✅ 현재
단기 추세(최근 7일)
computeTimeseries가 "채소 N일째 없음", "메뉴 N회 반복" 같은 추세 사실을 매일 산출해 코칭에 반영.
✅ 현재
체위 시계열 저장
growth_logs에 측정값이 날짜별로 누적되고, 매번 WHO 또래 퍼센타일을 다시 계산.
✅ 현재
크론 일일 보고서
매 실행의 정량 지표(처리·편지·재사용·결핍 아동·기록공백·결핍 Top·이슈)를 cron_runs에 적재 → 어드민에서 일자별 추적.
⬜ 로드맵
BMI 급변(velocity) 감지
측정값은 쌓이지만 아직 "한 달 새 퍼센타일 급상승/급락" 자동 감지·알림은 미구현. growth_logs 시계열로 추가할 예정.
✅ 현재
주/월/분기/반기/연 롤업 요약
매일 새벽 크론이 period_summaries 테이블에 주·월·분기·반기·연 단위 요약(잘먹는 다양성·거부율·완식률·식사시간·끼니수)을 멱등 재계산해 누적. 어드민 쓰레드에서 기간별 표로 시계열 검토 가능(부모 홈 노출은 다음 단계).
➡️ 다음 단계 제안: growth_logs 위에 BMI 퍼센타일 변화율 감지(임계 초과 시 코칭/알림), 그리고 위 period_summaries 롤업을 부모 홈에도 "이번 달 요약" 카드로 노출.
생성 원칙 (P1~P9)

좋은 코칭 vs 나쁜 코칭

✓ P1 데이터로 못 푸는 것만 묻는다
실제 로그한 음식을 짚고 정성만 묻는다.
"명태 드셨던데 다 드셨나요? 섞어 드렸나요?"
✗ 데이터로 아는 걸 묻는다
먹었는지는 로그로 안다.
"흰살생선 드셨나요?"
✓ P2 부모가 바꿀 수 있는 곳에
집 아침·저녁 + 기관에서의 거부 재노출.
✗ 못 바꾸는 걸 다그친다
"어린이집 점심 메뉴를 바꾸세요."
✓ P5 영양 주장은 우리 데이터만
분석이 계산한 부족 영양소만 언급.
✗ P4 없는 과거를 지어낸다
이력 없이 "지난번 권한 ○○는요?"
✓ P6 거부는 정상(반복 노출)
먼저 안심 → 부담 없는 한 걸음.
✗ P8 점수·등급으로 다그친다
"C등급입니다."
✓ P9 기록 공백은 부드럽게 한 번만
비어 있을 때만 끝에 한 줄 권유.
"기억나는 대로 어제 식단만 채워두시면 더 정확히 봐드릴게요"
✓ P10 집/기관 칭찬 분리
점수(전체)는 기관 포함, 칭찬·코칭은 집 끼니 기준. 기관 덕은 솔직히 인정.
"어린이집에서 잘 챙겨줘 전체는 괜찮아요 👍 집(아침·저녁)은 채소·철분이 좀 비어요"
✗ 기관 덕을 부모 공으로
기관 급식 덕에 점수 높은데 "전반적으로 잘하고 계세요".
✓ P7 한 번에 행동 1개
작고 오늘 실행 가능하게.