Healthcare AI Solution

Medinote

사용자가 복용 중인 약 정보와 건강 기록을 저장하고, LLM 기반 의료 챗봇을 통해 질병·약물 관련 질문에 답변하는 개인 의료 정보 관리 서비스 입니다.

Medinote Main

소개

Medinote는 흩어져 있는 처방전과 진료 기록을 구조화된 데이터로 정리하고, 복약 이력을 체계적으로 관리할 수 있도록 돕는 서비스입니다. 특히 단일 RAG 구조가 가지는 환각과 도메인 혼선 문제를 해결하기 위해, 질문 의도를 파악하는 Supervisor와 6개의 전문 도메인 에이전트로 구성된 멀티 에이전트 아키텍처를 주도적으로 설계 및 구현하여 보다 정확하고 안전한 의료 정보를 제공합니다.

핵심 기능

자동 복약 기록

처방전과 약 사진을 찍으면 OCR이 핵심 정보를 추출하여 자동으로 복약 리스트를 생성합니다.

상호작용 위험 경고

병용 금기나 주의 사항을 데이터베이스 기반으로 분석해 사용자에게 즉각적인 주의 메시지를 전달합니다.

멀티 에이전트 기반 AI 챗봇

단순 통합 검색이 아닌, Supervisor가 질문을 분류해 사용자DB·질병·약·웹 등 6개의 에이전트 중 최적의 경로로 답변을 생성합니다.

데이터 시각화

복잡한 의료 데이터를 로드맵 형태로 요약하여 사용자가 자신의 건강 흐름을 이해하도록 돕습니다.

아키텍처

1. 서비스 시스템 아키텍처

System Architecture

* OCR·LLM·STT 처리는 Redis Queue 기반의 비동기 파이프라인으로 구성해, 요청이 몰리는 상황에서도 메인 API 응답을 안정적으로 유지하도록 설계했습니다.

2. LLM 멀티 에이전트 라우팅 아키텍처 (담당 역할)

[여기에 멀티 에이전트 아키텍처 다이어그램 삽입]Multi Agent Architecture

* Supervisor 노드가 사용자의 질문 의도를 분석하고, 6개의 특화 에이전트(사용자 정보 DB, 채팅 내역 DB, 비의료 담당, 질병 전문, 약 전문, 웹서치) 중 가장 적합한 에이전트를 동적으로 선택하여 답변을 생성하도록 직접 구조를 설계했습니다.

핵심 코드 스니펫

app.py

API 진입

FastAPI 엔드포인트에서 사용자 질문을 ChatState로 구성한 뒤 메인 오케스트레이터를 호출하고, 결과와 출처를 DB에 저장 후 반환하는 핵심 흐름입니다.

chatbot/core/supervisor.py

임베딩 기반 1차 라우팅 알고리즘

프레임워크 종속성 없이, 사용자 질문을 벡터화하여 에이전트 키워드들과 코사인 유사도를 계산해 가장 연관성 높은 1차 후보군을 빠르게 도출합니다.

chatbot/core/supervisor.py

순차적 에이전트 실행 및 최종 답변 생성

LLM 플래너로 동적 순서를 수립해 에이전트들을 순차적으로 실행하며 Context를 쌓은 뒤, 슈퍼바이저가 한 번에 매끄러운 최종 답변을 생성하여 비용과 시간을 최적화합니다.

chatbot/agents/disease_agent.py

특화 Agent 응답 생성

선택된 에이전트는 독립적으로 RAG 검색, Reranking, Q-score 평가를 수행하며, 신뢰도가 낮을 경우 동적으로 Fallback)까지 연동해 할루시네이션을 방어합니다.

문제점 & 해결방법

CASE 01

비정형 의료 데이터의 체계적인 정규화

문제 약물·질병 데이터 출처별 구조와 표현 방식 상이 → 서비스 활용 어려움

  • AIHub 의사–환자 대화 기반 질병 데이터 → 서비스 구조에 맞춘 재정리 필요
  • 약품 데이터 전문 용어·불필요 정보 다수 → 검색·매칭 품질 저하
  • 상품명·성분명·주의사항 표현 불일치 → 동일 의미 데이터 중복 인식 문제

해결 질병·약품 데이터 분리 전처리 전략 및 약품 중심 정규화 파이프라인 구축

  • 약물·성분·주의사항·금기·병용주의 기준 데이터 구조 통일
  • 장문 주의사항 의미 단위 분리 및 핵심 정보 재구성
  • 질병·성분·위험도 태그 추가 → 챗봇 검색 정확도 개선
Outcome

근거 기반 의료 정보 제공 가능한 정규화 데이터 구조 확보

CASE 02

단일 RAG 구조의 한계와 자체 구축 멀티 에이전트 아키텍처 도입

문제 하나의 범용 RAG 파이프라인으로 모든 질문 처리 → 도메인 혼선 및 확장성 한계

  • 질병·약·비의료·이력조회 등 성격이 다른 질문이 동일한 방식으로 처리됨
  • 약 질문이 질병 정보로 연결되거나 엉뚱한 데이터를 참조하는 도메인 할루시네이션 발생
  • 하나의 범용 프롬프트에서 발생하는 에러가 전체 흐름에 영향을 미쳐 시스템이 뻗는 문제 발생

해결 프레임워크 종속성을 배제한 커스텀 Supervisor + 6개 특화 에이전트 아키텍처 직접 설계

  • 임베딩 유사도(Cosine Similarity) 연산과 LLM 동적 플래너를 결합한 자체 Supervisor로 사용자 의도를 빠르고 정확하게 라우팅
  • 사용자 정보DB, 과거채팅내역, 비의료(잡담), 질병, 약, 웹서치 등 6개의 독립적인 에이전트로 철저히 모듈화
  • 무거운 외부 프레임워크 대신 순수 파이썬 로직으로 제어권을 확보하고, 모듈별 독립적 검색 전략을 적용해 연쇄 오류(Cascading Failure) 완벽 차단
Outcome

질문 유형별 최적의 에이전트가 동적으로 조합되어, 환각을 방어하고 비용·속도·안정성을 모두 잡아낸 고품질 커스텀 RAG 아키텍처 완성

CASE 03

안전한 의료 정보 제공을 위한 LLM 가드레일 설계

문제 의료 챗봇 답변의 법적·윤리적 위험 관리 필요

  • 진단·처방 오인 가능성 존재
  • 복용 여부 결정 등 고위험 질문 대응 체계 부재
  • 정보 유용성 vs 답변 안전성 균형 필요

해결 프롬프트·응답 템플릿 기반 답변 범위 제한 가드레일 설계

  • 답변 구조 고정: 주의 고지 → 정보 안내 → 체크포인트 → 전문가 상담 권유
  • 위험 의도 감지 시 제한 응답 출력 로직 적용
  • 근거 없는 추측성 답변 생성 차단
Outcome

법적 리스크 최소화 및 안전 중심 의료 챗봇 UX 확보

CASE 04

반복적인 질의로 인한 API 토큰 비용 증가와 응답 지연

문제 유사/동일 질문에 대해 매번 LLM을 호출하여 불필요한 비용과 대기 시간 발생

  • 자주 묻는 질문(약물 부작용, 복용법 등)의 중복 발생 비율이 높음
  • 매 요청마다 외부 LLM API를 호출하게 되어 토큰 비용 급증
  • 불필요한 생성 과정으로 인한 응답 지연이 사용자 경험(UX) 저하 초래

해결 Redis 기반 시맨틱 캐싱(Semantic Caching) 도입

  • Redis를 이용해 이전 질문-답변 쌍 및 임베딩 벡터를 캐싱
  • 유사도 기반 검색을 통해 캐시 히트(Cache Hit) 시 LLM 호출 생략 후 즉시 반환
  • Redis Queue(RQ)를 활용해 기타 무거운 연산의 비동기 백그라운드 처리 병행
Outcome

LLM API 호출 횟수 감소를 통한 토큰 비용 대폭 절감 및 사용자 평균 응답 대기 시간 단축

성과

6 Domains
멀티 에이전트 구축
슈퍼바이저와 6가지 특화 에이전트로 의도를 정밀 분류
85%+
LLM 답변 정확도
각 에이전트별 가드레일 적용으로 할루시네이션 대폭 감소
⬇ 20%
API 토큰 비용 절감
Redis 시맨틱 캐싱 도입으로 중복 연산 방지 및 속도 향상