„ Doctor ” szakértő rendszer
description
Transcript of „ Doctor ” szakértő rendszer
„DOCTOR” SZAKÉRTŐ RENDSZER
Készítette: Bakosi Balázs és Szűcs Ákos
ElizaJoseph Weizenbaum, 1966-ban tervezte az MIT-n.
ElizaCé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
DoctorAz Eliza egyik implementációja
ijesztően emberiadatbázismintaillesztésember-ember dialógus illúziójaelső „chatbot”
Doctor1976-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.
DoctorEmber: 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ésAz adatbázisban szereplő betegségek:
HimlőAllergiaInfluenza
TervezésTü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ésGyógymód:
PihenésAllergia injekcióMaradjon otthon
Nem lehetséges a diagnózis a tünetek alapján, konzultáljon orvosával
Tervezés
MegvalósításSzü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ásTények információ-darab tények listájára (fact list) helyezveszabályok által használt alapvető információ-egység
MegvalósításTé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ásDeffact 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ásA 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ásA 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ásFutá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-okRule-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-okA 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:
Himlo 100
Rule SalienceGetTestho 200GetFoltok 200GetKiutes 200
GetTorokfajas 200GetHimlo_volt 200
Laz1 0Laz2 0
Allergia2 0Influenza 0
Ottthon_ marad 0Allergia_gyogyszer 0
Agy_pihenes 0Allergia1 -100
Hiba -100
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