cave87/medical-agent
Medical-Agent
바이브 논문(vibe paper) 코파일럿 — 사람이 의학 논문을 써내려가는 흐름을 AI가 실시간으로 거든다. KYRBS/KNHANES 공중보건 데이터 → 실시간 통계(survey-weighted) → Figure → Word/EndNote 풀셋.
  [](scripts/e2efunctions.py)
✨ 핵심 기능 (2026-06-15 현재)
- 🗨 채팅 우선 UX — 좌측 대화 + 우측 실시간 docx 프리뷰. assistant 응답마다
📌 핀 → 9 sections박기 → 양방향 binding (다음 turn에 LLM이 본문 snapshot 보고 응답). - 🧰 Native tool-use 디스패치 — Anthropic tooluse 블록으로 patchpreview / kyrbsstat / pubmedsearch / strobecheck / ragsearch 등 18 tool 자동 호출 (regex 파싱 0).
- 📎 컴포저 (30+ 확장자) — PDF/DOCX/PPTX/XLSX/SPSS .sav/STATA .dta/이미지(Vision LLM)/노트북/CSV.
markitdown+ 전용 fallback. - 🤖 모델 picker — Haiku(빠름) / Sonnet(균형, 기본) / Opus(최고품질) 칩 선택.
LLM_MODEL_OVERRIDE환경변수로 라우팅. - 📊 KNHANES domain (KYRBS 동격) — 12 wave (2013-2024) + FLI/HSI/MASLD/MetALD/ALD 2023 신정의 자동 분류 + IDF MetSx + eGFR CKD-EPI 2021 + Asian BMI cat + study phase (IV-IX) + survey-weighted preset (kstrata/psu/wt_itvex).
- 🔍 라이브 PubMed novelty — NCBI eutils 라이브 호출 (evidence_reader). 검색 0편이면 검증 query를 chat에 제시.
- 🧠 단일 정본 ResearchState (RESEARCH_STATE_SPEC) — manuscript.sections 유일 진실원본 + provenance에
dataset_version+registry_version핀 = 결정적 재실행. events.db 기반 checkpoint/restore/branch/resume — "git for research". - 🌐 3-Lane streaming — HOT(<300ms status) / STREAM(tool 이벤트+토큰) / BACKGROUND(confidence/provenance 사후 배지). 빈 spinner 0.
- 🔐 F5 / 핸드오프 안전 —
?pid=URL query param + Supabase mirror + auto-scroll. 새로고침해도 같은 대화 복원.
🚀 빠른 시작 (Docker · 권장)
docker compose up -d --build
# 메인: http://localhost:8501
# Lovable 양식 (Sapphire Glass): http://localhost:8501/lovable_home
# 프로젝트 워크스페이스: http://localhost:8501/project_workspace
# 로그: docker compose logs -f두 모드 단일 entry 동거 (2026-05-27): Streamlit 자동 멀티페이지로 /lovable_home 및 /project_workspace URL 라우팅. 기존 단위 기능 화면(메인)은 그대로 유지되며 Lovable 모드 개발 시 참고/폴백용으로 살아있음. Streamlit Cloud 배포도 동일 URL 양식 (/lovable_home)으로 접근.
⚠️ Lovable 모드는 현재 UX/UI 디테일 + e2e 기능 미완성 — 점진 개선 중. 안정 동작이 필요한 작업은 메인 페이지 사용 권장.
API 키는 .env에 (admin 전역 키로 모든 사용자에 적용):
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-proj-...
GOOGLE_API_KEY=AIzaSy... # Gemini (무료 폴백)3중 자동 폴백 (Claude → OpenAI → Gemini), 예산 80% 도달 시 Gemini로 강제 다운그레이드.
🏗️ 아키텍처 (한눈에)
┌─────────────────────────────────────────────────────────────┐
│ UI Layer app/streamlit_app.py │
│ ↳ 논문 작업실 · 통계 코드 · 인용/레퍼런스 │
├─────────────────────────────────────────────────────────────┤
│ Tool Registry src/tools/__init__.py │
│ ↳ TOOLS dict + render_result(st.dialog) │
├─────────────────────────────────────────────────────────────┤
│ Domain Logic src/data/ ↳ KYRBS/KNHANES loader │
│ src/research/ ↳ paper_writer, peer review │
│ src/export/ ↳ figure/table/citation │
│ src/llm/ ↳ failover client + budget │
├─────────────────────────────────────────────────────────────┤
│ Runtime Layer src/runtime/ ↳ events/tasks/idempotency/ │
│ heartbeat (SQLite WAL) │
│ src/memory/ ↳ router/scorer/lifecycle/ │
│ gate/conversation │
├─────────────────────────────────────────────────────────────┤
│ Persistence data/raw/ ↳ KYRBS 2005~2025 .sav │
│ data/runtime/ ↳ events.db/tasks.db/... │
│ data/exports/ ↳ Figure*.png/.docx/.xml │
│ data/chromadb/ ↳ 10k+ paper chunks (RAG) │
├─────────────────────────────────────────────────────────────┤
│ MCP Server mcp_server.py — Claude Desktop·외부 agent │
│ 공통 backend (memory/task/events/budget) │
└─────────────────────────────────────────────────────────────┘자세한 모듈 레지스트리 → ARCHITECTURE.md 디자인 토큰 (색·폰트·spacing) → DESIGN.md
📐 핵심 원칙 (CLAUDE.md 규칙)
- 사람이 주인공 — AI 자동 생성은 보조, 메인은 직접 쓰는 흐름
- 장기 메모리 자가 진화 —
src/memory/router.py가 단일 진입점, lifecycle decay/충돌해결 자동 - 모델 하드코딩 금지 —
src/config/models.py경유 - LLM 호출은 failover 경유 —
get_llm_client()만 사용, 직접 client 생성 금지 - 로컬 + 클라우드 — 항상 로컬 먼저, Supabase는 선택
- 데이터 무결성 잠금 — 환각 차단 (
memory_gate.assess), 숫자/통계 토큰 보존
전체 11 규칙 → CLAUDE.md
🧪 검증 (다층)
📊 ZCB ↔ 우울 논문 재현 (대표 사례)
# 1. 실 KYRBS 2025 → 모든 분석 데이터 계산
docker compose exec learner python scripts/compute_all_figure_data.py
# 2. 4 figure 생성 (Stata v2.4 캐노니컬 매칭)
docker compose exec learner python scripts/build_paper_figures.py
# 3. EndNote CWYW 필드 임베드 Word docx
docker compose exec learner python scripts/build_endnote_docx.py \
data/exports/ZCB_paper_v2.4_FINAL.md ZCB_paper_endnote산출 → data/exports/:
Figure{1,2,3}_*.{png,pdf}— 13단계 sample flow / 성별 예측확률 / forest plotZCB_paper_v2.4_FINAL.md— 논문 본문 (paired withZCB_v2.4_canonical.do)ZCB_paper_v2.4_yoosun_deep_endnote.docx— EN.CITE 필드 28개 임베드
🤖 외부 agent 연동 (MCP)
mcp_server.py로 Claude Desktop / Cursor / 다른 AI agent가 같은 backend 사용:
python mcp_server.py --port 8765Claude Desktop 설정 (~/.config/claude/claude_desktop_config.json):
{
"mcpServers": {
"medical-agent": {
"url": "http://localhost:8765/mcp",
"headers": { "Authorization": "Bearer ma-YOUR_API_KEY" }
}
}
}노출 도구 (15+):
- 분석:
search_papers,check_novelty,generate_research_topics - 메모리:
memory_write,memory_recall,memory_lifecycle_tick - 작업:
task_list_unfinished,task_status - 감사:
events_recent,events_replay - 예산:
budget_status,budget_set_caps
🛡️ 안전 + 품질 레이어 (12번 섹션 of ARCHITECTURE.md)
모든 LLM 출력은 다음을 자동 통과:
📄 Word 표준 양식 (zcbdepv5)
모든 논문 docx는 동일 양식으로 출력 — data/templates/manuscript_template.json 단일 진실원본.
from src.export.word_exporter import WordExporter
WordExporter().export(
topic={"title": "...", "authors": [...], "affiliations": [...]},
sections={"Abstract": {"Background": "...", "Methods": "...", ...},
"Introduction": "...", "Methods": {...subsection...}, ...},
keywords=["zero-calorie beverage", "depression", ...],
figures=[{"bytes": ..., "caption": "...", "n": 1}, ...],
tables=[{"type": "baseline", "data": [...], "caption": "...", "n": 1}],
references=[{"authors": "...", "title": "...", "journal": "...",
"year": "2025", "volume": "385", "pages": "445-449"}],
back_matter={"Ethics approval": "...", "Funding": "...", ...},
)자동 적용: Times New Roman / double-spaced / Abstract inline label / Vancouver [1] 인라인 / italic P / 학술지 세 줄 표 (NEJM 양식).
🔄 자동 동기화 (선택)
python scripts/auto_sync.py
# 또는 Windows hidden: wscript scripts/run_sync_hidden.vbsv3 commit-first 패턴 — stash 0 의존, 60초 디바운스, 분 단위 polling.
📊 자가발전 자산 현황 (2026-05-29)
🧠 핵심 컴포넌트 (ARCHITECTURE 14 sections)
📁 디렉토리
.
├── app/ Streamlit UI + Sapphire Glass theme
│ ├── pages/ ez_home·project_workspace·backlog·dashboard·memory_explorer
│ ├── styles/ sapphire_glass (Lovable-style 글래스모피즘)
│ ├── agentic_loop.py 23 tools agentic loop
│ ├── sapphire_actions.py 부가기능 모달 (10 actions)
│ └── streamlit_app.py
├── src/
│ ├── data/ KYRBS/KNHANES loader, StatBridge
│ ├── research/ paper_writer, peer_reviewer, pipeline
│ ├── export/ figure_builder, citation_workflow, table_builder
│ ├── llm/ failover client (Claude/OpenAI/Gemini), budget
│ ├── memory/ router, scorer, lifecycle, gate, conversation
│ ├── runtime/ events, tasks, idempotency, heartbeat
│ ├── tools/ TOOLS registry + render_result
│ ├── agent/ persona, MedicalAgent
│ ├── knowledge/ medical_seed, trend_learner, research_wiki
│ ├── rag/ ChromaDB pipeline
│ └── config/ models, env, logging
│ ├── library/ ComponentLibrary (CONTENT/STYLE kinds) + extractor v2
│ ├── ingestion/ OA bulk fetcher (Europe PMC) + hierarchical chunker
│ ├── safety/ 7-gate (citation_grounding/truth_hierarchy/physician_review/
│ │ audit_trail/consistency/causal/figure_validator)
│ └── diagnostics/ capability_bench + longitudinal_eval + prompt_ab + self_consistency
├── prompts/ medical_core / safety_constraints / yoosun_style (versioned md)
├── scripts/
│ ├── test_rag_smoke.py ① 임포트 + RAG · audit_wiring.py · e2e_diagnose.py
│ ├── eval_benchmark.py 5축 metric (memory/hallucination/stat/figure/citation)
│ ├── replay_task.py events 시간순 재구성
│ ├── bootstrap_oa_learning.py 180 시드 query (5만편 cover 가능)
│ ├── rebuild_components.py 기존 12K paper 재추출 (정규식 v2)
│ ├── enrich_assets.py ontology mapping + citation graph + seed enrichment
│ └── auto_sync.py v3 commit-first 데몬
├── data/
│ ├── raw/ KYRBS/KNHANES .sav (gitignore)
│ ├── runtime/ SQLite (events/tasks/idempotency/lifecycle/procedural/notifications)
│ ├── oa_papers/ 12K+ Europe PMC OA 풀텍스트 + manifest
│ ├── library/ components.db (131K+ reusable microcomponent)
│ ├── exports/ 논문 산출물 (zcb_dep_v5 양식)
│ ├── chromadb/ RAG 벡터 인덱스 (20K+ chunks)
│ ├── knowledge_graph/ medical_graph.json (19K+ nodes)
│ ├── templates/ manuscript_template.json (단일 진실원본)
│ ├── agent_self/ persona, insights, change_log
│ └── author_profiles/ yoosun_cho + oa_curated_top{N} (auto)
├── mcp_server.py MCP backend (30+ tools 공통)
├── docker-compose.yml medical-agent + learner + sapphire-ui
├── AGENTS.md 에이전트 책임 맵 + EstreGenesis pace_mode
├── ARCHITECTURE.md 14 sections 모듈 레지스트리 (★새 모듈 전 필독)
├── DESIGN.md 디자인 토큰 + Sapphire Glass v2
└── CLAUDE.md 작업 표준 12 규칙 + 단일 코어 공유 원칙🛠️ 기술 스택
- UI: Streamlit 1.30+ · Sapphire Glass theme (Lovable-style glassmorphism)
- LLM: Anthropic Claude · OpenAI GPT · Google Gemini (3중 failover + budget downgrade)
- 통계: statsmodels (svy weighted logistic + GEE), pingouin, lifelines, pyreadstat (KYRBS .sav)
- 시각화: matplotlib (출판 figure 300dpi + TNR), seaborn, plotly
- RAG: sentence-transformers (all-MiniLM-L6-v2) + ChromaDB (multi-stage rerank)
- Memory: SQLite WAL (events/tasks/procedural) + ChromaDB (semantic/episodic) + JSON (working/goal)
- Knowledge: NetworkX (medical_graph) + Europe PMC OA Subset (풀텍스트 12K+)
- Schema: Pydantic v2 versioned (MemoryRecord/ProceduralRule/A2AMessage)
- 문서: python-docx (Word zcbdepv5 양식), reportlab (PDF), python-pptx
- 인프라: Docker (medical-agent + learner + sapphire-ui) · FastMCP · auto_sync v3
📚 자세한 문서
- CLAUDE.md — 작업 표준 11 규칙
- ARCHITECTURE.md — 모듈 레지스트리 (11 섹션)
- DESIGN.md — 디자인 토큰 (YAML + body)
memory/— 세션 간 영속 컨텍스트data/change_log/history.json— 모든 의미있는 변경 이력
라이선스 / 사용자
연구용 · 환자 진료 결정에 직접 사용 금지 (의료 안전 레이어는 별도 검토 필요).
