Tekoälyttömyyksiin hajoamista
Muiden maallisten velvoitteiden aikavaateiden normalisoiduttua ajattelin rustata pienen selonteon taannoiseen bottiseminaariin osallistuneen IRC-bottimme rakentamisprosessista.
Suunniteluolossa totesimme, että botilla olisi tarkoitus olla mahdollisesti joitakin hyödyllisiä bottimaisia ominaisuuksia kuten päivän teekkariruokalistan näyttäminen ja bussien aikataulun hakeminen, mutta pääasiallinen tarkoitus olisi selvitä Turingin testistä. Tarkemmin toteuttaisimme siis ominaisuuden, jonka avulla botti voisi keskustella ihmisen kanssa – hakien vastauksensa repliikkeihin toiselta ihmiseltä, jolle alkuperäisen puhujan repliikit välitettäisiin botin puhumina ja päin vastoin.
Varsinainen koodi toteutettiin suurelta osin yhteistyössä yhden koneen äärellä kukin vuorollaan näpytellen. Tästä Saanalla on enemmän asiaa. Matkalla opittiin kuitenkin kaikenlaista PircBot-kirjastosta, tapahtumapohjaisesta ohjelmoinnista sekä tekstin käsittelystä.
Vaikeaksi ominaisuudeksi toteuttaa osoittautui hyödyllisistä ominaisuusehdotuksista toteutettavaksi valittu ruokalistahaku. Päätin nimittäin kaiken järjen ja lähtöoletusten vastaisesti lähteä parsimaan Ruokalistat.netin tietoja säännöllisten lausekkeiden sijaan sivun XML-esityksen pohjalta, sillä halusin ottaa selvää siitä, miten XML:n käsittely Javalla onnistuu. Ajatus oli saada sivun HTML-koodi XML-muotoon Tidy-kirjaston kautta ja kaivella tuloksesta vaadittavat tiedot ulos XPathilla.
Toteutus onnistuikin, muttei ilman komplikaatioita. Javan versiota 1.0 olevan XPath-kirjaston rajoitteiden kiertämiseen ja Ruokalistat.netille sopivien XPath-lausekkeiden keksimiseen upposi tunti jos toinenkin. Jouduin toteamaan, että dynaamisiin kieliin tottuneelle XML-datan käsittely oli turhauttavan kankeaa.
(Tämän teknisen puolen sivuaminen ohimennen oli mainittu seminaaripalautteessa negatiivisena seikkana. Jep, anteeksi horinani. Olisi pitänyt joko selittää kunnolla tai olla mainitsematta.)
Kun toiminnot – eli avainsanoihin reagointi, keskustelu ja ruokalistaus – oli saatu laadittua, käsissä oli kasa PircBotia laajentavan FanttiBotti-luokan sisälle laadittuja metodeja. Tässä vaiheessa nostin kissan pöydälle ja totesin, että yksi oppimistavoitteista oli mennyt ohi: jos olisimme toteuttaneet ominaisuuksia itsenäisesti, kuinka yhdistäisimme ominaisuudet jos ne kaikki olisivat itse bottikoodin seassa? Seuraavat pari tuntia käytimme ominaisuuksien refaktoroimiseen sellaiseen muotoon, että jokainen oli nätisti omassa paketissaan ja bottiluokka vain välitti niille tiedot oleellisista tapahtumista. Tämä Observerin soveltaminen sai muutamalla valon syttymään: näinhän tehtiin jo muutamassa Java-harjoituksessa!
Viimeisenä silauksena botti sai kyvyn tulkata komentoriviparametreja. Tarkoitus oli siis että botin käynnistäjä pystyy määrittämään minkä nimisenä ja mille kanaville botti ilmestyy. Tämä onnistui yllättävän mukavasti args4j-kirjaston tarjoamia annotaatioita käyttämällä. Ensitutustumiseni annotaatioihin oli positiivinen, ja suunnittelin hyväksikäyttäväni niitä törkeästi esimerkiksi päätösprojektin yhteydessä.
Kaikenlaista tuli siis säädettyä. Lupauduinpa vielä bottiseminaarin jälkimainingeissa yhdistämään kaikkien bottien hyödyllisiksi koetut ominaisuudet (joita muuten löytyy jokunen) yhteen supermegajättihyötybottiin kaikkien iloksi. Saa nähdä minkälaisella aikataululla sekin projekti valmistuu, mutta ainakaan sitä ei ole kuopattu.
- Eevert

Jätä kommentti