🕸️ ENGINE · DATA ARCHITECTURE

음식 추천 네트워크
데이터 강화 아키텍처 (2~6세)

추천 네트워크를 어떤 데이터로, 어떤 관문을 거쳐 풍성하게 만들 것인가 — "수치는 후보를 만들고, 사람(Claude)이 증거를 보고 판정하고, 편지는 믿고 쓴다"는 단일 판단 지점 원칙과, 그 위에 부어 넣을 데이터 3티어·국가 레시피 축·2~6세 안전 메타데이터를 한 장에 시각화한 설계 정본.

← 문서 허브 · 엔진 · 데이터 명세 클러스터 · 2026-06-14
0

네트워크 한눈에

추천 네트워크 = 식재료 노드두 종류의 엣지로 잇는 무방향 그래프. 추천은 이 그래프 위를 걷는다 — 잘 먹는 것 → 곁들임(pair) → 사촌(bridge).

소고기 두부 시금치 근대 곁들임(pair) 사촌(bridge)
pair · 곁들임/궁합 — 같은 끼니·레시피에 함께 bridge · 사촌/닮음 — 맛·식감·영양이 닮은 대체재
192
식재료 노드
468
pair 엣지(궁합)
175
bridge 엣지(사촌·수기)
lift
c·N/(na·nb) 채점
1

핵심 원칙 — 판단은 한 곳, 편지는 믿는다

데이터를 그래프에 넣을지 판정하는 곳은 빌드타임 단 한 곳. 수치만으로 자르지 않고, 증거를 펼친 엑셀을 사람(Claude)이 보고 결정한다. 편지 쓸 때는 이미 검증된 추천이라 그대로 믿고 쓴다.

① 데이터 원천
보유(Tier0) · 국가 공공데이터(Tier1) · 유사도 모델(Tier2)
앱 1차 로그 · 국가 레시피 · 식약처 영유아 식단 API · 영양/감각 유사도
수치로 후보 생성
② 후보 엣지 — 엑셀 1장
증거를 다 펼친다 자동
lift · cells · 동시출현 N · 실제 식판/레시피 예시 2~3 · 안전플래그 · 자동초안 등급
안전 바닥(하드 차단) — 사람 판정 전에 코드가 먼저 자동 차단: 질식위험 · 8대 알레르겐 · 음성 lift(우연 이하) · 꿀(만1세). 이건 판단 대상이 아니라 무조건 막는다.
🧑‍💻 터미널에서 검수
③ Grounded 판정 — 유일한 판단 지점
내가(Claude) 증거 보고 결정 사람
"2~6세에게 맛있고 · 자연스럽고 · 안전한가" → 승인 / 거부 / 수정 + 사유. 수치는 내 이지 나를 대체하지 않는다.
승인분만 박는다
④ food-graph.json / DB
verdict가 박힌 깨끗한 그래프
엣지마다 grade · reason · verified 영속. 증분 체크포인트 = 신규 후보만 재검수.
결정론 코드 필터(판단 아님)
⑤ 편지 — TRUST
재료를 믿고 작문만 한다 신뢰
선택 시점에 이 아이 연령·알레르기로 결정론 필터(코드)만 거침. LLM이 조합을 다시 판단하지 않는다 — 재료=결정론, 문장=LLM 자유.

✗ 옛 구조 — 수치가 LLM을 덮어씀

LLM이 맨손(일반상식)으로 떡+달걀에 2점 → 그걸 cells<8 수치 게이트가 사후에 차단. 수치가 LLM을 이기는 구조라, 좋은 조합도 수치에 잘려나갈 위험.

✓ 새 구조 — 수치가 LLM을 무장시킴

같은 떡+달걀을 "실제 식판 4회·lift 0.72=우연 이하" 증거와 함께 보여주면 판정자가 스스로 거부. 수치는 게이트가 아니라 증거. 떡+달걀의 교훈은 "LLM 빼라"가 아니라 "데이터로 무장시켜라".

⚖️ 왜 편지 때 다시 판단하지 않나

추천이 편지에 도착했을 땐 이미 검증된 것이어야 정상이다. 거기서 또 판단하면 같은 일을 두 번 하는 낭비이고, "재료=결정론, 문장=LLM 자유" 철칙을 스스로 깨는 것. 런타임에 남는 건 판단이 아니라 결정론 필터(이 아이 ageBand·알레르기 제외)뿐 — 그래서 편지는 가져온 추천을 믿고 쓴다.

2

왜 강화가 필요한가 — 3가지 구조적 약점

지금 네트워크는 좋지만, 2~6세에 치명적인 빈틈 3개가 있다. 데이터 강화는 이 3개를 정확히 겨냥한다.

연령 미스매치 — '또래'가 초등이다

pair의 '또래 빈도'가 초등 NEIS(6~12세) 식판. 레시피DB는 영아/유아/아동으로 이미 나뉘어 있는데 빌드 때 6개를 합쳐 연령 신호를 버린다. (검증: NEIS는 유치원 급식을 제공하지 않음 — 보유 유치원 7,036은 명부지 식단 아님)

→ 처방: 레시피DB 연령 가중 + 식약처 영유아 식단 API(15118061/15118065)로 freqMap·식판 lift 교체

bridge(사촌)가 수기다 — 안 늘어난다

푸드체이닝의 핵심인 사촌 175쌍이 전부 손 큐레이션(basis:"맛·식감이 닮은 사촌" 단일 텍스트). 신규 식재료마다 사람이 또 손으로 추가해야 하고, 롱테일 고립 노드 ~40개가 어디에도 안 연결됨.

→ 처방: 보유 영양 프로파일(코사인) + 감각 7축 라벨 + 향미 유사도로 사촌 후보 자동 생성, 사람은 검수만

1차 신호 미활용 — 우리 아이들 데이터를 안 본다

앱이 매일 쌓는 아이별 수용/거부·노출 횟수·집vs급식을 네트워크가 안 본다. 모집단 동시출현만 보고 "우리 아이들이 실제로 받아들였나"는 무시. 거부를 boolean 한 칸으로만 봐서 식감거부·맛거부를 못 가른다.

→ 처방: 거부 원인 4분류 + (자녀×식재료) 노출 카운터 + 집/급식 비대칭 — 전부 보유 데이터, 수집비 0
3

무엇을 부어 넣나 — 데이터 3티어

수집비용 순서로 — 이미 보유(0원) → 국가 공공데이터(무료 API) → 유사도 모델. 모든 후보는 §1의 grounded 판정 관문을 통과해야 그래프에 들어간다.

TIER 0

이미 보유 — 수집비용 0

즉시
가장 저평가된 금광. 앱 1차 로그 + 편식극복키트 폴더의 국가 자료들.
앱 meal_logs아이별 수용/거부·거부원인(맛/식감/환경/양)·노출 횟수·집vs급식 → co-acceptance 엣지·lift 보정. 경쟁사가 못 베끼는 해자.
레시피DB(연령분리)영아/유아/아동 분리돼 있는데 풀링 중 → 유아기(2~5세) 가중으로 즉시 2~6세 pair화. 코드 한 곳.
농진청 성분 DB10.4식재료 영양 프로파일 → 영양 유사도 bridge의 재료(이미 nutrient-map 226종 보유).
KDRI 2025연령별 1회량·결핍 판정 기준(1~2세 900 / 3~5세 1,400kcal·나트륨/당 상한).
삼킴사고·알러지 자료만1-2 vs 3-5 질식위험·조리형태 + 8대 알레르겐 → 2~6세 노드 안전 메타.
SOS·푸드브릿지·Satter사촌 차원 정의(식감/색/맛) + 반복노출 모델(채소 8~15회).
TIER 1

국가 공공데이터 — 무료 / OpenAPI

단기 1~2주
"어디서 긁어오나" — 인증키만 받으면 바로 자동화. 국가 레시피 = '어울리는 조합'의 정본 backbone.
⭐ 식약처 영유아 식단 APIdata.go.kr 15118061·15118065 — 만1~5세 표준식단, 끼니 단위(재료·조리법·영양). 초등 freqMap을 영유아로 교체하는 1순위.
⭐ 조리기능사 공개문제큐넷 — 한식 33 + 양식·중식·일식 ≈100과제. 국가자격 표준 + 정확한 지급재료 분량(g) = 최고 권위 궁합.
⭐ 농진청 전통향토음식koreanfood.rda.go.kr3,248개 표준 전통음식·식재료(파일 다운로드).
식약처 COOKRCP / 농정원조리식품 레시피 DB·레시피 재료정보 OpenAPI(재료 개별 분리=co-occurrence에 최적·영양/나트륨 동시).
KNHANES 영유아1~2/3~5세 다소비 순위·결핍(3~5세 칼슘부족 64%·칼륨부족 75~80%·나트륨 과잉) → 결핍 타깃 가중.
어린이급식센터·기호도dietary4u.mfds.go.kr 표준레시피(무염·잘게) + 영유아 채소 기호도(기피=가지·버섯·시금치).
TIER 2

속성 / 유사도 모델 — bridge 자동화

중기 3~6주
사촌(bridge)을 수기 → 데이터로. 세 신호를 합산해 후보를 만들고 사람은 검수만.
① 영양 코사인보유 nutrient-map 226종 벡터화 → 영양 동급 대체재(시금치↔근대). 외부 매핑 불필요·한식 OOV 없음 = 최저비용 1순위.
② 감각 7축 라벨도감 204종에 맛·식감(IDDSI L3~7)·색·온도·형태·향·소리 1회 배치 → 코사인으로 사촌 후보. 푸드체이닝 정의와 정확히 일치.
③ 향미 유사도FlavorDB2 향미 화합물 + 임베딩. ⚠️ 가드: 한식은 향미 화합물을 회피(음성 페어링) → 향 유사도는 bridge(대체재)에만, pair(같은 끼니)엔 절대 금지. pair는 식판 동시출현 유지.
4

판정 엑셀 — 한눈에 결정하게

"수치만으로 자르지 말라"가 여기서 실현된다. 한 줄에 증거를 다 펼쳐 내가 한눈에 판정. 안전플래그는 코드가 빨갛게 미리 띄운다.

ab / 음식종류출처liftcells동시N실제 식판/레시피 예시안전플래그초안내 판정사유
소고기시금치pair조리기능사·식약처1.82147 시금치무침+불고기(식판 3건)…strong✅ 승인또래 식판 빈출
달걀pair영양 코사인0.7244 같은 끼니 거의 없음음성 liftweak❌ 거부우연 이하
견과요거트bridgeflavor 유사도 질식(만3미만)·알레르겐⚠️ 조건부만3+·잘게만
두부근대bridge영양∩감각 닮음: 부드러운 식감·결핍 철분medium✅ 승인식감 사촌·결핍 동급

안전플래그(질식·8대 알레르겐·음성 lift·꿀)는 코드가 자동 계산해 띄운다 → 놓칠 일 없음. 나머지("2~6세에 진짜 맛있고 자연스러운가")는 내가 증거 보고 판정. 이게 "LLM이 한번 더 보고 판단" — 단 편지 때가 아니라 DB 넣기 전, 엑셀에서. 증분 체크포인트로 신규 후보만 검수한다.

5

2~6세 전용 노드 메타데이터

추천이 괴식뿐 아니라 질식·발달 부적합까지 막으려면, 각 노드에 연령 안전·발달 층을 얹는다. 대부분 공공·무료 → 식재료 30~50종 표 정규화가 주 작업.

🫐 질식 위험 + 안전 형태
연령별 권장 조리형태. 포도·방울토마토=세로 4등분, 핫도그=세로 가른 뒤 잘게, 견과={분말3세·잘게5세·통째6세}, 생당근=익히거나 채썰기.
AAP 1.3cm · 식약처 삼킴사고
🥄 식감 단계(IDDSI)
퓨레 L4 → 으깸 L5 → 한입 L6 → 일반식 L7. 식감거부 시 한 단계만 무르게 회전, 2단계 점프는 차단.
IDDSI · SOS 6단계
⚠️ 8대 알레르겐 + 도입
우유·계란·땅콩·견과·밀·콩·생선·갑각류. 조기 소량 도입·반응 관찰. 프로필 알레르기 시 해당 노드 추천 제외/대체.
AAP 2023/2025 · 온보딩
📏 KDRI 1회량·상한
1~2세 vs 3~5세 분리 1회 분량·식품군 권장 횟수·나트륨/당 상한·꿀 금지(만1세 보툴리누스). 결핍 판정·균형의 정답값.
KDRIs 2025
🔁 노출 횟수 카운터
(자녀×식재료) 시도 횟수. 채소 8~15회 미만=진행중→같은 식재료 다른 형태로 재제시, 충족+완식=다음 사촌 승급. 포기 대신 반복을 설계.
보유 meal_logs(수집 0)
😬 신포비아 가중곡선
2~6세가 food neophobia 정점(2세 거부 본격·평균 5세 완화). 2세=가까운 사촌만·5~6세=먼 도약 허용. bridge 거리·도전 강도 조절.
발달 문헌
6

우선순위 로드맵

가장 큰 레버는 신규 수집이 아니라 이미 가진 것 — ①연령 분리 레시피를 합치지 말 것, ②앱 1차 신호를 네트워크에 먹일 것. 나머지는 그 위에 풍성함을 더한다.

즉시 보유 데이터 · 1~2일 · 수집 0
거부 boolean → 원인 4분류(맛/식감/환경/양)로 dormant 식감거부 트리거 활성화 · (자녀×식재료) 노출 카운터로 8~15회 반복노출 · 집/급식 비대칭(급식만 거부=약신호) · 보유 영양 코사인으로 영양 사촌 자동후보 · 레시피DB 연령 가중.
왜: 이미 쌓인 1차 신호를 버리고 있어, 같은 거부를 4갈래로 못 갈라 헛발질하고 1회 권하고 회전시켜 반복노출 효과를 못 살린다.
단기 국가 공공데이터 · 1~2주
식약처 영유아 식단 API(15118061/15118065)로 freqMap·식판 lift를 초등→영유아 교체 · 국가 표준 레시피 코퍼스 통합(농정원·COOKRCP API → 농진청 3,248 → 조리기능사 정량)을 출처 권위 가중으로 병합 · KDRI/KNHANES 상수 전사로 연령 결핍 기준.
왜: 현 또래 빈도가 사실상 초등 입맛 → 영유아 끼니·국가 표준 궁합으로 갈아끼워야 2~6세 현실에 그라운딩된다.
중기 속성/유사도 모델 · 3~6주
도감 204종 감각 7축 라벨 → 감각 코사인으로 bridge 자동화(영양∩감각) · 2~6세 메타 5종(질식·식감·알레르겐·KDRI·신포비아) 표 정규화 후 노드 부착·선택 게이트 · FlavorDB 향미 보강(Ahn 가드: pair엔 향 유사도 금지).
왜: 175개 수기 bridge를 데이터로 계산해 손 큐레이션 병목을 없애고, 왜 사촌인지 근거로 설명하며, 안전 형태·도전 강도를 강제한다.
🎯 한 줄 요약

판단은 빌드타임 한 곳(엑셀 → 내 터미널 검수 → DB). 수치는 후보를 만들고 안전 바닥을 깔고, 사람이 증거를 보고 판정한다. 편지는 검증된 추천을 믿고 쓰고, 런타임에 남는 건 연령·알레르기 결정론 필터(판단 아님)뿐. 떡+달걀의 교훈은 "LLM 빼라"가 아니라 "데이터로 무장시켜라"였다.