← 문서 맵으로

🔧 메뉴→식재료 매핑 엔진 — 개선 전략

2026-06-01 · /mealfred-food-mapping 튜닝 리포트 분석 + 구조적 개선 로드맵

1. 한 줄 요약

엔진은 메뉴명을 식재료로 푸는 4단 파이프라인(learned → rule → scan → LLM)이다. 이번 튜닝으로 무매핑이 17 → 9로 줄었지만, 진짜 신호는 결정론(rule+scan) 해소율이 53%에 정체했다는 것 — 나머지 절반이 LLM으로 샌다. LLM은 비용이자 환각 리스크다(실제로 "상투과자"를 소고기로 지어냈다). 따라서 전략의 본질은 결정론 비중을 끌어올려 LLM을 '진짜 처음 보는 신메뉴'에만 쓰게 하는 것이다.

전략 한 줄: ① 구조적 누수 3개를 규칙으로 메우고(결정론 53→75%) → ② learned_menus 플라이휠로 LLM 의존을 줄이고 → ③ 농진청 성분이 붙는 세션에 NUTRI_MAP을 날조 없이 정확 등재(72→90%).

2. 현재 파이프라인

0차 · 무료
learned
전역 학습사전
이전에 푼 메뉴 재사용
1차 · 무료
rule
MENU_MAP 정확·부분일치
2차 · 무료
scan
표면형(≥2자) 부분문자 스캔
3차 · 유료/위험
LLM
Haiku 추정 — 마지막 수단
어휘 화이트리스트로 필터
↻ 1~3차에서 푼 결과는 learned_menus에 저장 → 다음부터 0차 무료 히트 (플라이휠)

결정론 = 0~2차(무료·안전). 3차 LLM만 비용·환각 위험. 현재 결정론 해소율 53%.

3. 진단 — 3대 구조 이슈 + 환각면

이슈 1 · 1글자 표준명 누수
표준명이 1글자(닭·무)면 scan의 '표면형 ≥2자' 규칙에 통째로 샌다. 닭살·순살닭튀김(단백질), 무채·다시마무채(채소)가 무매핑/빈약으로 직행. → 2자 표면형 자동 등재(닭→닭고기, 무→무).
이슈 2 · 가공식품 베이스 부재
햄·핫도그가 사전에 아예 없어 LLM으로 직행. 가공식품은 종류가 한정적이라 사전이 가장 효율적. → 가공식품 베이스 사전(햄·소시지·핫도그·어묵·맛살·베이컨…) + processed 플래그.
이슈 3 · 복합메뉴 주재료 누락
"다시마무채국"이 주재료 를 놓치고 다시마 하나만 잡아 빈약. → 접미사(국·볶음·무침…) 제거 후 주재료 토큰 분해·스캔.
⚠️ 환각면(LLM) — 모르는 메뉴에 그럴듯한 단백질을 지어낸다("상투과자→소고기"). 방어: ① "모르면 빈 배열" 프롬프트(적용) ② 표준 어휘 화이트리스트 통과분만 채택(적용) ③ 저신뢰 1회성은 learned 저장 보류(아래).

4. 개선 전략 (3단계)

Phase 1 — 결정론 보강 즉시

· 1글자 표준명 → 2자 표면형 자동 등재(닭→닭고기/닭살/닭볶음, 무→무채/무국)
· 가공식품 베이스 사전 추가 + processed 플래그
· 복합메뉴 분해 — 접미사 제거 후 주재료 토큰 스캔(다시마무채국 → 다시마+무)

🎯 무매핑 9→0 · 결정론 해소율 53%→75% · LLM 호출 절반으로

Phase 2 — LLM 의존 축소(플라이휠) 상시

· learned_menus가 실메뉴에서 자라 다음부터 0차 무료 히트, 야간 remap 크론이 빈 행 백필
· LLM 결과는 어휘 화이트리스트 통과분만 learned 저장(환각 오염 차단)
· 저신뢰 1회성(핑거마들렌·삼색초무침 등)은 learned 저장 보류 — 사전 오염 방지

🎯 LLM 호출율 추적 · 환각 incident 0 유지

Phase 3 — NUTRI_MAP 정확 등재(농진청) 소스 필요

· 영양 커버리지 72%(147 중 106, 41 미등재). 카테고리 근사 시드는 런타임 빗대기와 동일 → 실익 0
· 농진청 식품성분 소스로 정확값 등재 — 값 날조 금지 원칙(없는 값은 회색 reference로 정직하게)
· 분류: 실식재료(쑥갓·아욱·더덕·레몬·게맛살…) = 등재 대상 / 노이즈(케찹·소스·육수·젓) = 풀 정리

🎯 농진청 붙는 세션에 /mealfred-food-mapping 재호출 → 72%→90%+

5. 측정 지표 (KPI)

지표현재목표의미
무매핑율9 / 2420식재료를 못 푼 메뉴
결정론 해소율(rule+scan)53%75%+무료·안전 경로 비중 ↑
LLM 호출율~47%<20%비용·환각 표면 ↓
환각 incident1건 해결(상투과자)0없는 재료 지어냄
NUTRI_MAP 커버리지72%90%+농진청 소스 후

6. 백로그 처리 원칙

분류처리
오타(명시 금지)단백실쉐이크·시레깃국사전 등재 X — 정규화 레이어에서만 교정
모호/1회성삼색초무침·핑거마들렌·쥐포채무침LLM 위임 + learned 저장 보류
노이즈(식재료 아님)토마토케찹·굴소스·멸치육수·단무지풀에서 정리 후보
EXTRA 동반 등재양배추비트무침의 비트EXTRA + 영양 동반 등재(다음 회차)

7. 운영 메모 — 스킬 도구

⚙️ 이 환경 Node v25가 ESM에서 JSON import에 type 속성·확장자를 강제해 node scripts/… 직접 실행이 막힌다. 이번엔 무손상 로더(/tmp/json-preload.mjs + --import)로 우회했다. 영구 고정 권장 = tsx 의존성 추가(표준적·로더 관리 불필요) 또는 로더를 리포에 포함.

출처: /mealfred-food-mapping 튜닝 리포트(2026-06-01, meal_logs 76행·코퍼스 90·실메뉴 151고유) · 매핑 코어 lib/menuMapCore.ts·lib/menuMap.ts·lib/learnedMenus.ts · 영양 lib/nutrition.ts NUTRI_MAP