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), клінічні рекомендації.
Послідовність процедур має відповідати клінічній логіці:
невідкладна допомога → гігієнічні процедури → терапія → хірургія → ортопедія."""
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. Коротке резюме для пацієнта (без медичного жаргону)
Повернення структури TreatmentPlan JSON."""
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}
Інтеграція з системами управління клініками
# Інтеграція з MIS-платформами
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 тижні; інтеграція з MIS та аналіз рентгена: 6–8 тижнів додатково.







