„Doctor” szakértő rendszer Készítette: Bakosi Balázs és Szűcs Ákos „Doctor” szakértő rendszer
Eliza Joseph Weizenbaum, 1966-ban tervezte az MIT-n.
Eliza Célja, hogy a program képes legyen részt venni emberrel vagy egy másik programmal folytatott beszélgetésben.
Eliza „Mesterséges intelligencia” első próbálkozásai. Egyszerű mintaillesztéses technika Felhasználó válaszai scriptek
Doctor Az Eliza egyik implementációja ijesztően emberi adatbázis mintaillesztés ember-ember dialógus illúziója első „chatbot”
Doctor 1976-os könyv "Computer Power and Human Reason," /The New Media Reader/ Weizenbaum kifejtette milyen gyorsan és mélyen alakultak ki érzelmek az emberekben a program iránt. Nem szabad gépekre bízni a döntést.
Doctor Ember: Nos, a barátom miatt jöttem ide. ELIZA: A barátod miatt jöttél ide? Ember: Azt mondta, hogy sokat vagyok depressziós. ELIZA: Sajnálattal hallom, hogy depressziós vagy. Ember: Igen. Boldogtalan vagyok. ELIZA: Gondolod, hogy a jöveteled segít abban, hogy ne légy boldogtalan?
Célunk Néhány tünet alapján a betegség megállapítása és javallott gyógymód kiírása
Tervezés Az adatbázisban szereplő betegségek: Himlő Allergia Influenza
Tervezés Tünetek meghatározása: Testhőmérséklet (érték megadása) Foltok (igen vagy nem) Kiütés (igen vagy nem) Torokfájás (igen vagy nem) Volt himlős(igen vagy nem)
Tervezés Gyógymód: Pihenés Allergia injekció Maradjon otthon Nem lehetséges a diagnózis a tünetek alapján, konzultáljon orvosával
Tervezés
Megvalósítás Szükség adatszerkezet definiálás Deftemplate és slot-ok (deftemplate név (slot név [(típus)] [(tartomány)])) Típus: NUMBER – lehet INTEGER vagy FLOAT is. INTEGER – egész számok FLOAT – lebegőpontos számok STRING – karaktersorozat Tartomány: A mező által felvehető értékeket korlátozhatjuk ezzel a funkcióval.
Megvalósítás (deftemplate Beteg (slot testho) (slot foltok) (slot kiutes) (slot torokfajas) (slot himlo_volt) (slot laz))
Megvalósítás Tények információ-darab tények listájára (fact list) helyezve szabályok által használt alapvető információ-egység
Megvalósítás Tények tények hozzáadása a tény listához: tények hozzáadása a tény listához: (assert <tény>*) vagy (deffacts [<modul név>] <név> [„<megjegyzés>”] <RHS pattern>*)
Megvalósítás Deffact vagy assert? A programban olyan tényeket írhatunk elő ezzel, amelyek minden kiadott (reset) parancs hatására azt az eredményt adják, mintha az (assert (fact1)) parancsokat adtuk volna ki.
Megvalósítás (deffacts Initial (Beteg )) Miért Initial?(nil érték) másként: (deffacts paciens (Beteg (foltok igen) (kiutesek nem) (torokfajas nem)
Megvalósítás A szabályok általános formája: (defrule <szabálynév> [<megjegyzés>] <feltétel>* ; Left Hand Side (LHS) => <következmény>* ); Hand Side (RHS)
Megvalósítás A szabályok működése: Szabály feltételinek párosítása a tényekkel Teljesülnek Agenda Szünet ha nincs benne szabály Automatikus
Megvalósítás Futás követése: CLIPS> (watch rules) CLIPS> (agenda) Vagy Windows Show Status Windows
Megvalósítás (defrule GetTestho (declare (salience 200)) ?p <- (Beteg (testho nil)) => (printout t "Adja meg a beteg hőmérsékletét: ") (bind ?valasz (read)) (modify ?p (testho ?valasz)))
A Rule-ok (szabályok) Csoportosításuk: Adatok bekérésére szolgáló szabályok Adatok alapján a betegség meghatározása A betegségek alapján a gyógymód kiírása
A GetRule-ok Általános jellemzőik: A felhasználónak felteszünk valamilyen kérdést A kezdeti nil értékeket taralmazó tényünket a válasz értékre módosítjuk Szükséges valamilyen prioritás, hogy a rule-ok közül elsőként hajtódjanak végre
A GetRule-ok Rule-ok általános szerkezete: (defrule <szabály név> [<comment>] [<declaration>] <conditional-element>* => <action>* )
GetTestho (defrule GetTestho (declare (salience 200)) ?p <- (Beteg (testho nil)) => (printout t "Adja meg a beteg hőmérsékletét: ") (bind ?valasz (read)) (modify ?p (testho ?valasz)))
A GetRule-ok Declaration rész: itt állítjuk be a prioritást: (declare (salience 200)) Értéke -10000 és +10000 között mozoghat, alapértelmezetten 0 A nagyobb értékű rule lesz hamarabb végrehajtva Az ugyanolyan értékűek közül a sorban előrébb állóba lép be
A GetRule-ok A tény módosítása: <változó> <- <tény> ....... (modify <tény címét tartalmazó változó> <RHS-slot>*) • Működése: Az un. „pattern binding” operátorral (<-) egy változót összekapcsolunk a tényünk egy mezőjével • A változó értékét a modify paranccsal módosítva változik a fact slotja is
A GetRule-ok ?p <- (Beteg (testho nil) ……. (modify ?p (testho ?valasz)))
A GetRule-ok Kiíratás: (printout <logical-name> <expression>*) A „t” paraméter használva a képernyőre írhatunk A „crlf” kifejezést használhatjuk sortörésre
A GetRule-ok (printout t "Adja meg a beteg hőmérsékletét: ")
A GetRule-ok A beolvasás eredményét a „bind” paranccsal menthetjük el egy változóba (bind változó (read)) A változó neve „valasz” lesz Konkrét megvalósítás: (bind ?valasz (read))
A GetRule-ok Egy változó értékét a „modify” paranccsal módosíthatjuk (modify ?p (testho ?valasz)))
A GetTestho (defrule GetTestho (declare (salience 200)) ?p <- (Beteg (testho nil)) => (printout t "Adja meg a beteg hőmérsékletét: ") (bind ?valasz (read)) (modify ?p (testho ?valasz)))
A GetFoltok (defrule GetFoltok (declare (salience 200)) ?p <- (Beteg (foltok nil)) => (printout t "Jelentkeztek foltok a betegen? (igen vagy nem): ") (bind ?valasz (read)) (modify ?p (foltok ?valasz)))
A GetKiutes (defrule GetKiutes (declare (salience 200)) ?p <- (Beteg (kiutes nil)) => (printout t "Jelenkeztek kiutesek a betegen? (igen vagy nem): ") (bind ?valasz (read)) (modify ?p (kiutes ?valasz)))
A GetTorokfajas (defrule GetTorokfajas (declare (salience 200)) ?p <- (Beteg (torokfajas nil)) => (printout t "Faj a beteg torka? (igen vagy nem): ") (bind ?valasz (read)) (modify ?p (torokfajas ?valasz)))
A GetHimlo_volt (defrule GetHimlo_volt (declare (salience 200)) ?p <- (Beteg (laz magas) (foltok igen) (himlo_volt nil)) => (printout t "Volt mar himloje a betegnek? (igen vagy nem): ") (bind ?valasz (read)) (modify ?p (himlo_volt ?valasz)))
A Laz1 és Laz2 rule A fact „laz” mezőjének értékét mi számítjuk ki a „testho” mező étéke alapján Laz1: magas laz: testho>=39 Laz2: enyhe laz: 37<= testho<39 Prioritása 0 lesz Tesztelnünk kell, hogy a „testho” mező értéke szám-e:
A Laz1 és Laz2 rule „Test” függvény: true vagy false értéket ad vissza Általános alakja:(test <függvényhívás>) Tesztelés numerikus tipusra: (test (numberp <változó>) Tesztelés a változó értékére: (test (and (< <változó> x) (>=<változó> y)))
A Laz1 rule (defrule Laz1 ?p <- (Beteg (testho ?t) (laz nil)) (test (numberp ?t)) (test (>= ?t 39)) => (modify ?p (laz magas)) (printout t "A betegnek magas laza van!" crlf))
A Laz2 rule (defrule Laz2 ?p <- (Beteg (testho ?t) (laz nil)) (test (numberp ?t)) (test (and (< ?t 39) (>= ?t 37))) => (modify ?p (laz enyhe)) (printout t "A betegnek enyhe laza van!" crlf))
Betegséget meghatározó rule-ok Feltétel a rule-ban: A beteg fact slotjainak az értéke A rule-ban létrehozunk egy új fact-et (assert) diagnozis néven, ennek az értéke alapján választjuk majd ki a gyógymódot Kiíratjuk a képernyőre a diagnózist
Betegséget meghatározó rule-ok A himlőnek és az allergiának is lehet a tünete a „folt”->himlőnek magasabb prioritást adunk, vizsgáljuk volt-e már himlős Allergia tünete lehet a kiütés és a folt is
Himlo rule (defrule Himlo (declare (salience 100)) (Beteg (foltok igen) (himlo_volt nem) (laz magas)) => (assert (diagnozis himlo)) (printout t "A beteg himlos" crlf))
Allergia2 rule (defrule Allergia2 (Beteg (kiutes igen)) => (assert (diagnozis allergia)) (printout t "A kiutesek alapjan a beteg allergias!" crlf))
Allergia1 rule (defrule Allergia1 (declare (salience -100)) (and (Beteg (foltok igen)) (not (diagnozis himlo))) => (assert (diagnozis allergia)) (printout t "A beteg valoszinuleg allergias!" crlf))
Influenza rule (defrule Influenza (Beteg (torokfajas igen) (laz enyhe | magas)) => (assert (diagnozis influenza)) (printout t "A beteg influenzas!" crlf))
Gyógymód Rule-ok Feltétel a rule-ba: a „diagnozis” fact értéke Ha feltétel igaz akkor kiíratjuk a betegségnek megfelelő gyógymódot Létrehozunk egy „Hiba” nevű rule-t: ha a „diagnozis” fact értéke nem meghatározott, akkor hiba üzenetet iratunk ki
Otthon_marad rule (defrule Otthon_marad (diagnozis himlo) => (printout t "A beteg maradjon otthon, amig szervezete legyozi a himlot!" crlf))
Allergia_gyogyszer rule (defrule Allergia_gyogyszer (diagnozis allergia) => (printout t "A betegnek egy allergia injekcio javasolt!" crlf))
Agy_pihenes rule (defrule Agy_pihenes (diagnozis influenza) => (printout t "A betegnek pihenes javasolt!" crlf))
Hiba rule (defrule Hiba (declare (salience -100)) (not (diagnozis ?)) => (printout t "A diagnozis nem lehetseges! Kerjuk keresse fel orvosat!" crlf))
Prioritás táblázat:
Futtatás: A Clips figyeli, hogy a tények aktuális értékei alapján melyik rule hajtható végre Mindig a nagyobb prioritású rule-ba lép bele Ha a feltételek alapján már egy rule se hajtható végre, befejeződik a futás