본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 08. 10:15

Gemini Vision과 pg_trgm 퍼지 매칭(Fuzzy Matching)을 활용한 3초 완성 의약품 검증기 구축

요약

Gemini 1.5 Flash Vision과 PostgreSQL의 pg_trgm 확장을 결합하여 의약품 사진을 분석하고 저렴한 대체제를 찾아주는 Agada 서비스를 구축한 사례입니다. 이미지에서 구조화된 데이터를 추출하고 퍼지 매칭을 통해 불완전한 텍스트 데이터를 정확하게 매칭하는 파이프라인을 설명합니다.

핵심 포인트

  • Gemini 1.5 Flash를 활용한 이미지 내 구조화된 JSON 데이터 추출
  • pg_trgm과 GIN 인덱스를 이용한 의약품 명칭 퍼지 매칭 구현
  • 유사도 점수에 따른 CDSCO Verified 및 AI Estimated 배지 구분
  • 민감한 건강 정보 보호를 위한 스캔 기록 미저장 원칙 준수

문제점

인도 가계는 매년 약 **65,000억 루피(₹65,000 crore)**를 본인 부담 의약품 비용으로 지출합니다. 그중 상당 부분은 브랜드 의약품에 사용되는데, 정작 동일한 분자 구조(동일한 활성 성분, 동일한 용량, 동일한 CDSCO 승인)를 가진 약품이 Jan Aushadhi 매장에는 훨씬 저렴한 가격으로 판매되고 있습니다. Dolo-650 한 스트립의 소매가는 32루피인 반면, Jan Aushadhi 파라세타몰은 4.90루피입니다. 문제는 저렴한 약이 있는 것이 아니라, 환자에게 그런 약이 있다는 사실을 아무도 알려주지 않는다는 점입니다.

우리는 이 문제를 해결하기 위해 Agada를 구축했습니다. 약 스트립 사진을 찍으세요. 3초 후면 해당 약이 CDSCO에 등록되었는지, 실제 효능은 무엇인지, 그리고 더 저렴한 버전의 가격은 얼마인지 알 수 있습니다. 로그인도 필요 없고, 앱 설치도 필요 없습니다. 무료입니다.

전체적인 작동 방식은 다음과 같습니다.

파이프라인

[휴대폰 카메라] -> [클라이언트 압축] -> [Gemini 1.5 Flash vision]
                                              |
                                              v (구조화된 JSON: 브랜드, 분자, 용량)
...

이미지가 백엔드에 도달하면 세 가지 작업이 병렬로 진행됩니다. Gemini가 구조화된 필드를 추출하고, Supabase가 세 개의 독립적인 조회(lookup)를 실행합니다. 전체 소요 시간(Wall-clock time)은 Gemini가 대부분을 차지합니다(~1.8초). DB 쿼리는 80-150ms 내에 완료됩니다.

pg_trgm을 활용한 퍼지 매칭 (Fuzzy matching)

인도의 의약품 명칭은 매우 혼란스럽습니다. CDSCO 등록부에는 Crocin 500mg Tablet IP, CROCIN 500, _Crocin Advance_가 각각 별개의 행으로 존재합니다. 스트립 사진이 표준 명칭과 정확히 일치하는 경우는 드뭅니다. 종이는 구겨질 수 있고, 글꼴은 다양하며, 제조업체마다 약어를 사용하기 때문입니다.

우리는 GIN 인덱스와 함께 PostgreSQL의 pg_trgm 확장을 사용합니다:

CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE INDEX drugs_brand_trgm_idx
  ON drugs USING GIN (brand_name gin_trgm_ops);
...

% 연산자는 트리그램 유사도(trigram similarity)가 pg_trgm.similarity_threshold를 초과할 때 true를 반환합니다. 이를 접두사 일치(prefix matches)를 위한 ILIKE와 결합하면, 오탐(false positives)에 빠지지 않으면서도 지저분한 OCR 결과에 대해 재현율(recall)을 확보할 수 있습니다. 신뢰도 점수(Confidence scores)는 UI에 노출됩니다. 유사도가 0.4 미만인 경우, 결과에 CDSCO Verified 대신 AI Estimated라고 표시합니다.

잘못된 확신보다 중요한 출처의 투명성

모든 결과 카드에는 CDSCO Verified, Jan Aushadhi / BPPI, 또는 AI Estimated라는 배지가 붙습니다. AI 배지에는 항상 _"약사와 확인하십시오(verify with a pharmacist)"_라는 문구가 포함됩니다. 우리는 가짜 약처럼 보이는 약품 팩에 잘못된 정당성을 부여하느니, 차라리 "찾을 수 없음"이라고 말하는 쪽을 택했습니다.

우리는 의도적으로 스캔 기록을 저장하지 않습니다. 정신과 약물이나 종양학(oncology) 약물을 촬영하는 사용자는 민감한 건강 정보를 공유하는 것이기 때문입니다. 계정도, 기록도, 사람들이 무엇을 스캔하는지에 대한 분석 데이터도 남기지 않습니다.

데이터 소스

  • CDSCO 승인 의약품 목록 — 30만 개 이상의 행, cdscoonline.gov.in에서 분기별로 업데이트
  • Jan Aushadhijanaushadhi.gov.in
  • NPPA 가격 상한선nppaindia.nic.in
  • 트래픽이 가장 높은 분자(molecules)들을 위해 엄선된 데이터셋, Supabase가 설정되지 않았을 때를 대비한 로컬 폴백(fallback) 포함

스택 (Stack)

  • 프론트엔드 (Frontend): React 18 + Vite, 업로드 전 클라이언트 측 이미지 압축 (4MB 휴대폰 사진을 약 250KB JPEG로 압축)
  • 비전 + NLG (Vision + NLG): Gemini 1.5 Flash (정보 추출을 위한 호출 1회, 평이한 영어 설명을 위한 호출 1회)
  • DB: Supabase / PostgreSQL 15 (pg_trgm 포함)
  • API 레이어 (API layer): Vercel 서버리스 함수(serverless functions), ESM (type: module)
  • i18n: 6개의 인도 언어 (EN, HI, TA, BN, TE, MR)
  • 호스팅 (Hosting): Vercel

가격 엔진은 Supabase에 접속할 수 없는 경우 하드코딩된 JAN_AUSHADHI_DB로 폴백됩니다. 이를 통해 모든 결과에는 여전히 가격 정보 행이 포함됩니다.

다음 단계

WhatsApp 봇. 5억 명 이상의 인도인이 WhatsApp을 사용하고 있습니다. 약국 카운터에서 브라우저를 열고 싶어 하는 사람은 아무도 없습니다. 사진을 번호로 변환하는 (photo-to-number) 흐름을 도입한다면 하룻밤 사이에 도달 범위가 10배로 늘어날 것입니다. 그다음으로는 연결 상태가 좋지 않은 Tier-3 Jan Aushadhi 매장을 위한 오프라인 모드, 그리고 라스트 마일 (last-mile) 격차를 해소하기 위한 "가장 가까운 Kendra 찾기" 지도가 필요합니다.

직접 체험하기: agadahealth.vercel.app
소스 코드: github.com/AmSach/agadahealth
팀: Aman Sachan, Siddharth Lalwani, Chetna Kalra, Syed Akbar — Team Agada, Open Innovation 2026.

제약업계의 가격 폭리 (price gouging)에 맞서기 위해 Gemini vision과 정부 의약품 데이터베이스를 사용하여 구축되었습니다. 데이터 보관 없음, 유료 결제 없음, 계정 생성 없음.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0