pharmacy-pos-qr-system/docs/PAAI-SYSTEM.md
thug0bin f3b6496c91 docs: PAAI 시스템 아키텍처 문서
- 시스템 개요 및 데이터 흐름
- API 엔드포인트 정리
- Clawdbot 연동 방법
- 트러블슈팅 가이드
2026-03-05 09:30:39 +09:00

16 KiB

PAAI (Pharmacist Assistant AI) 시스템

약사를 위한 AI 기반 처방 분석 및 복약지도 보조 시스템

📋 목차

  1. 시스템 개요
  2. 구현 현황
  3. 아키텍처
  4. 데이터베이스
  5. API 엔드포인트
  6. 어드민 페이지
  7. 향후 계획

시스템 개요

목적

  • 처방전 분석 시 KIMS 약물 상호작용 자동 확인
  • AI 기반 복약지도 포인트 추천
  • OTC 구매 이력 기반 맞춤 상담 제안
  • 처방 변화 감지 및 분석

핵심 기능

  1. KIMS 상호작용 조회 - 처방 약품 간 상호작용 자동 체크
  2. AI 분석 - Clawdbot(Claude) 기반 처방 인사이트 생성
  3. 처방 비교 - 이전 처방과 현재 처방 변화 분석
  4. OTC 연계 - 환자 OTC 구매 이력 기반 추천

구현 현황

완료된 기능

PMR (조제관리) 페이지

  • 환자 목록 / 처방 상세 조회
  • 이전 처방 비교 모드 (추가/변경/중단/동일 표시)
  • OTC 구매 이력 모달
  • PAAI 분석 버튼

PAAI 분석 기능

  • KIMS API 연동 (약물 상호작용 조회)
  • Clawdbot Gateway 연동 (AI 분석)
  • 비동기 토스트 알림 (다른 환자 보면서도 알림 수신)
  • 분석 결과 캐싱 (환자별)
  • 피드백 수집 (유용/비유용)

토스트 알림 시스템

  • 우상단 오버레이 토스트
  • A환자 분석 중 → B환자 조회 가능
  • 토스트 클릭 시 해당 환자 결과 모달

🚧 진행 중

어드민 페이지

  • 피드백 통계 대시보드
  • 분석 이력 검색
  • KIMS 호출 로그
  • AI 요청/응답 로그

아키텍처

┌─────────────────────────────────────────────────────────────────┐
│                        PMR 페이지 (pmr.html)                      │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────────┐  │
│  │ 환자 목록    │  │ 처방 상세   │  │ PAAI 토스트/모달        │  │
│  └─────────────┘  └─────────────┘  └─────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                      Flask API (pmr_api.py)                      │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────────┐  │
│  │ /pmr/api/   │  │ /pmr/api/   │  │ /pmr/api/paai/          │  │
│  │ prescriptions│ │ patient/    │  │ analyze, feedback       │  │
│  └─────────────┘  └─────────────┘  └─────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘
                              │
              ┌───────────────┼───────────────┐
              ▼               ▼               ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│   PIT3000 DB    │ │   KIMS API      │ │ Clawdbot Gateway│
│   (MSSQL)       │ │   (상호작용)     │ │ (Claude AI)     │
│                 │ │                 │ │                 │
│ - PM_PRES       │ │ - 약품 검색     │ │ - WebSocket     │
│ - PM_DRUG       │ │ - 상호작용 조회 │ │ - 세션 관리     │
│ - PM_CUS        │ │                 │ │                 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
                              │
                              ▼
                    ┌─────────────────┐
                    │   SQLite DB     │
                    │   (paai_logs)   │
                    │                 │
                    │ - 분석 로그     │
                    │ - 피드백        │
                    │ - KIMS 로그     │
                    └─────────────────┘

데이터베이스

paai_logs 테이블 (SQLite)

CREATE TABLE IF NOT EXISTS paai_logs (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    -- 환자/처방 정보
    pre_serial TEXT,           -- 처방전 번호
    cus_code TEXT,             -- 환자 코드
    patient_name TEXT,         -- 환자명
    
    -- 질병 정보
    disease_codes TEXT,        -- JSON: ["M750", "K299"]
    disease_names TEXT,        -- JSON: ["어깨 유착성 관절낭염", "위십이지장염"]
    
    -- 처방 정보
    medication_count INTEGER,  -- 약품 수
    medications_json TEXT,     -- JSON: 전체 약품 리스트
    
    -- KIMS 결과
    kims_called BOOLEAN,       -- KIMS 호출 여부
    kims_request_json TEXT,    -- KIMS 요청 데이터
    kims_response_json TEXT,   -- KIMS 응답 원본
    kims_interaction_count INTEGER,  -- 상호작용 건수
    kims_has_severe BOOLEAN,   -- 중증 상호작용 여부
    kims_duration_ms INTEGER,  -- KIMS 응답 시간
    
    -- AI 분석 결과
    ai_called BOOLEAN,         -- AI 호출 여부
    ai_prompt_json TEXT,       -- AI에게 전달한 프롬프트
    ai_response_json TEXT,     -- AI 응답 원본
    ai_parsed_json TEXT,       -- 파싱된 분석 결과
    ai_duration_ms INTEGER,    -- AI 응답 시간
    ai_model TEXT,             -- 사용 모델 (claude-opus-4-5 등)
    
    -- 피드백
    feedback_useful BOOLEAN,   -- 유용했는지
    feedback_at TIMESTAMP,     -- 피드백 시간
    feedback_comment TEXT,     -- 추가 코멘트 (향후)
    
    -- 메타
    total_duration_ms INTEGER, -- 전체 처리 시간
    error_message TEXT,        -- 에러 발생 시
    client_ip TEXT             -- 요청 IP
);

-- 인덱스
CREATE INDEX idx_paai_created ON paai_logs(created_at);
CREATE INDEX idx_paai_patient ON paai_logs(cus_code);
CREATE INDEX idx_paai_feedback ON paai_logs(feedback_useful);

API 엔드포인트

PAAI 분석

POST /pmr/api/paai/analyze

요청:

{
  "pre_serial": "20260305001",
  "cus_code": "C00123",
  "patient_name": "김미성",
  "disease_info": {
    "code_1": "M750",
    "name_1": "어깨의 유착성 관절낭염",
    "code_2": "K299",
    "name_2": "상세불명의 위십이지장염"
  },
  "current_medications": [
    {"code": "641500020", "name": "아세탑정", "dosage": "1", "frequency": "2", "days": "5"}
  ],
  "previous_medications": [],
  "otc_history": {
    "visit_count": 5,
    "frequent_items": [{"name": "신신파스", "count": 3}]
  }
}

응답:

{
  "success": true,
  "log_id": 42,
  "kims_summary": {
    "interaction_count": 2,
    "has_severe": false,
    "interactions": [...]
  },
  "analysis": {
    "prescription_insight": "소염진통제와 위장약 병용 처방...",
    "kims_analysis": "아세클로페낙과 레바미피드 병용은...",
    "cautions": ["식후 30분 복용", "위장장애 주의"],
    "otc_recommendations": [
      {"product": "신신파스", "reason": "근골격계 통증 보조"}
    ],
    "counseling_points": ["충분한 수분 섭취", "알코올 자제"]
  },
  "timing": {
    "kims_ms": 234,
    "ai_ms": 2891,
    "total_ms": 3125
  }
}

피드백

POST /pmr/api/paai/feedback

요청:

{
  "log_id": 42,
  "useful": true
}

어드민 페이지

📊 대시보드 (/pmr/admin)

1. 개요 통계

┌─────────────────────────────────────────────────────────────┐
│  📊 PAAI 어드민 대시보드                        [날짜 선택] │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐   │
│  │   127    │  │   89%    │  │   15건   │  │  2.3초   │   │
│  │ 총 분석  │  │ 유용 평가│  │KIMS 경고 │  │ 평균응답 │   │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

2. 피드백 통계

  • 일별/주별/월별 유용/비유용 비율 차트
  • 비유용 피드백 많은 케이스 분석

3. 분석 이력 검색

┌─────────────────────────────────────────────────────────────┐
│  🔍 분석 이력                                               │
├─────────────────────────────────────────────────────────────┤
│  환자명: [_________]  기간: [____] ~ [____]  [검색]         │
├─────────────────────────────────────────────────────────────┤
│  # │ 일시       │ 환자    │ 약품수│ KIMS │ 피드백│ 상세   │
│ ───┼────────────┼─────────┼───────┼──────┼───────┼─────── │
│  1 │ 03-05 14:32│ 김미성  │   4   │ 2건  │  👍   │ [보기] │
│  2 │ 03-05 14:28│ 박철수  │   6   │ 0건  │  👎   │ [보기] │
│  3 │ 03-05 14:15│ 이영희  │   3   │ 1건  │   -   │ [보기] │
└─────────────────────────────────────────────────────────────┘

4. 상세 로그 보기 (모달)

┌─────────────────────────────────────────────────────────────┐
│  📋 분석 상세 - 김미성님 (2026-03-05 14:32)          [닫기] │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ▼ 환자/처방 정보                                          │
│    처방번호: 20260305001                                    │
│    질병: [M750] 어깨 유착성 관절낭염, [K299] 위십이지장염   │
│    약품: 아세탑정, 에페솔정, 레바미피드정, 브로나제정       │
│                                                             │
│  ▼ KIMS 호출 (234ms)                                       │
│    요청: {"medications": ["641500020", "645678901", ...]}   │
│    응답: {"interactions": [...], "count": 2}                │
│                                                             │
│  ▼ AI 프롬프트                                             │
│    ┌─────────────────────────────────────────────────────┐ │
│    │ 당신은 약사를 보조하는 AI입니다...                  │ │
│    │ ## 환자 질병                                        │ │
│    │ [M750] 어깨의 유착성 관절낭염...                    │ │
│    └─────────────────────────────────────────────────────┘ │
│                                                             │
│  ▼ AI 응답 (2891ms)                                        │
│    모델: claude-opus-4-5                                    │
│    ┌─────────────────────────────────────────────────────┐ │
│    │ {                                                   │ │
│    │   "prescription_insight": "소염진통제와...",       │ │
│    │   "kims_analysis": "아세클로페낙과...",            │ │
│    │   "cautions": ["식후 30분 복용", ...],             │ │
│    │   ...                                               │ │
│    │ }                                                   │ │
│    └─────────────────────────────────────────────────────┘ │
│                                                             │
│  ▼ 피드백                                                  │
│    평가: 👍 유용해요                                       │
│    시간: 2026-03-05 14:35:21                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

5. KIMS 호출 로그

  • 일별 KIMS API 호출 횟수
  • 상호작용 감지율
  • 중증 경고 발생 케이스

6. AI 성능 모니터링

  • 평균 응답 시간 추이
  • 에러율
  • 모델별 사용량

향후 계획

Phase 1 (현재)

  • 기본 PAAI 분석 기능
  • 비동기 토스트 알림
  • 어드민 페이지 기본

Phase 2

  • 피드백 기반 프롬프트 개선
  • 자주 나오는 상담 포인트 학습
  • 약국별 맞춤 설정

Phase 3

  • 다중 약국 지원
  • 분석 결과 PDF 출력
  • 환자용 복약지도 문자 발송 연동

파일 구조

backend/
├── pmr_api.py              # Flask API 서버
├── services/
│   ├── kims_service.py     # KIMS API 연동
│   └── clawdbot_client.py  # Clawdbot Gateway 연동
├── templates/
│   ├── pmr.html            # 조제관리 페이지
│   └── pmr_admin.html      # 어드민 페이지 (예정)
└── db/
    └── paai_logs.db        # PAAI 로그 SQLite

최종 업데이트: 2026-03-05