SimLab

SimLab

SimLab — Hur man bygger en AI-driven medicinsk simulator från grunden

Medicinstudenter och AT-läkare tränar livsavgörande beslut på sätt som inte förändrats nämnvärt på decennier: tunna läroböcker, statiska fallbeskrivningar och sporadisk tillgång till dyra simulatordockor som kräver fysisk närvaro och utbildad personal. Gapet mellan teori och den kaotiska verkligheten på en akutmottagning är brett — och konsekvenserna av det är verkliga.

SimLab är mitt svar på det problemet: en webbaserad medicinsk simuleringsplattform där en läkarstudent kan träda in som behandlande läkare för en akut patient, fatta beslut i realtid och få strukturerad återkoppling grundad i aktuella medicinska riktlinjer.

Arkitekturen: enkelhet som ett medvetet val

SimLab är byggt på Node.js med Express v5 och en SQLite-databas. Det kan låta konservativt för en produkt med AI i kärnan — men valet är medvetet. En monolitisk arkitektur med en enda server och en filbaserad databas ger noll infrastrukturkomplexitet under tidig utveckling. Det finns ingen message queue att debugga, ingen containerorkestrerring att konfigurera, ingen molnprovider-specifik låsning.

Hela backend-logiken lever i en enda väl avgränsad server.js skriven i ES Modules-syntax. Databasen hanteras med better-sqlite3 — ett synkront SQLite-bibliotek som eliminerar callback-helvetet och gör databasoperationer läsbara som vanlig kod. Autentisering sköts med JWT och bcrypt: lösenord hashas med tio ronder, tokens löper ut efter 30 dagar och skickas som Bearer-headers på skyddade endpoints.

Det är ingen rocket science — och det är poängen. Den tekniska komplexiteten i SimLab sitter inte i infrastrukturen. Den sitter i vad som händer när en användare klickar på en knapp.

Simueringsmotorn: prompt engineering som medicinsk modellering

Kärnan i SimLab är ett API-lager mot OpenAI GPT-4.1-mini som fungerar som en fysiologisk simuleringsmotor. Det är här projektet börjar bli intressant.

När en användare vidtar en åtgärd — ger adrenalin intravenöst, beställer en blodgas, sätter upp syrgasmask, intuberar — skickar frontenden en POST-request till /api/sim med tre kritiska datapunkter: det aktuella patienttillståndet (vitalparametrar och labbvärden), den specifika åtgärden (typ, läkemedel, dos, administreringsväg) och de senaste åtta åtgärderna som historik.

Servern bygger sedan ett strukturerat prompt med ett scenariespecifikt kliniskt kontextblock. Det här blocket är inte fri text — det är ett precisionsverktyg. Det specificerar exakt vilka fynd som ska vara avvikande för det aktuella tillståndet, vilka fysiologiska responser som är förväntade vid korrekta respektive felaktiga åtgärder, och vilka tids-kritiska behandlingsmål som ska styra simuleringen.

För ett sepsisscenario vet motorn att MAP ska stiga vid rätt vätskebolus och noradrenalin, att laktat ska sjunka vid adekvat behandling och att antibiotika given för sent inte reverserar den fysiologiska försämringen retroaktivt. För ett anafylaxiscenario vet den att antihistamin som enda behandling inte häver obstruktionen — för det är inte så det fungerar.

Temperaturen är satt till 0.3 för simuleringen — nära deterministisk, men med tillräcklig variation för att patientresponsen ska kännas levande snarare än mekanisk. Svaret returneras som strikt validerad JSON med nya värden för samtliga vitaler och labb, plus en kortfattad klinisk förklaring som visas för användaren.

Tretton scenarion, en konsekvent filolofi

Varje scenario i SimLab är byggt kring ett patientfall med klinisk bakgrund, initial presentation, realistiska startvärden och ett detaljerat ”expected findings”-block som styr AI-motorns beteende genom hela sessionen.

De tretton fallen täcker akutmedicinens kärnlandskap: sepsis, anterior STEMI, massiv lungemboli, dekompenserad hjärtsvikt, anafylaxi, övre GI-blödning med cirrhos, ischemisk stroke inom trombolysfönstret, bakteriell meningit, traumatisk hjärnskada med Cushings triad, DKA, svår hyperkalemi, hypertensiv kris och opioidöverdos.

Varje scenario är kopplat mot aktuella internationella riktlinjer — Surviving Sepsis Campaign 2021, ESC:s STEMI-guidelines 2023, WAO/EAACI för anafylaxi, Brain Trauma Foundation och så vidare — för att säkerställa att simuleringen inte undervisar i föråldrad praxis.

Gränssnittet: en akutmonitor i webbläsaren

Frontenden är en single-page application skriven i vanilla HTML, CSS och JavaScript — ingen frontend-framework, inga build-steg, ingen node_modules i klientledet. Det är ett aktivt val för att minimera laddningstider och eliminera beroendekedjor som kan bryta produktionen.

Det visuella språket är hämtat från verkliga patientmonitorer. Tre canvas-animationer kör i realtid: ett EKG med P-QRS-T-morfologi, baseline-wander och amplitudvariation, en sinusformad respirationskurva och en plethysmografisk SpO₂-kurva med diakrotisk inskärning. De svarar alla på patientens tillstånd — vid bradykardi sjunker frekvensen, vid hypotension flackar pulsformen.

Till vänster om monitorn sitter ett ABCDE-ramverk implementerat som ett åtgärdsbibliotek: luftvägsåtgärder under A, syrgasbehandling och ventilation under B, cirkulation och läkemedel under C, neurologi under D, helkroppsundersökning under E. Läkemedelsdatabasen innehåller 43 preparat i alfabetisk ordning med korrekt administreringsväg — inget läkemedel kan ges intravenöst utan att IV-access är etablerat, inget som kräver luftväg kan ges utan att intuberingsstatus är satt.

Till höger en rullningsbar medicinlista och en åtgärdslogg med tidsstämplar. Längst upp en simuleringstimer och en åtgärdsräknare. Hela layouten är tänkt att spegla det kognitiva flödet i ett verkligt akutrum: orientera dig, bedöm, agera, dokumentera.

Debriefingen: återkoppling som faktisk pedagogik

Det som skiljer SimLab från en dyr interaktiv quiz är debriefingloopen. När användaren avslutar sessionen skickas hela åtgärdshistoriken — typ, tidpunkt, dos, administreringsväg — tillsammans med det slutliga patienttillståndet till /api/debrief.

GPT genererar en strukturerad bedömning med ett betyg A–F och en poäng 0–1000. Men poängsättningen är inte binär. Systemet viktar tre dimensioner: systematik (följde användaren ABCDE-ordningen?), kritiska åtgärder (utfördes de med rätt timing?) och utfall (är patienten stabil, försämrad, eller avliden?).

Återkopplingen är konkret och scenariespecifik: styrkor visas med gröna bockmarkeringar, förbättringsområden med oranga pilar och missade kritiska åtgärder med röda kryss. Avslutningsvis ett lärdomsmoment — en kort text som sammanfattar den viktigaste lärdomen från just den sessionen.

Det är den här loopen — simulera, fatta beslut, förstå konsekvenserna, lär dig varför — som är produktens pedagogiska kärna.

Användarsystemet och leaderboarden

Inloggade användare får sin sessionhistorik sparad: scenario, betyg, poäng, tidsåtgång och den fullständiga AI-genererade debriefingen. En profilsida visar totalt antal genomförda sessioner och kumulativ poäng.

En publik leaderboard visar topp-15 användare rankade på totalpoäng — en enkel men effektiv mekanism för att skapa social drivkraft och återkommande beteende. Vill man slå sitt eget rekord i sepsiscenariot finns statistiken där.