550 likes | 718 Views
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.
E N D
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-oskönyv"Computer Power and Human Reason," /The New Media Reader/Weizenbaumkifejtette 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
Megvalósítás • Szükség adatszerkezet definiálás • Deftemplate és slot-ok • (deftemplate név (slotné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 (slottestho) • (slot foltok) • (slotkiutes) • (slottorokfajas) • (slothimlo_volt) • (slotlaz))
Megvalósítás • Tények • információ-darab tények listájára (factlist) 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: • (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 (deffactsInitial (Beteg )) Miért Initial?(nil érték) másként: (deffacts paciens (Beteg (foltok igen) (kiutesek nem) (torokfajasnem)
Megvalósítás A szabályok általános formája: (defrule <szabálynév> [<megjegyzés>] <feltétel>* ; LeftHand 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> (watchrules) • CLIPS> (agenda) • Vagy Windows Show Status Windows
Megvalósítás (defruleGetTestho (declare (salience 200)) ?p <- (Beteg (testhonil)) => (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-okkö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 (defruleGetTestho (declare (salience 200)) ?p <- (Beteg (testhonil)) => (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. „patternbinding” 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 factslotja is
A GetRule-ok ?p <- (Beteg (testhonil) ……. (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 (defruleGetTestho (declare (salience 200)) ?p <- (Beteg (testhonil)) => (printout t "Adja meg a beteg hőmérsékletét: ") (bind ?valasz (read)) (modify ?p (testho ?valasz)))
A GetFoltok • (defruleGetFoltok • (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 • (defruleGetKiutes • (declare (salience 200)) • ?p <- (Beteg (kiutesnil)) • => • (printout t "Jelenkeztekkiutesek a betegen? (igen vagy nem): ") • (bind ?valasz (read)) • (modify ?p (kiutes ?valasz)))
A GetTorokfajas • (defruleGetTorokfajas • (declare (salience 200)) • ?p <- (Beteg (torokfajasnil)) • => • (printout t "Faj a beteg torka? (igen vagy nem): ") • (bind ?valasz (read)) • (modify ?p (torokfajas ?valasz)))
A GetHimlo_volt • (defruleGetHimlo_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) (laznil)) • (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) (laznil)) • (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 factslotjainak 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
Himlorule • (defruleHimlo • (declare (salience 100)) • (Beteg (foltok igen) (himlo_volt nem) (laz magas)) • => • (assert (diagnozishimlo)) • (printout t "A beteg himlos" crlf))
Allergia2 rule (defrule Allergia2 (Beteg (kiutes igen)) => (assert (diagnozis allergia)) (printout t "A kiutesekalapjana beteg allergias!" crlf))
Allergia1 rule • (defrule Allergia1 • (declare (salience -100)) • (and (Beteg (foltok igen)) • (not (diagnozishimlo))) • => • (assert (diagnozis allergia)) • (printout t "A beteg valoszinulegallergias!" 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 (diagnozishimlo) => (printout t "A beteg maradjon otthon, amig szervezete legyozi a himlot!" crlf))