AI-генерация плана стоматологического лечения
Составление плана лечения — рутинная но ответственная задача: врач анализирует снимки, данные осмотра, медицинскую историю, формирует последовательность процедур с кодами МКБ и МКБ-С, рассчитывает стоимость, создаёт документ для пациента. На всё это уходит 15–25 минут на пациента. AI-система не заменяет диагноз врача, но автоматизирует его документальное оформление и предлагает структурированный план на основе структурированных входных данных.
Что делает система
Врач после осмотра вводит или диктует: зубную формулу, выявленные патологии по зубам, приоритеты пациента. Система генерирует:
- Полный план лечения с последовательностью процедур
- Коды МКБ-10-СМ и МКБ-С для страховых
- Альтернативные варианты лечения (консервативный vs радикальный)
- Смету с разбивкой по этапам
- Информированное согласие для пациента (на понятном языке)
from langchain_openai import ChatOpenAI
from pydantic import BaseModel
from typing import Optional
import json
class ToothCondition(BaseModel):
tooth_number: int # по ISO 3950
diagnosis: str
severity: str # mild / moderate / severe
priority: str # urgent / planned / cosmetic
class TreatmentPlan(BaseModel):
patient_id: str
chief_complaint: str
diagnoses: list[ToothCondition]
treatment_phases: list[dict] # [{phase, procedures, duration_weeks, cost_range}]
total_visits_estimate: int
contraindications: list[str]
alternative_options: list[dict]
informed_consent_summary: str
class DentalTreatmentPlanGenerator:
SYSTEM_PROMPT = """Ты — AI-ассистент стоматолога. Помогаешь формализовать план лечения.
Ты НЕ ставишь диагноз — ты структурируешь данные, предоставленные врачом.
Используй актуальные стандарты: МКБ-10-СМ, МКБ-С (SNODENT), СанПиН 2.1.3.2630-10.
Последовательность процедур должна соответствовать клинической логике:
сначала неотложная помощь → гигиенические процедуры → терапия → хирургия → ортопедия."""
def __init__(self):
self.llm = ChatOpenAI(model="gpt-4o", temperature=0.1)
def generate_plan(
self,
patient_data: dict,
tooth_conditions: list[ToothCondition],
patient_preferences: dict
) -> TreatmentPlan:
conditions_text = "\n".join([
f"Зуб {tc.tooth_number}: {tc.diagnosis} ({tc.severity}), приоритет: {tc.priority}"
for tc in tooth_conditions
])
prompt = f"""Создай план стоматологического лечения.
Данные пациента:
- Возраст: {patient_data.get('age')}
- Аллергии: {patient_data.get('allergies', 'не указаны')}
- Системные заболевания: {patient_data.get('systemic_conditions', 'нет')}
- Принимаемые препараты: {patient_data.get('medications', 'нет')}
- Главная жалоба: {patient_data.get('chief_complaint')}
Состояние зубов (по данным врача):
{conditions_text}
Предпочтения пациента:
- Бюджет: {patient_preferences.get('budget', 'не ограничен')}
- Приоритет: {patient_preferences.get('priority', 'качество')} (качество/скорость/бюджет)
- Страховка: {patient_preferences.get('insurance', 'нет')}
Создай план с:
1. Этапы лечения (фазы с обоснованием последовательности)
2. Для каждой процедуры: название, код МКБ-С, количество посещений, риски
3. Альтернативный план (более консервативный)
4. Предупреждения и противопоказания
5. Краткое резюме для пациента (без медицинского жаргона)
Верни JSON структуры TreatmentPlan."""
response = self.llm.invoke([
{"role": "system", "content": self.SYSTEM_PROMPT},
{"role": "user", "content": prompt}
])
return TreatmentPlan.model_validate_json(response.content)
Интеграция с медицинскими снимками
Для клиник с цифровыми рентгенами — извлечение данных через Vision API:
import base64
from openai import OpenAI
client = OpenAI()
def analyze_dental_xray(image_path: str) -> dict:
"""Анализирует рентгеновский снимок — вспомогательно для врача"""
with open(image_path, "rb") as f:
image_b64 = base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": [
{"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{image_b64}"}},
{"type": "text",
"text": """Опиши видимые изменения на панорамном рентгеновском снимке зубов.
Структурируй по зонам. Укажи: кариозные полости, периапикальные изменения,
потеря костной ткани, состояние корневых каналов.
ВАЖНО: Это вспомогательная информация для врача, не диагноз."""}
]
}],
max_tokens=500
)
return {"xray_observations": response.choices[0].message.content}
Интеграция с МИС
# Интеграция с 1С:Медицина, Dental4Windows, Ident
class DentalMISConnector:
def push_treatment_plan(self, plan: TreatmentPlan, mis_patient_id: str):
"""Загружает план в медицинскую информационную систему"""
procedures = []
for phase in plan.treatment_phases:
for proc in phase["procedures"]:
procedures.append({
"code": proc["icds_code"],
"name": proc["name"],
"tooth_number": proc.get("tooth_number"),
"phase": phase["phase_number"],
"estimated_cost": proc.get("cost_range"),
"status": "planned"
})
return self.mis_client.create_treatment_plan(
patient_id=mis_patient_id,
procedures=procedures,
created_by="ai_assistant"
)
Кейс: сеть из 8 стоматологических клиник. Среднее время составления плана лечения: 22 мин → 6 мин (врач проверяет и корректирует AI-черновик). Точность соответствия кодов МКБ-С (проверка страховым отделом): 94%. За первые 4 месяца: 0 отказов страховых по причине неверной кодировки (было 3–4 в месяц).
Сроки: базовый генератор плана: 3–4 недели; интеграция с МИС и рентген-анализ: 6–8 недель дополнительно.







