docs: PAAI 시스템 아키텍처 문서 추가

- PAAI 전체 흐름 다이어그램
- 구성 요소 (Trigger, WebSocket, API, 프린터)
- WebSocket 이벤트 목록
- 자동인쇄/중복방지/재시도 로직 설명
- 로그 파일 위치
This commit is contained in:
thug0bin 2026-03-05 13:24:03 +09:00
parent ebd4669d24
commit a144a091b9

View File

@ -420,6 +420,128 @@ OPENAI_MODEL=gpt-4o-mini
---
---
## 🤖 PAAI 시스템 (처방 AI 분석)
### 개요
**PAAI (Prescription AI Analysis)**는 처방 접수 시 자동으로 AI 분석을 수행하고,
분석 결과를 영수증 프린터로 출력하는 시스템입니다.
### 아키텍처
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ PAAI 시스템 흐름 │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ POS 접수 │────►│ PM_PRES_LOG │────►│ Trigger Module │
│ (처방입력) │ │ (MSSQL) │ │ (폴링 감지) │
└─────────────┘ └─────────────────┘ └─────────────────┘
┌───────────────────────────────┤
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ WebSocket 알림 │ │ PAAI 분석 요청 │
│ (ws://8765) │ │ Flask API │
└─────────────────┘ └─────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ 프론트엔드 │ │ Claude API │
│ pmr.html │ │ (분석 수행) │
└─────────────────┘ └─────────────────┘
│ │
│◄──────────────────────────────┤
│ analysis_completed 이벤트
┌─────────────────┐
│ 자동 인쇄 │
│ ESC/POS 프린터 │
└─────────────────┘
```
### 구성 요소
| 모듈 | 위치 | 역할 |
|------|------|------|
| **Trigger Module** | `prescription-trigger/prescription_trigger.py` | PM_PRES_LOG 폴링, 처방 감지, 분석 요청 |
| **WebSocket Server** | Trigger 내장 (port 8765) | 프론트엔드에 실시간 이벤트 전송 |
| **PAAI API** | `backend/pmr_api.py` | 분석 요청 처리, Claude API 호출, 결과 저장 |
| **프론트엔드** | `backend/templates/pmr.html` | 조제관리 UI, 자동인쇄 토글 |
| **프린터 모듈** | `backend/paai_printer.py` | ESC/POS 영수증 프린터 출력 |
### WebSocket 이벤트
| 이벤트 | 방향 | 설명 |
|--------|------|------|
| `prescription_detected` | Server → Client | 새 처방 감지됨 |
| `analysis_started` | Server → Client | AI 분석 시작 |
| `analysis_completed` | Server → Client | 분석 완료 (결과 포함) |
| `analysis_failed` | Server → Client | 분석 실패 (에러 포함) |
### 자동 인쇄 흐름
```javascript
// 1. WebSocket으로 analysis_completed 수신
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.event === 'analysis_completed') {
// 2. 자동인쇄 ON 상태면 인쇄
if (window.autoPrintEnabled) {
printPaaiResult(data.pre_serial, data.patient_name, data);
}
}
};
// 3. 인쇄 API 호출
POST /pmr/api/paai/print
{
"pre_serial": "20260305000099",
"patient_name": "홍길동",
"result": { "analysis": {...}, "kims_summary": {...} }
}
// 4. ESC/POS 프린터로 출력
```
### 중복 방지
```javascript
// window.printedSerials (Set) 으로 중복 인쇄 방지
if (window.printedSerials.has(preSerial)) {
console.log('[AutoPrint] 이미 인쇄됨, 스킵:', preSerial);
return;
}
window.printedSerials.add(preSerial); // 요청 전에 추가 (race condition 방지)
```
### 자동 재시도
| 시도 | 대기 시간 | 상태 |
|------|----------|------|
| 1회차 | - | 최초 시도 |
| 2회차 | 2초 | 첫 번째 재시도 |
| 3회차 | 4초 | 두 번째 재시도 |
| 실패 | - | `analysis_failed` 이벤트 발송 |
### 로그 파일
| 파일 | 위치 | 내용 |
|------|------|------|
| `print_history.log` | `backend/logs/` | 인쇄 성공/실패 기록 |
| `analysis_failures.log` | `prescription-trigger/logs/` | 분석 실패 상세 기록 |
| `paai_logs.db` | `backend/db/` | 분석 결과 SQLite 저장 |
### 관련 문서
- `docs/PAAI_AUTO_PRINT_TROUBLESHOOTING.md` - 자동인쇄 트러블슈팅 가이드
---
## 📝 버전 이력
| 날짜 | 버전 | 변경 내용 |
@ -427,6 +549,8 @@ OPENAI_MODEL=gpt-4o-mini
| 2026-02-28 | 1.0 | 초기 아키텍처 문서 작성 |
| | | 동물약 AI 챗봇 추가 |
| | | 플로팅 챗봇 UI 구현 |
| 2026-03-05 | 1.1 | PAAI 시스템 아키텍처 추가 |
| | | 자동인쇄, WebSocket, 재시도 로직 |
---