catfood-feeder
사료 라벨과 제조사 문서에서 고양이 사료의 영양 성분을 모으고, 근거가 확인된 값만 카탈로그에 올리는 Next.js 애플리케이션입니다. 모델이 제안한 수치는 함께 제출한 근거 발췌문 안에 실제로 있을 때만 통과하고, 계산과 판정은 서버 코드가 다시 수행합니다.
한눈에 보기
| 항목 | 내용 |
|---|---|
| 상태 | 수집·분석 기능을 구현하는 중이며, 지금은 혼자 사용하고 있습니다 |
| 링크 | catfood.donminzzi.kr · GitHub |
| 기술 스택 | Next.js · TypeScript · Supabase(PostgreSQL) · Anthropic API |
| 구조 | 에이전트는 출처 URL과 발췌문을 제안만 하고, 서버가 그 페이지를 다시 가져와 발췌문과 수치를 검증한 뒤에만 초안으로 저장합니다. 영양 성분마다 출처 종류(제조사 자료, 국내 등록 라벨)를 따로 기록합니다. |
| 데이터 범위 | 수입 여부로 조사할 브랜드를 고르고, 고른 브랜드는 국내에 수입되지 않은 제품까지 제조사의 제품군 전체를 다룹니다 |
프로젝트 이야기
프로젝트를 어떻게 시작하게 되었나요?
고양이를 기르게 되었는데, 어느 날 고양이 턱에 블랙헤드 같은 것이 잔뜩 생겼습니다. 카페에서는 잘 치료하는 방법이나 그릇을 바꾸라는 등의 단기적인 대책만 알려 줬습니다. 그릇에 기름이 묻어 있으면 그럴 수 있다는데, 사료에 왜 이렇게 기름이 많이 들어가나 싶어서 더 비싼 사료를 고르고 골라 먹여 봤습니다. 그랬더니 닦을 필요도 없이 금세 나았고, 몸의 털에도 윤기가 흘렀고, 무엇보다 너무 맛있다며 노래를 부르며 밥을 먹는 고양이를 보고 사료를 공부해야겠다고 마음먹었습니다.
그날부터 국내산 사료와 수입산 사료를 전부 블로그에 브랜드별로 정리하기 시작했고, 그렇게 100개가 넘는 글을 쓰고서야 나름의 데이터베이스가 쌓였습니다. 하지만 이런 데이터는 언제든지 낡을 수 있습니다. 그래서 데이터를 정기적으로 업데이트하고, 텍스트 속에서 진짜 인사이트를 찾아 줄 도우미가 필요해졌습니다.
진행하며 만난 가장 큰 문제는 무엇이었으며, 어떻게 해결했나요?
가장 큰 문제는 모델이 그럴듯한 숫자를 만들어 내는 것을 어떻게 막느냐였습니다. 그래서 모델을 신뢰하지 않는 것을 전제로 설계했습니다. 에이전트는 출처 URL과 발췌문을 제안만 하고, 서버가 그 페이지를 직접 다시 가져와 발췌문과 수치가 실제로 있는지 확인한 뒤에만 초안으로 저장합니다.
이 경계를 처음 실제로 돌려 볼 때, 이미 손으로 입력해 둔 값이 있는 같은 레시피의 사료를 정답지로 삼았습니다. 에이전트가 제안한 값은 정답지와 거의 같았지만, 서버는 세 번 모두 아무것도 저장하지 않았습니다. 근거 문장을 담은 출처를 보관할 수 없었기 때문입니다. 경계는 제대로 동작했지만, 원인을 따라가 보니 수집 단계에 결함이 두 개 있었습니다.
첫째, 응답 크기 제한을 저장하는 텍스트가 아니라 원본 HTML 크기에 걸고 있었습니다. 제조사 제품 페이지는 원본이 267,880바이트였지만, 보이는 텍스트로 추리면 9,546자였습니다. 그런데도 256KB 제한에 걸려 거부되고 있었습니다.
둘째, 보이지 않는 요소를 지우는 과정에서 영양 성분표가 함께 지워지고 있었습니다.
제조사 페이지는 성분표를 탭 패널에 넣고 비활성 탭에 hidden을 붙이는데, 그 요소를 숨김 요소로 보고 삭제한 것입니다.
수집은 성공으로 기록되는데 데이터만 조용히 비어 있어서, 세 단계 뒤에서는 "추출 결과 없음"으로만 보이는 가장 찾기 어려운 형태의 결함이었습니다.
두 결함을 고친 뒤에는 근거 7개가 저장되었고, 단백질·지방·섬유·수분·칼슘이 기존 값과 정확히 일치했습니다. 반대로 인은 제조사 발췌문에 1.4%로 적혀 있었지만, 사람이 직접 정리해 둔 기존 값은 1.30이었습니다. 검증 파이프라인을 맞춰 보는 과정에서, 오히려 사람이 만든 데이터의 오류를 찾아낸 셈입니다.
그 뒤에도 "검증된 발췌문은 숫자를 제대로 인용했다는 것만 증명할 뿐, 그 페이지가 맞는 제품이라는 것은 증명하지 못한다"는 문제를 만났습니다. 레시피 네 개를 한 표에 싣는 페이지에서 다른 레시피의 행을 읽거나, 고양이 사료 행에 개 사료 페이지가 출처로 붙은 경우였습니다. 같은 페이지 하나가 같은 브랜드의 여러 사료를 뒷받침하고 있으면 의심하도록 조회 조건을 만들어 이런 경우를 찾고 있습니다.
지금 사용자는 얼마나 되나요?
지금은 저 혼자 사용하고 있습니다. 아직 수집 기능과 분석 기능을 구현하는 중이지만, 앞으로는 사용자가 쉽게 들어와서 자기 고양이에게 맞는 사료를 찾아보고, 먹이는 사료를 기록하고, 사료 성분표를 직접 업데이트해 제보할 수 있는 환경을 만들 예정입니다.