docs: PAAI 시스템 아키텍처 문서
- 시스템 개요 및 데이터 흐름 - API 엔드포인트 정리 - Clawdbot 연동 방법 - 트러블슈팅 가이드
This commit is contained in:
parent
16c3881661
commit
f3b6496c91
359
docs/PAAI-SYSTEM.md
Normal file
359
docs/PAAI-SYSTEM.md
Normal file
@ -0,0 +1,359 @@
|
|||||||
|
# PAAI (Pharmacist Assistant AI) 시스템
|
||||||
|
|
||||||
|
> 약사를 위한 AI 기반 처방 분석 및 복약지도 보조 시스템
|
||||||
|
|
||||||
|
## 📋 목차
|
||||||
|
1. [시스템 개요](#시스템-개요)
|
||||||
|
2. [구현 현황](#구현-현황)
|
||||||
|
3. [아키텍처](#아키텍처)
|
||||||
|
4. [데이터베이스](#데이터베이스)
|
||||||
|
5. [API 엔드포인트](#api-엔드포인트)
|
||||||
|
6. [어드민 페이지](#어드민-페이지)
|
||||||
|
7. [향후 계획](#향후-계획)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 시스템 개요
|
||||||
|
|
||||||
|
### 목적
|
||||||
|
- 처방전 분석 시 KIMS 약물 상호작용 자동 확인
|
||||||
|
- AI 기반 복약지도 포인트 추천
|
||||||
|
- OTC 구매 이력 기반 맞춤 상담 제안
|
||||||
|
- 처방 변화 감지 및 분석
|
||||||
|
|
||||||
|
### 핵심 기능
|
||||||
|
1. **KIMS 상호작용 조회** - 처방 약품 간 상호작용 자동 체크
|
||||||
|
2. **AI 분석** - Clawdbot(Claude) 기반 처방 인사이트 생성
|
||||||
|
3. **처방 비교** - 이전 처방과 현재 처방 변화 분석
|
||||||
|
4. **OTC 연계** - 환자 OTC 구매 이력 기반 추천
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 구현 현황
|
||||||
|
|
||||||
|
### ✅ 완료된 기능
|
||||||
|
|
||||||
|
#### PMR (조제관리) 페이지
|
||||||
|
- [x] 환자 목록 / 처방 상세 조회
|
||||||
|
- [x] 이전 처방 비교 모드 (추가/변경/중단/동일 표시)
|
||||||
|
- [x] OTC 구매 이력 모달
|
||||||
|
- [x] PAAI 분석 버튼
|
||||||
|
|
||||||
|
#### PAAI 분석 기능
|
||||||
|
- [x] KIMS API 연동 (약물 상호작용 조회)
|
||||||
|
- [x] Clawdbot Gateway 연동 (AI 분석)
|
||||||
|
- [x] 비동기 토스트 알림 (다른 환자 보면서도 알림 수신)
|
||||||
|
- [x] 분석 결과 캐싱 (환자별)
|
||||||
|
- [x] 피드백 수집 (유용/비유용)
|
||||||
|
|
||||||
|
#### 토스트 알림 시스템
|
||||||
|
- [x] 우상단 오버레이 토스트
|
||||||
|
- [x] A환자 분석 중 → B환자 조회 가능
|
||||||
|
- [x] 토스트 클릭 시 해당 환자 결과 모달
|
||||||
|
|
||||||
|
### 🚧 진행 중
|
||||||
|
|
||||||
|
#### 어드민 페이지
|
||||||
|
- [ ] 피드백 통계 대시보드
|
||||||
|
- [ ] 분석 이력 검색
|
||||||
|
- [ ] 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)
|
||||||
|
|
||||||
|
```sql
|
||||||
|
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`
|
||||||
|
|
||||||
|
**요청:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"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}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**응답:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"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`
|
||||||
|
|
||||||
|
**요청:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"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 (현재)
|
||||||
|
- [x] 기본 PAAI 분석 기능
|
||||||
|
- [x] 비동기 토스트 알림
|
||||||
|
- [ ] 어드민 페이지 기본
|
||||||
|
|
||||||
|
### 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*
|
||||||
Loading…
Reference in New Issue
Block a user