12 Aralık 2019 Perşembe

RASA ile chatbot geliştirme

Bu yazıda sizlere açık kaynak chatbot geliştirme framework lerinden birisi olan rasa dan bahsedeceğim. 


Konuya giriş yapmadan evvel chatbot ile kastedilen şey nedir diye bir göz atmakta fayda var. Chatbot, kullanıcılarla yazılı olarak iletişime geçip, onlarla sohbet edebilen, dertlerini dinleyen, en azından belli başlı konularda da olsa yanıtlar verebilen programdır.  
Özellikle hizmet sektöründe personel ihtiyacını ortadan kaldırarak müşterilere/ kullanıcılara  daha hızlı ve sürekli iletişim imkanı sunmaya olanak tanır. Amaçlanan her ne kadar karşıda bir insan varmış gibi konuşabilmek olsa da, günümüzde henüz o seviyeye gelindiğini söylemek mümkün değil. Bu konuda çalışmalar da aslında son derece yoğun bir şekilde devam etmekte. (bknz NLP, NLU) Bu mini girizgahtan sonra, ilk olarak chatbot dünyasında (belki biraz rasa özelinde olabilir) kullanılan bazı temel terimlerden bahsetmek istiyorum.

  • INTENT: Her bir cümle ile ifade edilmek istenen şey.
Örnek: merhaba diye bir intent tanımladık farzedelim. Farklı cümleler bu intent'i ifade edebilir.
          intent: merhaba
           - merhaba nasılsın
           - selam dostum
           - hello dude
  • ENTITY: Intent içerisinden bir değer çıkarılmak istenebilir. Örneğin kur bilgisini ifade eden bir intent tanımladık diyelim. miktar ise bu intent içerisinde geçen bir entity olacaktır.

Örnek: döviz intent'i içerisinden miktar ve kur bilgisinin çıkarılması;
      intent: döviz
           - 3 dolar kaç lira { entity--> miktar = 3, kur=dolar}
         - 25 dolar kaç lira sterlin { entity--> miktar = 3 , kurFrom =  dolar, kurTo = sterlin}
  • STORY: Akış diye Türkçeye çevirebileceğimiz story 'ler ise, kullanıcı tarafından girilen mesajların ilgili intent'ler ile eşleştirilmesi neticesinde, bot'un vereceği cevapları içeren sohbet yönergeleri diyebiliriz.
Örnek bir akış; 
       * havalar_nasil
          - hangi şehir için havayı sordun kardeş
       * sehir
         - action_hava

Yukarıdaki akışı incelersek;

    1. kullanıcı bir cümle yazdı ve bu cümle havalar_nasil intent'i ile eşleşti.
    2. bot ilgili akışı izleyerek "hangi şehir için havayı sordun kardeş" diye bir cevap döndü
    3. Kullanıcı bir şehir girdi, girilen bu mesaj da yine bir intent ile eşleştirildi.
    4. Şayet sehir isminde tanımlı olan intent ile eşleşirse, bot (rasa) action_hava diye bir kodu çalıştırdı.
  • TEMPLATE: Bir önceki maddede akışları anlatırken, "hangi şehir için havayı sordun kardeş" diye bir cevap döndüğünden bahsettik. Bu tip cevaplar, rasa da akışlar içerisinde direkt olarak yazılmıyor. Bunun için ayrıca template'ler tanımlanıp, bu template'lerin isimleri akışların içerisine yazılmakta.
  • ACTION: Yine akışları anlatırken action_hava diye bir komut yazdık. Şayet sabit bir cevaptan ziyade, veri tabanından veya herhangi bir başka yerden bir sonuç alınıp kullanıcıya gönderilmek isteniyorsa, bu durumlarda action lar kullanılmakta. Action aslında python ile yazılmış bir fonksiyon.
 Konu ile alakalı en azından temel kavramlardan bahsettikten sonra, adım adım basit bir rasa chatbot örneği hazırlayalım. Bknz: https://rasa.com/docs/rasa/user-guide/rasa-tutorial/#create-a-new-project 

Kurulum
RASA'yı yüklemek son derece basit, pip install rasa komutu ile son derece kolay bir şekilde yükleyebilirsiniz. Kurulumdan sonra python kurulu olan klasördeki Scripts klasöründe (Anaconda için) rasa.exe dosyasını göreceksiniz. Bu exe dosyası aslında rasa modüllerini çalıştırmak için hazırlanmış bir uygulama, sizin bilgisayarınızdaki kurulum dosya yoluna göre ilgili python rasa modüllerini çağırmanızı sağlıyor. rasa.exe dosyasını kullanmadan da örneğin python -m rasa train yazarak, rasa ile train işlemi yapabiliriz. Ancak kaynak olarak verdiğim tutorial'de "rasa train" komutu ile bu işlem gerçekleştirilmekte.

Proje oluşturma
Kurulumu tamamladıktan sonra, boş bir klasör açıp terminalden bu klasör altında rasa init komutunu yazınca, ilgili klasörde birçok dosyanın oluştuğunu göreceksiniz ve "hello word" niteliğinde bir rasa chatbot projesine sahip olmuş olacaksınız. 



Bu dosyalardan bazılarını girişte anlattığım temel terimler ile eşleştirirsek;

data/nlu.md  ---- intent'lerin ve entity'lerin yer alacağı dosya
data/stories.md  ---- story (akış) lerin yer alacağı dosya
domain.yml   -- chatbot projemizdeki tüm tanımların yapıldığı,                                  sabit cevap (template) ların tanımlandığı dosya
actions.py  ---- action' ların yazıldığı python dosyası

Bu dosyaların içeriğini şu şekilde güncelleyelim.

************  data/nlu.md ************
## intent:merhaba
- selam
- selam aleykum
- heyyy
- naber

## intent:onay
- evet
- kesinlikle
- tabiki
- mantikli
- ok
- onayliyorum
- uygun

## intent:reddet
- hayir
- asla
- dogru degil
- oyle dusunmuyorum
- ilgilenmiyorum

## intent:soru
- bir sorum var
- bir sey sorucam
- sorum var
- birşey sorabilir miyim

## intent:hakaret
- seni gerizekali
- gerizekalı
- aptal
- salak
- öküz

## intent:kimsin
- sen kimsin
- kiminle gorusuyorum
- adin ne
- adin ne kardes
- kimsin
-
## intent:iyiyim
- mükemmel
- çok iyi
- super
- çok iyiyim
- idare eder
- iyiyim ben de
- iyiyim
- ben de iyiyim
- süperim
- iyi hissediyorum
- harikayım

## intent:kotuyum
- kötü
- üzgün
- mutsuz
- çok kötü
- berbatım
- korkunc
- çok iyi değilim
- iyi degilim
- hic iyi degilim
- moralim bozuk

- kötüyüm


************  data/stories.md ************
## happy path
* merhaba
  - utter_merhaba
* iyiyim
  - utter_iyiyim

## sad path 1
* merhaba
  - utter_merhaba
* kotuyum
  - utter_kotuyum

## kimsin
* kimsin
  - utter_kimsin

* hakaret
  - utter_hakaret

************  domain.yml ************
intents:
  - merhaba
  - iyiyim
  - kotuyum
  - reddet
  - soru
  - hakaret
  - kimsin

actions:
- utter_merhaba
- utter_iyiyim
- utter_kotuyum
- utter_kimsin
- utter_hakaret

templates:
  utter_merhaba:
  - text: "Merhabalar, nasılsınız?"

  utter_iyiyim:
  - text: "İyi olmanıza sevindim, size nasıl yardımcı olabilirim"

  utter_iyiyim:
  - text: "Hayat üzülmek için çok kısa, Umarım hersey düzelir. Bana sorunuz var mı?"

  utter_kimsin:
  - text: "Ben bir sanal asistanım, kiminle görüşüyorum"

  utter_hakaret:

  - text: "Lütfen daha kibar olun!"


Bu ve henüz bahsetmediğim (endpoints.yml, credentials.yml, config.yml) dosyalarını gördükten sonra ise tek yapacağımız şey şu komutu çalıştırmak;

--> rasa train

Bu komutu çalıştırınca bir eğitim süreci başlamış olacak, eğitim işlemi bittiğinde ise models klasörü altında .tar.gz uzantılı bir dosyanın oluştuğunu göreceksiniz. Eğittiğimiz bot ile konuşmak için rasa shell komutunu çalıştırmamız kafi.

Her türlü görüş, öneri ve sorularınızı İletişim sayfası aracılığıyla iletebilirsiniz...

2 yorum:

  1. Daha fazla rasa ile ilgili örnek oluşturabilir misiniz?

    YanıtlaSil
    Yanıtlar
    1. Uzun zamandır RASA ile ilgilenmiyorum, maalesef pek mümkün görünmüyor.

      Sil