Skip to main content
Glama

stcc-mcp — 전화 분류 등급: 규칙 기반 결정적 계산, 0.6B는 판정 기준만 확인

진료 기록을 입력하면 L1–L5 등급 + 처치 문구 + 항목별 인용 + 부족한 판정 기준 목록이 출력됩니다. 분류는 결정적 규칙 엔진이 계산합니다 (225개 STCC 프로토콜 / 849개 분기 / 4,168개 판정 기준, 패키지에 포함). Qwen3-0.6B는 한 가지만 답합니다: 주어진 기록과 하나의 판정 기준에 대해 yes / no / unknown.

모델은 분기를 선택하지 않고, 등급을 정하지 않으며, 처치 문구를 생성하지 않고, tool call을 하지 않습니다.

⚠️ 응급 분류 시스템이 아니며, 진단을 하지 않고, 의사를 대체할 수 없습니다. L1–L5는 처치 단계입니다 (구급차 호출 / 즉시 응급실 / 오늘 진료 / 2일 내 외래 / 자택 관찰). 응급 상황은 즉시 120에 전화하세요.

세 단계로 실행하기

pip install stcc-mcp                                       # 或 uvx stcc-mcp …
ollama pull hf.co/chenhaodev/stcc-checker-0.6b-GGUF:Q8_0   # 640MB 核对器
stcc-mcp doctor                                            # 自检:索引 / Ollama / 模型
stcc-mcp triage --protocol Chest_Pain.md "$(cat 记录.txt)"

상주 프로세스 없음, Docker 없음, 네트워크 불필요. 엔진은 순수 표준 라이브러리이며, 제3자 의존성이 없습니다.

첫 실행 시 대부분 tier: L1 + certain: false가 보일 것입니다 — 이것이 정상입니다.

일반적인 진료 기록을 넣으면 가장 긴급한 등급과 함께 unresolved 목록이 나올 가능성이 높습니다. 오판이 아닙니다: 엔진은 어떤 분기의 **모든 조건이 no**일 때만 해당 분기를 배제할 수 있는데, 실제 진료에서는 한 분기의 모든 판정 기준을 묻지 않기 때문입니다.

예를 들어 경증 발열 기록에서 간호사가 의식/호흡/목 경직/발진을 물었지만 탈수 징후를 전혀 묻지 않았다면 (배뇨 감소, 안구 함몰, 피부 탄력 저하, 갈증), 해당 분기를 배제할 수 없어 출력이 그 분기의 등급 상한에 머뭅니다.

unresolved는 '이 몇 가지를 더 물으면 좁힐 수 있다'는 목록입니다. 답변을 기록에 추가하고 다시 실행하면 unresolved는 단조적으로 줄어듭니다. 하지만 등급은 어떤 분기가 완전히 배제될 때만 내려갑니다 — 실제로 같은 발열 기록에 탈수 징후를 보완한 후 unresolved가 8→2로 줄었지만 등급은 여전히 L1이었습니다. 남은 주 분기(노인 또는 면역저하자…탈수 증상: 같은 반쪽 문장)에 대해 검증기가 unknown을 주었기 때문입니다. 이때는 계속 묻는 것이 아니라 아래의 임계값 조절 장치를 움직여야 합니다. 자세한 내용은 경계 ①② 참조.

에이전트(Claude Code / 모든 MCP 클라이언트)에 연결:

pip install "stcc-mcp[mcp]" && stcc-mcp serve               # stdio MCP

Ollama는 MCP를 지원하지 않지만, 이 형태에서는 문제가 되지 않습니다: 소형 모델은 절대 tool call을 하지 않으며, 오케스트레이션 계층이 Ollama(HTTP)와 규칙 엔진(프로세스 내)을 각각 호출하므로 서로를 알지 못합니다. 0.6B의 자율 tool-calling은 알려진 문제 영역이며, 이 아키텍처는 설계상 이를 우회합니다.

Related MCP server: Quellgeist

출력

필드

의미

tier

L1–L5, 안전 상한: 실제 답보다 가벼울 수 없음

disposition

해당 분기의 처치 문구 (규칙 테이블에서 가져옴, 모델 생성 아님)

certain

true = 증거가 등급 결정에 충분함; false = worst_case 상한

citations

판정 근거가 된 판정 기준 + 행 번호, 감사 가능

unresolved

부족한 판정 기준 목록 — 이를 보완하면 등급을 좁힐 수 있음

등급에서 행동으로의 매핑은 사용자의 오케스트레이션 계층이 결정합니다. 이 패키지는 등급과 처치 문구만 제공합니다.

no 판정의 임계값은 하나의 조절 장치

--no-threshold(기본 0.63): P(no) ≥ τ ⇒ no, 그렇지 않으면 yes/unknown 중 더 큰 값을 선택합니다.

동일한 모델의 릴리스 분포(n=3225)에서의 전체 트레이드오프 곡선:

τ

acc

false_no🔴

no_recall

0.63(기본)

0.9426

0.0000

0.9027

0.50

0.9457

0.0000

0.9189

0.40

0.9495

0.0024

0.9378

0.30

0.9498

0.0084

0.9432

0.10

0.9516

0.0120

0.9635

동일한 발열 진료 기록에서 τ만 변경:

$ stcc-mcp triage --protocol Fever_Adult.md --no-threshold 0.63 "$(cat 记录.txt)"
  tier L1 · 拨打救护车        · unresolved 2
$ stcc-mcp triage --protocol Fever_Adult.md --no-threshold 0.40 "$(cat 记录.txt)"
  tier L3 · 2小时内接受医疗护理 · unresolved 5

τ를 낮추면 ⇒ 검증기가 '질문했고 부인된' 판정 기준을 no로 판정할 가능성이 높아지고 ⇒ 분기가 배제되며 ⇒ 등급이 내려갑니다. 이것은 모델을 더 정확하게 만드는 것이 아니라, 동일한 트레이드오프 곡선에서 작업점을 바꾸는 것입니다 — 대가로 누락 진단 위험이 높아집니다.

false_no(성립해야 하는데 no로 판정)는 하드 게이트입니다 — 거짓 no는 참값 분기를 안전한 수렴에서 배제할 수 있습니다. no를 적게 판정하는 것은 과분류만 유발하므로 비용 조절 장치입니다. 기본값은 dev에서 false_no ≤ 0.0036로 선택되었습니다(해당 dev는 양성 예시 495개, 해상도 0.0020, 체계적으로 보수적). 따라서 '최적값'이 고정된 것이 아니라 곡선 전체가 제공되며, 자신의 비용 행렬에 따라 점을 선택하세요. 재현: python -m scripts.threshold_sweep --model <m> --split <s> --collect --report.

🔴 알려진 경계 (이 부분을 먼저 읽고 사용 여부를 결정하세요)

① 입력은 '프로토콜에 따라 한 차례 질문을 마친' 기록이어야 하며, 원본 자술이 아닙니다. 짧은 주호소의 unknown 비율은 94%입니다. 실제 풍부한 대화(IMCS-21, 748자 / 40턴)에서도 여전히 88%입니다. 이유는 STCC 전제 분기가 급성 위험 신호(질식, 청색증, 무반응)를 선별하는데, 자연 발생 말뭉치는 정의상 이러한 상황을 포함하지 않으며 의사도 묻지 않기 때문입니다 — 이것은 선택 효과이며, 더 풍부한 말뭉치로 바꿔도 효과가 없습니다.

② 실제 진료에서는 한 분기의 모든 판정 기준을 묻지 않습니다 따라서 등급은 해당 분기의 상한에 머뭅니다. 이것은 worst_case가 올바르게 작동하는 것이지만, 상한의 조임 정도는 전적으로 진료의 완전성에 의해 결정됩니다.

③ worst_case의 안전성은 '거짓 no를 생성하지 않음'을 전제로 합니다. 출력은 현재 증거로 배제할 수 없는 가장 긴급한 등급입니다(어떤 분기는 모든 조건이 no일 때만 배제됨). 따라서 과소 분류는 항상 0이며, 증거에 no가 하나 추가될 때마다 단조적으로 조여집니다(두 불변식은 tests/가 지킵니다). 정보가 부족하면 '모두 구급차 호출'로 퇴화합니다 — 이것은 설계 방향(과소 분류 10·d² vs 과분류 d)이며 버그가 아닙니다.

④ 분류 자체는 silver입니다: 분기 수준 참조는 강력한 모델이 확정하고 인간이 검토했지만, 최종 결론에는 실제 간호사의 gold가 여전히 부족합니다.

unknown이 왜 일급 상태인가

STCC 분기 의미는 '이 분기의 어떤 조건이 예이면 ⇒ 적중; 모두 아니오이면 ⇒ 다음 분기로 이동'입니다. '언급되지 않음' ≠ '아니오라고 말함': 전자는 반드시 추가 질문을 유발해야 하고, 후자만 분기를 전환할 수 있습니다. unknown을 no로 압축하는 것은 근거 없이 음성을 위조하는 것과 같아서 엔진이 잘못된 분기로 가게 됩니다.

판정 기준 텍스트

인덱스의 판정 기준은 항목별 독립 재작성 버전입니다(5,214/5,214). 순수 임계값과 단일 의학 용어(「기침」「체온>100.4°F」)는 사실대로 유지됩니다. 재작성에는 세 가지 관문이 있습니다: 수치/부정/길이/유사성 형식 검증, oracle 재생이 원본과 비트 단위로 일치, 다운스트림 checker 지표 하락 없음.

개발

uv sync
uv run pytest -q                        # 27 条回归
uv run python -m scripts.mcp_selfcheck  # oracle 回放 4,168 条判据,<1 秒

scripts/mcp_selfcheck.py는 엔진의 충실도 자가 점검입니다: 각 판정 기준을 yes로, 나머지를 no로 설정하고 엔진이 도달한 분기와 처치를 확인합니다. 이것은 모델 평가가 아닙니다 — 일치하지 않으면 컴파일 또는 평가에 구멍이 있는 것입니다.

모델

chenhaodev/stcc-checker-0.6b-GGUF(Q8_0 / Q4_K_M). 판정 기준 수준 false_no 0.0024, 지연 중앙값 ~250ms, 엔드투엔드 1.25s/건.

Apache-2.0.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An agentic AI system that enables healthcare professionals to log patient symptoms, retrieve similar clinical cases, and search medical documents using RAG. It integrates a Chroma vector database with the Model Context Protocol to provide real-time clinical decision support.
    -
  • A
    license
    A
    quality
    C
    maintenance
    First-line incident triage you can trust: ranked root-cause hypotheses where every claim cites a real evidence handle — and the agent abstains rather than guess.
    1
    1
    MIT