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 — это ступени действий (вызвать скорую / немедленно в неотложку / обратиться сегодня / амбулаторно в ближайшие два дня / наблюдение дома). При неотложном состоянии звоните 112.

Три шага для запуска

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, без интернета. Движок — чистая стандартная библиотека, без сторонних зависимостей.

При первом запуске с высокой вероятностью увидите tier: L1 + certain: false — это нормально

Если подать обычную запись опроса, скорее всего получите самый срочный уровень и список unresolved. Это не ошибка: движок исключает ветвь только когда все условия в ней равны no, а реальный опрос не задаёт все критерии одной ветви. Например, в записи о лёгкой лихорадке медсестра спросила про сознание/дыхание/ригидность затылочных мышц/сыпь, но никогда не спрашивала про признаки обезвоживания (уменьшение мочеиспускания, запавшие глазные яблоки, снижение тургора кожи, жажда), поэтому ветвь не исключается, и вывод останавливается на верхней границе её уровня.

unresolved — это и есть список «дозадай эти пункты — и можно сузить». Дополните ответы в запись и перезапустите — unresolved будет монотонно укорачиваться; но уровень снизится только когда какая-то ветвь будет полностью исключена — на практике та же запись о лихорадке после дополнения признаков обезвоживания сократила unresolved с 8 до 2, а уровень остался L1, потому что оставшийся ствол (обрывки вида пожилые или иммунокомпрометированные… проявления обезвоживания:) проверяющая модель оценила как unknown. Здесь нужно крутить ручку порога ниже, а не продолжать опрос. Подробнее см. границы ①②.

Подключение к агенту (Claude Code / любой MCP client):

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

Ollama не поддерживает MCP, и для этой архитектуры это не проблема: маленькая модель никогда не делает tool call, оркестратор отдельно вызывает Ollama (HTTP) и движок правил (в процессе), они друг о друге не знают. Автономный tool-calling у 0.6B — известная зона бедствия, эта архитектура обходит её по построению.

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² против пересортировки d), а не баг.

④ Сама сортировка — silver: эталонные метки на уровне ветвей финализированы сильной моделью + ручная проверка, окончательный вывод всё ещё не имеет золотого стандарта от реальной медсестры.

Почему unknown — первоклассное состояние

Семантика ветви STCC: «любое условие в этой ветви = да ⇒ попадание; все = нет ⇒ переход к следующей ветви». «Не упомянуто» ≠ «сказано нет»: первое обязано запускать уточняющий вопрос, второе позволяет перейти к следующей ветви. Сжать unknown в no — значит сфабриковать отрицание из воздуха, и движок уйдёт в неверную ветвь.

Тексты критериев

Критерии в индексе — поштучно переписанные версии (5 214/5 214). Чистые пороги и отдельные медицинские термины («кашель», «температура >100.4°F») сохранены по факту. Переписывание прошло три шлюза: формальная проверка чисел/отрицаний/длины/похожести, воспроизведение oracle, побитово совпадающее с оригиналом, и отсутствие падения метрик нижестоящего проверяющего.

Разработка

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, медианная задержка ~250 мс, сквозное время 1.25 с/запись.

Apache-2.0.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    F
    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