dev.to

The 90-day window every medical shop misses: I built ShelfMitra to catch it, in Tamil, Hindi and English

약국 반품 기한을 놓치지 않도록 돕는 ShelfMitra

ShelfMitra는 인도 약국의 의약품 재고와 판매 속도를 확인해 유통업체 반품 기한을 놓칠 위험이 있는 제품을 알려주는 도구입니다. 송장 사진 인식, TabPFN 기반 재고 위험 예측, Temporal 알림을 결합하고 타밀어·힌디어·영어를 지원합니다.

에디터 노트

가장 설득력 있는 부분은 모델 예측을 단순 규칙과 비교하고, TabPFN을 실행하지 못하는 데모에서는 대체 방식을 화면에 밝힌 점입니다. 다만 벤치마크는 한 약국의 공개 판매 기록에 가상 배치를 더해 만든 평가라, 실제 약국의 반품 정책과 판매 패턴에서도 같은 성능이 나오는지는 확인되지 않았습니다. 실제 도입 판단에는 약국별 판매 데이터로 위험 예측을 검증하는 과정이 필요합니다. 반품 요청 자동화와 지속 알림의 구현은 구체적으로 설명했지만, 299루피 요금이 실제 운영 비용과 지원 부담까지 감당하는지는 자료에 계산이 없습니다.

AI 요약

인도 약국은 유통업체가 의약품 반품을 받아주는 기한을 놓치면 재고 손실을 감수해야 합니다. 기준은 보통 유통기한 만료 60~90일 전이지만, 수천 개 품목의 판매 속도와 유통기한을 매일 대조하기는 어렵습니다. ShelfMitra는 의약품별 반품 마감 시점과 판매량을 확인해 기한 안에 반품해야 할 품목을 알려줍니다.

송장 인식과 위험 판단

사용자가 유통업체 송장을 촬영하면 Qwen 비전 모델이 표를 읽습니다. 배치 번호와 유통기한, 수량, 금액은 Python 코드가 따로 검증하며, 검사에 실패한 항목은 추측해 저장하지 않고 약사에게 확인을 요청합니다. 예를 들어 인쇄된 유통기한이 03/27이면 해당 월 말일인 2027년 3월 31일로 처리합니다.

재고가 반품 기한까지 팔리지 않을 위험은 TabPFN-3.5가 예측합니다. 앱은 위험도와 남은 기간을 바탕으로 지금 반품할지, 재주문을 멈출지, 계속 관찰할지를 정하고 손실 가능 금액 순서로 재고를 보여줍니다. 주인은 타밀어, 힌디어, 영어로 반품 요청을 작성해 WhatsApp 메시지로 보낼 수 있습니다. 대화형 에이전트는 주문 문의를 받아 기존 재고까지 반영해 새 주문의 위험을 계산합니다.

예측 벤치마크와 지속 알림

인도 약국의 공개 판매 데이터가 없어 개발자는 Kaggle의 약국 한 곳, 8개 약품군, 6년치 일일 판매 데이터를 사용했습니다. 실제 판매 기록에 가상의 배치와 반품 기한을 넣고, 기한이 됐을 때 재고의 10%를 넘게 남길지 예측했습니다. 2014~2017년 자료로 학습하고 2018~2019년 자료로 평가했으며, 각 설정을 다섯 개 시드로 실행했습니다.

판매 속도와 남은 기간만 이용한 단순 규칙은 ROC-AUC 0.903, F1 0.849를 기록했습니다. TabPFN-3.5는 학습 배치 50개에서 ROC-AUC 0.895였고 100개에서는 0.909, 500개에서는 0.949를 기록했습니다. 개발자는 TabPFN을 쓸 수 없을 때 단순 규칙으로 전환하고, 화면에 어떤 방식을 사용 중인지 표시합니다.

배치마다 Temporal 워크플로를 만들어 반품 마감 전 60일, 30일, 14일, 7일, 2일에 확인합니다. 위험이 있는 배치에만 알림을 보내며, 사용자가 반품 또는 판매 완료를 표시하면 감시를 끝냅니다. 개발자는 워커를 강제 종료하는 테스트에서 복구 후 밀린 체크포인트가 실행되는지 확인했습니다. 활동은 재시도 정책에 따라 다시 실행되므로 모델 호출이나 연결 문제가 생겨도 알림이 사라지지 않도록 설계했습니다.

한계와 운영 비용

공개 데모는 Render 무료 인스턴스의 메모리가 512MB라 TabPFN을 실행하지 못합니다. 따라서 데모에서는 단순 규칙을 사용하고 화면에 이를 표시합니다. TabPFN은 CPU 평가 중 약 2.3GB 메모리를 사용합니다. 개발자가 8GB M1 Mac에서 시험한 로컬 송장 인식은 3B 모델로 104초가 걸렸고, 8개 유통기한을 모두 읽었지만 배치 번호 하나를 잘못 읽었습니다. 그래서 인식 결과를 약사가 확인하도록 했습니다.

호스팅 모델을 사용한 송장 한 건 처리 비용은 약 0.0055달러, 질문 한 건은 약 0.0005달러였습니다. 매일 송장을 한 번 촬영하고 한 달에 100회 질문하는 약국의 모델 호출 비용은 약 0.22달러, 약 20루피로 계산했습니다. 개발자는 월 299루피 요금을 제안합니다. 공개 데모는 무료 인스턴스에서 실행되며 상태가 임시 디스크에 저장됩니다. 실제 운영을 위한 Render 설정에는 TabPFN을 실행할 메모리와 영속 디스크가 필요합니다.

dev.to 반응

  • @apples_one_cd174284bffb — 저장소 링크를 공유했습니다: github.com/vignesh2027/shelfmitra.git

원문: dev.to / 번역·요약: Trawling