food-db
by Ryugi62
README.md
# 영양 정답지 (food-db-answer-key)
AI 챗봇이 말한 식품 영양값을 **농촌진흥청 국가표준식품성분 DB 10.4**로 채점하고, AI가 처음부터 DB 값으로 답하게 연결하는 웹 + MCP 서버 + 오차 실측 원자료.
> 출처: 농촌진흥청, 2026. 국가표준식품성분 DB 10.4. https://koreanfood.rda.go.kr (공공누리 제1유형·출처표시)
## 무엇이 들어 있나
| 경로 | 내용 |
|---|---|
| `web/` | 정적 웹. 3,366식품 검색 → 가식부 100 g·섭취량 환산 18성분 → 표시 기호(`-` 결측·`Tr` 미량·`( )` 산출) 원문 풀이 → AI 답변 붙여넣기 채점. 외부 요청 0, 입력은 브라우저 밖으로 나가지 않음 |
| `mcp_server.py` | MCP 서버(표준 입출력). 도구 `search_food` · `get_nutrients` · `check_answer`. 파이썬 3.8+ 표준 라이브러리만(설치 0) |
| `results/` | 오차 실측 결과 — [요약](results/summary.md) · `summary.json` · `measurements.csv` |
| `data/sample.json`, `data/runs/*.jsonl` | 사전 등록 규칙으로 뽑은 100식품, AI 원 응답 전부(모델명·도구 호출 기록 포함) |
| `SPEC.md` | 목적·용어·수용 기준(표본 규칙·질문 문안·허용폭은 실측 전에 고정) |
## AI에 연결하기 (MCP)
Claude Desktop `claude_desktop_config.json`:
```json
{ "mcpServers": { "food-db": { "command": "python3", "args": ["/경로/food-db-answer-key/mcp_server.py"] } } }
```
Codex CLI:
```bash
codex -c 'mcp_servers.food-db.command="python3"' -c 'mcp_servers.food-db.args=["/경로/food-db-answer-key/mcp_server.py"]'
```
모든 도구 결과에 출처 표기 문자열이 붙고, 결측(`-`)은 0으로 바꾸지 않습니다.
## 실측 재현
```bash
python3 -m venv .venv && .venv/bin/pip install openpyxl pytest
# 1) DB 10.4 엑셀(농식품올바로 → 국가표준식품성분표 → DB(Excel) 다운로드) → web/data/foods.json
.venv/bin/python -m answerkey.infrastructure.cli build-data --xlsx "식품성분표(10개정판).xlsx"
# 2) 표본(seed 20260924, 식품군 비례 100식품)
.venv/bin/python -m answerkey.infrastructure.cli sample
# 3) 질문(웹 검색 끔) — 기억으로 답함 / DB 연결(MCP)
.venv/bin/python -m answerkey.infrastructure.cli measure --model claude --condition ungrounded
.venv/bin/python -m answerkey.infrastructure.cli measure --model gpt --condition grounded
# 4) 집계(숫자는 원 응답에서 다시 계산)
.venv/bin/python -m answerkey.infrastructure.cli report
```
DB가 갱신되면(10.5 등) 1)만 다시 돌리면 웹·MCP가 새 값으로 바뀝니다.
## 테스트
```bash
.venv/bin/python -m pytest -q # 도메인·유스케이스·어댑터·MCP 왕복
node --test tests/js/grade.test.mjs # 웹 채점 규칙(파이썬과 같은 픽스처)
python3 scripts/capture_web.py # 390/1280 캡처 + 가로 스크롤·외부 요청·채점 동작 검사
```
## 판정 규칙
허용폭 = max(DB값의 20%, 바닥값: 에너지 5 kcal · 단백질·지방·탄수화물·당류 0.5 g · 나트륨 5 mg). 차이가 허용폭을 넘으면 「이탈」.
이 규칙은 이 프로젝트가 정한 비교 기준이며 법정 기준이 아닙니다. 20%는 실측 전에 고정했고(SPEC v0.1), 10%·30%로 바꾼 결과도 `results/summary.json`의 `sensitivity`에 함께 냅니다.
## 한계
- 표본은 DB 안의 무작위 100식품이고, 국민 섭취 빈도로 가중하지 않았습니다.
- AI는 각 회사의 명령줄 도구로 불렀고 웹 검색을 껐습니다(codex CLI 0.153.4 · gpt-6-astra · 추론 강도 기본값 none / Claude Code CLI 2.1.281 · claude-opus-5-5). 앱 화면의 챗봇과 설정이 다를 수 있습니다.
- 질병·식이 처방을 대신하지 않습니다.
## 라이선스
코드: MIT. 데이터 `web/data/foods.json`은 국가표준식품성분 DB 10.4에서 변환한 것으로 원 저작권은 농촌진흥청에 있으며 공공누리 제1유형(출처표시) 조건을 따릅니다.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues