«

»

wrz 19

System ekspercki – Clips +.Net

W tym wpisie chciałbym przedstawić co to jest system ekspercki i jak można taki system stworzyć w .Net. System ekspercki lub doradczy to taki system, który na podstawie uzyskanych faktów (danych od użytkownika) potrafi wybrać lub doradzić najlepsze rozwiązanie jakiegoś problemu. Użytkownik przekazuje informację do systemu odpowiadając na pytania. Istnieje wiele przykładów takich systemów np. system diagnozujący co mogło popsuć się w aucie. Człowiek podaje objawy a system diagnozuje i podaje przyczynę awarii. Ciekawym przykładem jest strona mocno pomocni, która potrafi odgadnąć o kim myślimy z zaskakującą dobrą skutecznością.

Jak zbudowany jest system ekspercki? Otóż taki system zbudowany jest z 3 głównych składników:

  • bazy wiedzy
  • modułu wnioskowania
  • interfejsu użytkownika

Baza wiedzy – zawiera fakty czyli informacje otrzymane od użytkownika lub uzyskane przez proces wnioskowania. W bazie wiedzy znajdują się też pytania jakie należy zadań użytkownikowi, reguły wnioskowania oraz stany końcowe. Reguły wnioskowania zawierają powiązania między faktami, pytaniami a stanami końcowymi. Stany końcowe stanowią możliwe rozwiązania jakiegoś problemu.

Moduł wnioskowania – służy do wyciągania wniosków na podstawie zgromadzonych faktów i reguł wnioskowania. Moduł ten decyduje np. o tym jakie pytanie należy zadać użytkownikowi.

Interfejs użytkownika – sposób komunikacji z użytkownikiem. Zwykle wygląda tak.
syseksp1
Jak widać, nie jest to super design, ale wystarczy. Co powinien umożliwiać interfejs? Oczywiście wybór odpowiedzi, przejście do kolejnego pytania, fajnie by było gdyby można było się również cofnąć i wybrać inną odpowiedź na poprzednie pytanie.

Jak zabrać się za zbudowanie takie systemu? Czy da się taki system zrobić korzystając tylko z C#? Hmm interfejs bez problemu, bazę wiedzy trochę trudniej ponieważ przechowuje też reguły wnioskowania a jak to zapisać? Prawdziwym wyzwaniem, było by napisanie jednak mechanizmu odpowiadającego za wnioskowanie. Nie mniej jednak da się, tylko po co tworzyć koło od nowa? Tutaj z pomocą przychodzi wymieniony w tytule Clips. Jest to język, który został specjalnie stworzony do pisania takich systemów.
Przedstawię tutaj tylko, krótki wstęp do tego języka oraz jak połączyć ten język z C#.
Kod w języku Clips zapisuje się w pliku tekstowym bez żadnego wsparcia intellisense, nie mówiąc już o jakiś porządnym IDE co jest ogromną wadą. Jednak język ten posiada ogromną zaletę jaką jest wbudowany mechanizm wnioskowania.

Środowisko Do clipsa można pobrać trochę ubogie IDE z strony projektu.
clips1
Na załączonym screenie widać kilka okien:

  • Dialog window – okno, w którym wpisujemy komendy do interpretera Clipsa. Możemy tutaj np. wstawić fakt bo bazy danych
  • Facts – zawiera listę faktów w bazie wiedzy
  • Agenda – zawiera listę aktywnych(spełnionych) reguł. W tym przypadku widać, że reguła print jest spełniona ponieważ w bazie znajduje się fact f-0
  • Ostatnie okno tworzymy z menu File->New to w nim piszemy nasz program

Fakty w języku clips zapisuje się w takiej postaci: (nazwa_faktu pole1 pole2) Faktem może być np. odpowiedź na pytanie. Aby dodać fakt, to bazy wiedzy wykorzystywana jest instrukcja assert np.(assert (user Rafal 28)) dodaje fakt o user z polami Rafal i 28. Aby usunąć fakt z bazy wiedzy należy użyć funkcji retract np. (retract(user Rafal 28)) usuwa wcześniej dodany fakt.

Reguły definiuje się za pomocą następującej składni:

Definicja reguły składa się z dwóch części, wyróżniamy część aktywującą regułę i część wykonywaną. Reguła jest aktywowana jeśli wszystkie wystąpienia wzorca są odnalezione w bazie wiedzy, czyli jeśli istnieją takie fakty, które odpowiadają wzorcowi. Po aktywacji reguły zostaje ona wykonana czyli np. działanie-1 wstawia nowe fakty do bazy wiedzy.

Szablony – przypominają rekordy i pozwalają definiować fakty składające się z innych faktów a struktura takiego szablonu wygląda następująco:

Teraz, aby dodać fakt należy wykonać następującą instrukcję (assert (user (name Rafal) (age 28)))

To są podstawowe składniki języka Clips i wystarczą do zbudowania prostego systemu eksperckiego. Ok, ale jak to się ma do .Net? Jak widać w Clipsie nie można zbudować interfejsu użytkownika. Można więc wykorzystać np. WPF do zbudowania interfejsu użytkownika, należy tylko w “jakiś” sposób skomunikować się z Clipsem i tutaj przychodzi nam z pomocą opensourcowy projekt CLIPS.NET. Do projektu dołączonych jest kilka przykładów systemów zbudowanych w oparciu o Clipsa np. system który doradza wybrać wino w zależności od naszych preferencji.
WineDemo

Dodatkowo dodaje, swój mały projekt systemu doradczego, który doradza wybór rodzaju pracy protetycznej na podstawie braków uzębienia. Projekt oparty jest na przykładzie z projektu Clips.NET. Całą logiką, wnioskowaniem i sterowaniem przepływem pytań zajmuje się Clips, WPF służy tylko jako warstwa prezentacji. Jeśli komuś kiedyś przyjdzie zbudować taki system polecam poznań bliżej język Clips.

clips2

Link do źródeł projektu.

3 Komentarze

  1. Mateusz

    kolejny świetny wpis Rafał !!! Uczenie się C# z Twoim blogiem jest przyjemne :) Częściej częściej częściej pisz :)

  2. Jakub

    Interesujący i zachęcający do zgłębiania tematu wpis. Dziękuję i gratuluję dobrego bloga.

  3. Tomek

    Ciekawy post!  Wpis, ktory inspiruje do dalszej zabawy z CLIPS :)

Odpowiedz na „JakubAnuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz użyć tych znaczników i atrybutów HTMLa: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Current day month ye@r *