🔧 이지스AI 기술이전 문서

MediPortal(웹 프로토타입) → 이지스 전자차트(C#/.NET + PostgreSQL) 이식 자문 · 외래진료실 신규기능

CONFIDENTIAL ← AI 로드맵
문서 목적

개발팀과의 소통을 위해, 메디포털(웹)에서 먼저 구축·검증한 기능이 어떻게 만들어졌는지이지스 본체(C#/.NET, PostgreSQL)에서는 어떻게 구축되어야 하는지를 정리합니다. 웹 프로토타입은 기능·UX·프롬프트·데이터 계약의 레퍼런스 구현이며, 본체 이식 시 데이터 계층·LLM 호출·저장·인쇄·UI만 네이티브로 교체하면 됩니다. 이 문서는 AI 로드맵의 구축내역과 동기 유지합니다.

공통 아키텍처 매핑 ① AI 다듬이 ② 비만주사(GLP-1) ③ 프롤리아 모니터링 이식 우선순위

🧭 공통 아키텍처 매핑 (웹 → 이지스 네이티브)

계층MediPortal (웹 프로토타입)이지스 전자차트 (C#/.NET + PostgreSQL) 이식
UI 셸HTML 드로어/모달 + CSS 8테마, clinic-view.html에 <script> 주입WinForms/WPF UserControl·Form·Panel(도킹). 기존 진료 화면에 탭/사이드패널로 임베드
운영DB 접근원내 eghis-db-agent(127.0.0.1 REST, 읽기전용·토큰)로 PostgreSQL 조회 → 행 한도(~500)·청크 필요Npgsql 직접 연결(같은 프로세스·LAN). 행 한도 없음 → 청크/폴백 로직 불필요. 파라미터라이즈드 쿼리·커넥션풀
LLM 호출공용 Gemini 프록시(Netlify Function) DrPortalAI.aiComplete() / 비전은 gemini-proxy inlineData. 키는 서버 보관서버사이드 프록시 서비스 경유(클라이언트에 키 미노출). 토큰 단위·선불 크레딧 과금(가격 결정안 27p). 모델: 저가 flash급(다듬이)~정확 sonnet급(소견서). 사내 eghisEmrAi 사이드카 재사용 가능
로컬/영속 저장브라우저 sql.js(단일 mediportal.sqlite) 또는 localStorage 폴백기능 상태는 PostgreSQL 신규 테이블(권장) 또는 원내 로컬 SQLite. 이력·감사로그 동일 스키마
인쇄window.open 팝업 문서 + window.print()(타 모듈 @media print 충돌 격리)PrintDocument / ReportViewer(RDLC) 또는 기존 이지스 서식엔진. 동일 레이아웃 재현
개인정보·안전외부 LLM엔 식별정보 제외 임상문장 위주. 사실·수치·약명 보존 프롬프트 제약. 무검수 저장 금지동일 원칙 + 사내 프록시로 전송범위 로깅·마스킹. 의무기록은 의사 확정 단계 강제
데이터 계층 추상화모듈이 window.CV.summaryData()·CV._rec·CV.q() 어댑터로 접근동일 인터페이스를 Repository/Service로 구현 → UI·로직 재사용, 쿼리만 교체

⭐ 이식 핵심: 웹 프로토타입의 ①프롬프트 ②판정·계산 로직 ③입출력 데이터 계약 ④UX 흐름은 그대로 이식하고, 데이터 접근(Npgsql)·LLM 프록시·저장·인쇄·UI 컨트롤만 네이티브로 교체합니다.

① AI 다듬이 웹 구축완료

증상(F1)·환자메모·특이사항 텍스트를 목적별 문체 정리·맞춤법·번역하고, 재진 SOAP 정리·재진 증상 템플릿(가증상, 투약일수 계산 포함)을 생성. 웹 파일: cv-polish.js(외래진료실 통합), ai-polish.html(standalone 데모).

데이터 입력 소스 (운영DB)

항목테이블·컬럼용도
증상(S)h2opd_ptnt_symp.symp_txt (recept_no)문체 정리·SOAP S·템플릿 기준
환자메모/특이사항hz_mst_ptnt.ptnt_memo / opd_memo상담·특이사항 반영
바이탈·검사(O)h1vitalsign(코드별 값·측정일)SOAP O, 당일 계측·추이(직전 대비 ↑↓)
상병(A)진료 상병(주/부/배제)SOAP A(추정·의심·배제)
처방(P)·투약일수h2opd_doct_ord(ord_cd·days_of_medication·dayqty)SOAP P, 남은 약/복약공백 계산

핵심 로직 — 재진 증상 템플릿 + 투약일수(수치 계산)

과거 방문(desc) 증상 텍스트를 템플릿으로 재사용하되, 직전 방문 처방 중 최장 일수 약제 기준으로 오늘까지 경과일을 계산해 남은 약/복약공백을 결정론적으로 산출(AI가 아닌 코드 계산):

// 의사코드 (웹 medSupply → C# 이식 동일)
prev = 오늘 이전 최근 방문 중 (days_of_medication 최대) 처방
elapsed = today - prev.visitDate
if (elapsed <= prev.maxDays)  남은약 = prev.maxDays - elapsed        // 추정 남은 일분
else                          복약공백 = elapsed - prev.maxDays       // 약 소진 후 미복용 일수

MediPortal 구현 ↔ 이지스 이식

웹 (현재)

  • 읽기전용 패널(#pSymp·#mPtnt·#mSpcl) → 드래그 툴팁 / [✨ 다듬이] 버튼 / / 슬래시 메뉴
  • 프리셋 12종(문장정리·초진·재진경과·의학용어체·상담·SOAP·재진템플릿·번역 등) system+user 프롬프트 분기
  • LLM: DrPortalAI.aiComplete(gemini-flash). 사실·수치·약명 불변 제약
  • 결과 복사(클립보드) — 웹은 운영DB 쓰기 불가
  • AI 통합 어시스트 '진료 전' 브리핑 아래 가증상 자동 생성

이지스 (이식안)

  • 증상(F1) RichTextBox 컨트롤에 네이티브 통합 — 기획안대로 우클릭 컨텍스트 메뉴 · F7 단축키 · /+번호+Enter
  • 프리셋은 설정 테이블/리소스로 관리(순서·번호·on/off). 프롬프트 문자열 그대로 재사용
  • LLM: 서버 프록시(토큰 크레딧). 맞춤법 모드 "교정만" 제약
  • 결과 직접 반영 가능(네이티브는 증상칸 쓰기 가능) — After/Before 확인 후 [적용]으로 대체
  • Before/After 팝업 = 모달 Form. medSupply·SOAP 취합은 Npgsql 조회 + C# 계산

입출력 계약: { rawText, mode(tidy|spell|translate|soap|visit), tone|lang } → { resultText }. SOAP·visit 모드는 추가로 { vitals, dx, rx, pastSymp, medSupply } 컨텍스트 필요.

리스크 — 외부 LLM 전송이므로 식별정보 최소화·임상문장 위주. 수치/약명 왜곡 방지 위해 원문/결과 비교 필수. 무검수 반영 금지(의사 확인).

② 비만주사(GLP-1) 체중관리 웹 구축완료

마운자로·위고비·삭센다 약제별 감량 예측·비교, 차수/개월 곡선, 실측 성취도, 환자 유형별 효능(당뇨병·수면무호흡·기타), InBody AI 분석, 실손 소견서·체중관리 계획서. 웹 파일: glp1-weight.js.

효능·예측 모델 (핵심 자산)

MediPortal 구현 ↔ 이지스 이식

웹 (현재)

  • 진입: 처방 목록 세부확인 [📉 비만주사](마운자로/위고비/삭센다·성분명 매칭)
  • 바이탈 자동채움: h1vitalsign weight/height/bmi
  • 효능 데이터·ACCRUAL은 편집가능 상수. SVG 손그림 차트(예측선+실측점 연결)
  • 저장: sql.js glp1_state(ptnt_no, json)
  • InBody: 결과지 이미지 → Gemini 비전(inlineData) 수치화. 실손 소견서: aiComplete + 조건 게이트(마운자로·BMI≥25·당뇨/OSA·급여본인부담)
  • 인쇄: 팝업창(printDoc)

이지스 (이식안)

  • 진입: 처방 그리드에서 GLP-1 성분(h0_mst_drug.component) 감지 → 버튼/메뉴
  • 바이탈: h1vitalsign Npgsql 직접
  • 효능 데이터 = PostgreSQL 설정 테이블(기관/원장 편집). 차트 = OxyPlot/LiveCharts 네이티브
  • 저장: glp1_plan / glp1_measure PostgreSQL 테이블(환자·차수·실측)
  • InBody OCR = 서버 비전 프록시. 소견서 = 사내 서식엔진 + AI 서술부
  • 인쇄: ReportViewer(RDLC)

입출력 계약: { base, height, bmi, target, drug, dose, pop, custom[], measures[] } → { 예측표, 곡선, 비교표, 달성률 }. 소견서: { 진단·HbA1c·기존치료·급여여부 } → { 서술부 초안 }.

리스크 — 예측치는 임상시험 평균 기반 참고값(개인차). 실손 소견서는 마운자로 한정 조건부·무단 우회청구는 보험사기. 발급 전 의사 검토 강제.

③ 프롤리아(Denosumab) 모니터링 웹 구축완료

투여이력(6개월±28일·1년2회/골절3년6회)·골밀도 검사주기·BMD 결과지 AI 판독 → 급여 판정(중심골 평균 T-score ≤ -2.5)·청구메모·특정내역(JX999) 검증·근거 고시. 웹 파일: prolia-monitor.js.

데이터·판정 로직

단계내용
투여이력·검사방문+처방(h2opd_doct_ord)에서 프롤리아(성분 629001BIJ)·BMD 오더 수집. 성분코드 매칭은 h0_mst_drug.component(계산코드/처방코드→성분)
BMD 판독결과지 이미지 → Gemini 비전(inlineData)로 요추 L1~L4·대퇴 Neck/Total T-score 추출 → 수동 보정
급여 판정요추 배제부위 제외 평균·대퇴 최저 → 최저값 ≤ -2.5 = 골다공증(급여). 공개심의(평균 판단·최저 임의선택 불가) 반영
특정내역 검증명세서 JX999(h2opd_specode)의 골밀도 검사일 최신성(12개월 초과=삭감주의) 판독

MediPortal 구현 ↔ 이지스 이식

웹 (현재)

  • 진입: 프롤리아 처방행 세부확인 [💉 프롤리아]
  • ⚠️ 에이전트 행 한도(~500)로 전체 이력을 15 recept 청크 + recept별 폴백으로 조회(bulkFetch)
  • BMD 비전 판독·애니메이션 그래프·청구메모(대표 검사결과 라인)
  • 저장: sql.js prolia_monitor(state json)
  • 고시: gk_noti(DRG_0005/7/8) 로드. 특정내역 날짜점검은 골키퍼 gk_note_rule(NOTE_STALE)로도 심사

이지스 (이식안)

  • 진입: 처방 그리드 프롤리아 감지 → 버튼
  • Npgsql 직접 → 행 한도 없음, 청크/폴백 불필요(단순 IN 조회)
  • BMD 비전 = 서버 프록시. 판정 로직(spineAvg/femurMin/verdict)은 C# 이식
  • 저장: prolia_monitor PostgreSQL 테이블
  • 고시·심사룰 = 사내 심사엔진/고시 테이블 연계. 특정내역 검증은 청구 검증 파이프라인에 통합

입출력 계약: { ptnt, 투여이력[], BMD검사[], TS{L1..L4,Neck,Total,qct}, dxFx } → { 판정, 다음회차·검사도래, 청구메모, JX999판독 }.

리스크 — BMD 판독은 AI 초안(의사 확인). 급여 판정은 고시·공개심의 최신본 대조. 성분코드 매칭은 처방이 운반한 코드 기준(외부조회 최소화).

🗺 이식 우선순위·단계 제언

본 문서는 AI 로드맵의 기능별 기술정의서(정의·UX·구현·입출력·모델·리스크·Phase2)와 상호 참조됩니다. 신규/변경 시 양쪽을 함께 갱신합니다.