본 프로젝트는 국내 의료 서비스를 이용하는 외국인을 위한 의료 문서 인식 AI 모델입니다. Vision Language Model(VLM)을 기반으로 한국의 처방전, 건강검진 결과지, 진료비 영수증 등 복잡한 의료 문서를 정밀하게 분석하고 인식합니다.
이 프로젝트의 UI와 전체 소개는 여기 에 들어가면 보실 수 있습니다.

국내 거주 외국인이 급증하고 있음에도 불구하고, 복잡한 의료 약어와 한국어 특유의 서식(처방전, 영수증 등)으로 인해 외국인 유저들은 자가 조치나 복약 지도 이해에 큰 어려움을 겪고 있습니다. 기존 번역기로는 전문 용어 인식과 레이아웃 파악에 한계가 있어 사후 관리가 불가능한 페인 포인트를 확인했습니다.
의료 문서 사진 한 장으로 정보를 구조화하여 제공하고, 단순 번역을 넘어 LangChain 기반의 사후 케어 챗봇을 연계하여 외국인의 지역 사회 정착을 돕는 '의료 전반 도우미'를 지향합니다.
- Document Capture: 외국인 사용자가 한국어 처방전/영수증 사진 촬영 및 업로드.
- VLM Analysis: Fine-tuning된
Qwen2.5-VL-7B모델이 문서의 레이아웃을 파악하고 Key-Value 데이터를 추출. - Structured Translation: 추출된 의료 정보를 유저의 모국어(중국어 등)로 구조화하여 표시(환자정보, 약품명, 복용법 등).
- Interactive Care (RAG): LangChain을 통해 약품 정보 API 및 지식 베이스와 연동, 사용자의 부작용 질의나 추가 복용법에 대해 실시간 답변 제공.
- Continuous Support: 일회성 인식을 넘어 챗봇과의 대화를 통한 지속적인 건강 상태 트래킹.
- Base Model: Qwen2.5-VL-7B-Instruct
- Fine-tuning Model: qwenvl-7B-medical-ko-zh
- 문제: 사용한 VLM은 범용적인 이미지 인식 능력은 뛰어났으나, 국내 의료 처방전 이미지에 대한 사전 학습이 부족하여 인식률이 낮았습니다. 특히 병원마다 처방전 레이아웃의 종류가 매우 다양해, 단순 OCR 방식으로는 '약품명 - 실제이름' 같은 Key-Value 구조를 정확히 추론하지 못하는 문제가 있었습니다.
- 해결: 처방전의 구조가 본질적으로 Key-Value 형태임을 파악하고, 모델이 레이아웃의 다양성에 대응하도록 학습 데이터를 전략적으로 설계했습니다.
- 레이아웃 이해 보조: 처방전과 구조적으로 유사한 영수증 데이터 300장을 포함하여, 모델이 서식 내에서 항목과 값의 관계를 파악하는 기초 체력을 기르도록 했습니다.
- 도메인 다양성 확보: 10종의 상이한 처방전 레이아웃을 기반으로 합성 데이터 1,000장을 구축하여 의료 도메인 파인튜닝을 진행했습니다.
- 구조적 추론 강화: 모든 데이터를 **LLaVA 포맷(Key-Value 대화 형태)**으로 구성하여, 모델이 위치 정보에 의존하지 않고 문서의 의미적 연결 구조를 스스로 이해하도록 학습시켰습니다.
- 문제: 한국어 처방전의 미세한 획 차이(ㅗ, ㅜ 등)를 기존 모델이 정밀하게 구별하지 못해 약품명 오인식이 발생했습니다. 또한 7B 모델 전체를 한 번에 학습하기엔 리소스가 과다하고 기존 지식이 파괴될 위험이 있었습니다.
-
해결: 시각적 인지 능력을 높이기 위해 **Vision Tower와 Merger(Projection Layer)**를 모두 언프리징하여 직접 학습했습니다.
- 단계적 접근: 초기에는 LLM 위주로 학습하여 안정성을 확보하고, 이후 비전 모듈을 열어 학습 영역을 확장했습니다.
-
하이퍼파라미터 최적화: 모듈별 특성에 맞춰 **차등 학습률(Vision
$1e-5$ , LLM$2e-4$ )**을 적용하여 수렴 안정성을 높였습니다.
-
문제: VLM 모델은 처방전에서 '아스피린'이라는 텍스트를 인식할 수는 있지만, 이 약이 어떤 약인지, 부작용은 무엇인지에 대한 최신 전문 지식은 없습니다. 단순히 번역만 해주는 것은 외국인 환자의 사후 케어에 한계가 있었습니다.
-
해결: LangChain Retriever를 활용해 인식 결과와 전문 지식을 결합했습니다.
- 키워드 추출: VLM이 인식한 약품명(예: 아스피린)을 랭체인에 전달합니다. -전문 지식 출력: 랭체인이 외부 약품 API나 DB에서 '아스피린의 복용법, 주의사항' 텍스트를 긁어옵니다. -프롬프트 주입: 사전에 적은 프롬프트 엔지니어링에 따라서 긁어온 텍스트를 챗봇처럼 문장 단장을 해줍니니다.
-
효과: AI가 처방전 사진 한 장만 보고도 "이 약은 졸릴 수 있으니 운전 시 주의하세요"와 같은 실제 약사가 해주는 수준의 맞춤형 답변을 할 수 있게 되었습니다.
의료 데이터의 법적 제약과 보안 문제를 해결하기 위해 직접 설계한 합성 데이터와 실제 영수증 데이터를 조합하여 학습을 진행했습니다.
- Total Train Data: 1,300 samples
- 합성 의료 문서 (약 77%): 10종의 의료 문서 템플릿을 기반으로 생성한 1,000장의 한국어 처방전 데이터. (Key-Value 구조 강화 및 한국어 인식 특화)
- 실제 영수증 문서 (약 23%): 필드 단위 추출의 안정성을 높이기 위해 추가한 300장의 한국어 영수증 데이터.
- Data Format: LLaVA 포맷 (이미지 + 멀티턴 대화 구조).
- Dataset Link: Rfy23/synth_fake_prescriptions
만약 데이터셋을 커스텀하고 싶다면, 아래 LLaVA 포맷 형태를 유지하여 커스텀 하세요. 단, 태그는 반드시 들어가야 하고,
값인 image_path도 반드시 해당 파일에 존재하여야 합니다.
{
"id": "00427_zh",
"image": "data/ko_zh_datasets/train/00427_zh.jpg",
"conversations": [
{
"from": "human",
"value": "<image>\n以下是韩语处方\n请告诉我这张处方上的病人姓名和身份证号码。"
},
{
"from": "gpt",
"value": "病人姓名: 조하은, 身份证号: 910520-2469452"
},
{
"from": "human",
"value": "我得的是什么病?"
},
{
"from": "gpt",
"value": "疾病编码: H54, G43。"
},
{
"from": "human",
"value": "请把处方上的药都解释一下。"
},
{
"from": "gpt",
"value": "处方药物: 심바스타틴 20mg, 每次剂量: 5ml, 每日服用次数: 1, 总疗程: 7\n处方药物: 암로디핀 5mg, 每次剂量: 5ml, 每日服用次数: 2, 总疗程: 14\n处方药物: 아스피린 100mg, 每次剂量: 5ml, 每日服用次数: 3, 总疗程: 7日"
},
{
"from": "human",
"value": "这张处方上写了什么?"
},
{
"from": "gpt",
"value": "病人姓名: 조하은\n身份证号: 910520-2469452\n处方日期: 2025-10-27\n疾病编码A: H54\n疾病编码B: G43\n处方药物: 심바스타틴 20mg, 每次剂量: 5ml, 每日服用次数: 1, 总疗程: 7\n处方药物: 암로디핀 5mg, 每次剂量: 5ml, 每日服用次数: 2, 总疗程: 14\n处方药物: 아스피린 100mg, 每次剂量: 5ml, 每日服用次数: 3, 总疗程: 7日"
}
.
├── data/ # 합성 처방전 및 영수증 데이터셋 (.json 및 이미지 파일)
├── scripts/ # 모델 학습 및 평가를 위한 Shell 스크립트
│ └── finetune_lora.sh
├── src/ # 메인 소스 코드
│ ├── dataset/ # 데이터 로딩 및 전처리 로직 (VLM 형식 변환)
│ ├── loss/ # 학습을 위한 커스텀 손실 함수 정의
│ ├── model/ # Qwen-VL 모델 아키텍처 및 설정 관련 코드
│ ├── serve/ # 추론(Inference) 및 API 서빙 관련 코드
│ ├── train/ # SFT(Supervised Fine-Tuning) 메인 실행 스크립트
│ └── trainer/ # 파이토치/DeepSpeed 기반 학습 엔진 관리
└── output/ # 체크포인트 및 학습 로그 저장 폴더 ➡️ .gitignore
requirements.txt 설치
pip install -r requirements.txtlora fine-tuning 실행
cd scripts
bash finetune_lora.sh-
Base Model:
Qwen2.5-VL-7B-Instruct -
Optimization:
DeepSpeed ZeRO-3 Offload,Liger Kernel,LoRA -
Learning Rate: LLM(
$5\times10^{-6}$ ), Vision($2\times10^{-6}$ ), Merger($1\times10^{-5}$ ) -
Framework:
PyTorch,LangChain, FastAPI
