DST and DP

This commit is contained in:
Antoni Solarski 2024-05-25 12:52:38 +02:00
parent da419d6659
commit 4a699901df
2 changed files with 170 additions and 67 deletions

View File

@ -2,23 +2,27 @@
grammar book; grammar book;
public <request> = interesuja mnie dania kuchni woskiej oraz meksykanskiej | jaka jest gramatura waszego burrito i czy mozna wybrac do niego mieso | przyjmujecie patnosc karta | a od ktorej do ktorej jest otwarta | super w takim razie czy mogbym dokonac rezerwacji na godzine 21 | przy oknie poprosze | jakie alergeny zawiera stek z grillowanymi warzywami i jakie piwa importowane macie dokadnie | czy akceptujecie bitcoina | a w jakiej cenie jest ta pizza | karta | koreanskie bibimbap z woowina brzmi dobrze ile kosztuje | nie nie chce nic zmieniac prosze o przekazanie dania do realizacji | zaplace gotowka przy odbiorze | lasagne brzmi super moge do tego wypic cole i zamowic jakis deser | wszystko jest okej dziekuje | chciabym dostac 2 rozne warianty mozesz mi zaproponowac alternatywe dla drugiej osoby zamiast ryby i rosou | podaj menu bez potraw na zimno | a piwo 0 | a czy mozna blikiem | jakie dania oferujecie | czy oferujecie rozne poziomy wysmazenia wolowiny | ile kosztuje to danie gowne | tak zoz zamowienie na adres xyz | a cos innego nie lubie kurczaka | oki | czy macie moze w ofercie zrazy woowe | jaka macie karte napojow | czy oferujecie dowoz | jaki jest koszt steka z poledwicy woowej caprese i wody gazowanej | poprosze o dostawe na adres rubiez 12j na godzine 16 | dziekuje czy moge zamowic posiki na godzine 15 | a co oferujecie z dan miesnych | czy do tego serwowane sa jeszcze ziemniaki | dziekuje bardzo w takim razie chciabym to zamowic | jaka sa ceny deserow | jak duza jest porcja pierogow ruskich | to poprosze do tego sok owocowy soki z jakich owocow sa dostepne czy sa one swiezo wyciskane | to poprosze dodac to do zamowienia oraz podsumowac cae zamowienie | na wynos | 00120 watykan | a czy macie jakies dania azjatyckie | w takim razie dodaj ja do zamowienia czy mogbys zaproponowac cos na przystawke i na deser | poprosze wode i cole | potwierdzam | nie dziekuje do widzzenia | chciabym zjesc tatara zupe grzybowa stek i tiramisu czy moge zjesc tatara bez cebuli | za drogo jednak nie zjem tatara z dowozem na adres biedronkowa 4 | w takim razie na przystawke bedzie tatar a co do zupy mam pytanie z jakich grzybow ona sie skada | w takim razie cae moje zamowienie to bedzie tatar krem z dyni stek z poledwicy woowej i obedzie sie bez deseru pytanie jeszcze czy mozna pacic karta | w takim razie chetnie zostane i na ten moment bedzie dla mnie wszystko | tak ale jeszcze to nie koniec; public <request> = interesuja mnie dania kuchni wloskiej oraz meksykanskiej | jaka jest gramatura waszego burrito i czy mozna wybrac do niego mieso | przyjmujecie patnosc karta | a od ktorej do ktorej jest otwarta | super w takim razie czy mogbym dokonac rezerwacji na godzine 21 | przy oknie poprosze | jakie alergeny zawiera stek z grillowanymi warzywami i jakie piwa importowane macie dokadnie | czy akceptujecie bitcoina | a w jakiej cenie jest ta pizza | koreanskie bibimbap z woowina brzmi dobrze ile kosztuje | nie nie chce nic zmieniac prosze o przekazanie dania do realizacji | zaplace gotowka przy odbiorze | lasagne brzmi super moge do tego wypic cole i zamowic jakis deser | wszystko jest okej dziekuje | chciabym dostac 2 rozne warianty mozesz mi zaproponowac alternatywe dla drugiej osoby zamiast ryby i rosou | podaj menu bez potraw na zimno | a piwo 0 | a czy mozna blikiem | jakie dania oferujecie | czy oferujecie rozne poziomy wysmazenia wolowiny | ile kosztuje to danie gowne | tak zoz zamowienie na adres xyz | a cos innego nie lubie kurczaka | czy macie moze w ofercie zrazy woowe | jaka macie karte napojow | czy oferujecie dowoz | jaki jest koszt steka z poledwicy woowej caprese i wody gazowanej | poprosze o dostawe na adres rubiez 12j na godzine 16 | dziekuje czy moge zamowic posiki na godzine 15 | a co oferujecie z dan miesnych | czy do tego serwowane sa jeszcze ziemniaki | dziekuje bardzo w takim razie chciabym to zamowic | jaka sa ceny deserow | jak duza jest porcja pierogow ruskich | to poprosze do tego sok owocowy soki z jakich owocow sa dostepne czy sa one swiezo wyciskane | to poprosze dodac to do zamowienia oraz podsumowac cae zamowienie | na wynos | 00120 watykan | a czy macie jakies dania azjatyckie | w takim razie dodaj ja do zamowienia czy mogbys zaproponowac cos na przystawke i na deser | poprosze wode i cole | nie dziekuje do widzzenia | chciabym zjesc tatara zupe grzybowa stek i tiramisu czy moge zjesc tatara bez cebuli | za drogo jednak nie zjem tatara z dowozem na adres biedronkowa 4 | w takim razie na przystawke bedzie tatar a co do zupy mam pytanie z jakich grzybow ona sie skada | w takim razie cae moje zamowienie to bedzie tatar krem z dyni stek z poledwicy woowej i obedzie sie bez deseru pytanie jeszcze czy mozna pacic karta | w takim razie chetnie zostane i na ten moment bedzie dla mnie wszystko | tak ale jeszcze to nie koniec;
public <select> = potwierdzam | poprosze <liczba> {portion_size} porcje | no dobrze | <address> {address} | to bedzie moje cale zamowienie | poprosze <potrawa> {dish} | czy moglibyscie przygotowac <liczba> porcji na okreslona godzine na wynos; public <select> = poprosze <liczba> {portion_size} porcje | [<zamawianie>] <potrawa> {dish} | no dobrze | [<proszenie>] <address> {address} | czy moglibyscie przygotowac <liczba> porcji na okreslona godzine na wynos;
<address> = uniwersytetu poznanskiego <liczba> 61614 poznan | poziomkowa <liczba> poznan; <proszenie> = poprosze na | poprosze do | poprosze | do | na ;
public <negate> = dziekuje to wszystko | jakie aperitify sa u was dostepne | poprosze w takim razie carpaccio z buraka tiramisu i jakies dwa napoje | dobrze nie moge sie juz doczekac | troche drogo nie ma znizki dla studentow; <zamawianie> = chcialbym zjesc | poprosze | chcialbym | chcialabym | chcialabym zjesc | chce | chce zjesc | dla mnie bedzie | wezme ;
<address> = uniwersytetu poznanskiego <liczba> 61614 poznan | poziomkowa <liczba> poznan | poznan | uam poznan | wydzial matematyki | poznanska <liczba> ;
public <negate> = dziekuje to wszystko | jakie aperitify sa u was dostepne | poprosze w takim razie carpaccio z buraka tiramisu i jakies dwa napoje | troche drogo nie ma znizki dla studentow;
public <hello> = <hej_siema> <who_are_you> | witam system | dzien dobry | czesc | witam ; public <hello> = <hej_siema> <who_are_you> | witam system | dzien dobry | czesc | witam ;
public <welcomemsg> = czesc jestem agentem dialogowym przyjmujacym zamowienia w restauracji moge doradzic ci w wyborze odpowiedniej pozycji z menu w czym moge ci pomoc ; public <welcomemsg> = czesc jestem agentem dialogowym przyjmujacym zamowienia w restauracji moge doradzic ci w wyborze odpowiedniej pozycji z menu w czym moge ci pomoc ;
public <ack> = potwierdzam | tak | tak potwierdzam | tak to wszystko | to poprosze | super to zatem wszystko | oki | to odbiore | wszystko jest ok dziekuje; public <ack> = potwierdzam | tak | tak potwierdzam | tak to wszystko | to poprosze | super to zatem wszystko | oki | to odbiore | wszystko jest ok dziekuje | dobrze nie moge sie juz doczekac;
public <reqalts> = chetnie wezme ziemniaki pieczone | to prosze dodac to do moje zamowienia czy macie jakies napoje | patnosc moze byc karta ale w 3 porcjach | super to zatem wszystko | pasuje czy mozesz powiedziec jakie skadniki sa w saatce moge miec uczulenia na niektore skadniki | a mozliwosc jest z szarlotki z lodami | dostawy i patnosci | a na miejscu moge zapacic | wezme cole ile wynosi cakowity koszt zamowienia | okej w takim razie dziekuje za pomoc pojde do innej restauracji; public <reqalts> = chetnie wezme ziemniaki pieczone | to prosze dodac to do moje zamowienia czy macie jakies napoje | patnosc moze byc karta ale w 3 porcjach | super to zatem wszystko | pasuje czy mozesz powiedziec jakie skadniki sa w saatce moge miec uczulenia na niektore skadniki | a mozliwosc jest z szarlotki z lodami | dostawy i patnosci | a na miejscu moge zapacic | wezme cole ile wynosi cakowity koszt zamowienia | okej w takim razie dziekuje za pomoc pojde do innej restauracji;
public <reqmore> = w takim razie niech zostanie poczatkowa opcja mozemy przejsc do kwestii dostawy | platnosc gotowka ulica sezamkowa <liczba> pacanowo | okej to wziabym | okej to wziabym to a co do <potrawa> {dish} proponujesz | okej to wezme do tego cole zero ile wynosi koszt caego zamowienia | chciabym bez saatki jednak a w miejscu tego kiszonke czy maci kiszonki w restauracji | tak | dobrze a czy po takich potrawach nie bedzie mi smierdziao z buzi na randce | czemu nie podaes tego wczesniej piwo to tez napoj | kuflowe mocne | a czy mozecie zapakowac dania na wynoc | dobrze to poprosze jednak 4pak kuflowego i prosze zapakowac na wynos | to poprosze | dobrze w takim razie zaproponuj cos innego; public <reqmore> = w takim razie niech zostanie poczatkowa opcja mozemy przejsc do kwestii dostawy | platnosc gotowka ulica sezamkowa <liczba> pacanowo | okej to wziabym | [okej to wziabym] [to] a co do <potrawa> {dish} proponujesz | okej to wezme do tego cole zero ile wynosi koszt caego zamowienia | chciabym bez saatki jednak a w miejscu tego kiszonke czy maci kiszonki w restauracji | tak | dobrze a czy po takich potrawach nie bedzie mi smierdziao z buzi na randce | czemu nie podaes tego wczesniej piwo to tez napoj | kuflowe mocne | a czy mozecie zapakowac dania na wynoc | dobrze to poprosze jednak 4pak kuflowego i prosze zapakowac na wynos | to poprosze | dobrze w takim razie zaproponuj cos innego;
<hej_siema> = hej | siema | czesc | witam ; <hej_siema> = hej | siema | czesc | witam ;
@ -54,11 +58,10 @@ public <bye> = (dobrze nie moge sie juz doczekac | do widzenia | dziekuje milego
public <help> = [pokaz] <help_with> {help_with}; public <help> = [pokaz] <help_with> {help_with};
<help_with> = menu | (jakie posilki moge zjesc z tego menu) | (A jaka to <potrawa>) | (Chciabym zjesc <potrawa>); <help_with> = menu | (jakie posilki moge zjesc z tego menu) | (A jaka to <potrawa>) ;
<potrawa> = tatara | tatar | poledwica | poledwice | pizza | makaron | picia | zupa | danie_glowne | deser | napoj | ryba | rybe; <potrawa> = tatara | tatar | poledwica | poledwice | pizza | pizze | tiramisu | zrazy [wolowe] | pyzy | placki | makaron | picia | zupa | danie_glowne | deser | napoj | ryba | rybe;
public <confirm> = Dziekuje | tak; public <confirm> = Dziekuje | tak;
public <affirm> = poprosze w takim razie ta pizze razy <liczba> oraz <liczba> litra coli | chciabym zamowic na adres <address> | wybornie czy z kuchni woskiej znajdzie sie lasagne oraz czy w winach znajda sie ciekawsze pozycje takie jak amarena | jestem wysoce niepocieszony z powodu braku trunkow siarczystych ale jakos przebrne przez to czy na deser jest mozliwosc tiramisu | dziekuje | na 15 dzisiaj mozna zarezerowac stoli z podanym obiadem | na <godzina> na pojutrze | no dobrze przekonales mnie zoze u was zamowienie czy przyjmujecie patnosc karta | pamietajcie zeby byo cieple ; public <affirm> = poprosze w takim razie ta pizze razy <liczba> oraz <liczba> litra coli | chciabym zamowic na adres <address> | wybornie czy z kuchni woskiej znajdzie sie lasagne oraz czy w winach znajda sie ciekawsze pozycje takie jak amarena | jestem wysoce niepocieszony z powodu braku trunkow siarczystych ale jakos przebrne przez to czy na deser jest mozliwosc tiramisu | dziekuje | na 15 dzisiaj mozna zarezerowac stoli z podanym obiadem | na <godzina> na pojutrze | no dobrze przekonales mnie zoze u was zamowienie czy przyjmujecie patnosc karta | pamietajcie zeby byo cieple ;

View File

@ -1,29 +1,50 @@
import string
from typing import Any from typing import Any
import jsgf import jsgf
from unidecode import unidecode from unidecode import unidecode
import string
import argparse from convlab.dst import dst
class Model(): def default_state():
return dict(
user_action=[],
system_action=[],
belief_state={
'address': '',
'payment_method': '',
'dish': [],
'time': ''
},
booked={},
request_state=[],
terminated=False,
history=[]
)
class Model:
def __init__(self): def __init__(self):
pass self.state = default_state()
self.nlu = NLU()
self.dst = DST(self.state)
self.dp = DP(self.state)
self.nlg = NLG(self.state)
def __call__(self, prompt) -> Any: def __call__(self, prompt) -> Any:
nlu = NLU() print(prompt)
dst = DST()
dp = DP()
nlg = NLG()
msg = prompt.lower() msg = prompt.lower()
rama_nlu = nlu(msg) r = self.nlu(msg)
print(rama_nlu) print(r)
rama_dst = dst(rama_nlu) r = self.dst(r)
rama_dp = dp(rama_dst) print(r)
text = nlg(rama_dp) r = self.dp()
print(r)
# r = self.nlg(r)
return text return r
class NLU(): class NLU():
@ -61,29 +82,85 @@ class NLU():
return {'act': 'null', 'slots': []} return {'act': 'null', 'slots': []}
class DST(): class DST(dst.DST):
def __init__(self):
self.msgs = []
def __call__(self, msg) -> Any: def __init__(self, state):
self.msgs.append(msg) dst.DST.__init__(self)
return msg self.state = state
def __call__(self, user_act) -> Any:
if len(user_act['slots']) == 0:
user_act = [(user_act['act'], None, None)]
else:
user_act = [(user_act['act'], k, v) for k, v in user_act['slots'] if v is not None]
self.state['request_state'] = {}
for act, slot, value in user_act:
self.state['user_action'].append(act)
if act == "platnosc":
self.state['belief_state']['payment_method'] = value
self.state['request_state'] = ['payment_method']
elif act == "offer":
self.state['request_state'] = ['menu']
elif act == 'select':
if slot == 'dish':
self.state['belief_state']['dish'].append(value)
else:
self.state['belief_state'][slot] = value
self.state['request_state'] = [slot]
elif act == 'inform':
pass
elif act == 'request':
pass
return self.state
class DP(): class DP():
def __init__(self): def __init__(self, state):
pass self.state = state
def __call__(self) -> Any:
system_action = None
if self.state['user_action'][-1] == 'hello':
system_action = 'welcomemsg'
# przywitaj uzytkownika (i pokaz menu)
elif self.state['user_action'][-1] == 'select':
system_action = 'inform'
# poinformuj o wybranych slotach z "request_state"
elif (self.state['user_action'][-1] == 'help'
or self.state['user_action'][-1] == 'offer'
or self.state['user_action'][-1] == 'reqmore'
or (self.state['user_action'][-1] == 'request' and len(self.state['request_state']) == 0)
):
system_action = 'offer'
# zaoferuj cale menu
elif self.state['user_action'][-1] == 'ack':
system_action = 'bye'
self.state['terminated'] = True
# potwierdz i zakoncz, podsumuj zamowienie
def __call__(self, msg) -> Any:
if "imie" in msg:
return "imieMSG"
else: else:
return None system_action = 'inform'
# poinformuj o wybranych slotach z "request_state"
# lub o wszystkich jezeli nic nie ma w request state
self.state['system_action'].append(system_action)
return system_action
class NLG(): class NLG():
def __init__(self): def __init__(self, state):
pass self.state = state
def __call__(self, msg) -> Any: def __call__(self, msg) -> Any:
if msg == "imieMSG": if msg == "imieMSG":
@ -94,32 +171,55 @@ class NLG():
if __name__ == "__main__": if __name__ == "__main__":
model = Model() model = Model()
# parser = argparse.ArgumentParser()
# parser.add_argument("--msg")
# args = parser.parse_args()
# print(model(prompt="chcialbym zarezerwowac stolik na jutro na dziesiata dla trzech osob")) # jezeli sie przywita to przywitaj uzytkownika (i pokaz menu)
# print(model(prompt="Cześć")) # response = model("Cześć")
# print(model(prompt="Hej, jakim botem jesteś?")) # response = model("Witam")
# print(model(prompt="Hej, w czym mi możesz pomóc?")) # response = model("Witam system")
# print(model(prompt="Siema, w czym możesz mi pomóc?")) # response = model("Hej, jakim botem jesteś?")
# print(model(prompt="Witam")) # response = model("Hej, czym się zajmujesz?")
# print(model(prompt="Witam system")) # response = model("Hej, w czym mi możesz pomóc?")
# print(model(prompt="Hej, czym się zajmujesz?")) response = model("Siema, w czym możesz mi pomóc?")
# print(model(prompt="Czesc, jestem agentem dialogowym przyjmujacym zamowienia w restauracji. Moge doradzic ci w wyborze odpowiedniej pozycji z menu. W czym moge ci pomoc?")) assert response == "welcomemsg"
# print(model(prompt="oki"))
# print(model(prompt="Potwierdzam!")) print()
# print(model(prompt="Tak!"))
# print(model(prompt="Tak to wszystko!")) # jezeli prosi o pomoc lub po prostu o menu to zaoferuj cale menu
print(model(prompt="Interesuja mnie dania kuchni woskiej oraz meksykanskiej")) # response = model("Pokaz menu")
print(model(prompt="okej to wziabym to a co do picia proponujesz")) # response = model("A co do picia proponujesz?")
print(model(prompt="Poproszę ryba")) # response = model("Jakie inne desery oferujesz?")
print(model(prompt="Poproszę tatara")) response = model("Interesują mnie dania kuchni włoskiej oraz meksykanskiej.")
print(model(prompt="Poproszę 2 porcje")) assert response == "offer"
print(model(prompt="Zaplacę kartą przy odbiorze"))
print(model(prompt="Dobrze, nie mogę sie już doczekać")) print()
print(model(prompt="uniwersytetu poznanskiego 4 61-614 poznan"))
print(model(prompt="dziekuje to wszystko")) # jezeli wybierze danie to zapisz wybor i poinformuj o nim
print(model(prompt="pokaz menu")) # response = model("Wezmę rybe")
print(model(prompt="poprosze blikiem z gory")) # response = model("Poproszę tatara")
print(model(prompt="menu")) response = model("Chciałbym zjesc tatara")
assert response == "inform"
print()
# jezeli poda adres to zapisze wybor i poinformuj o nim
# response = model('Poproszę na poznańską 2')
response = model("uniwersytetu poznanskiego 4 61-614 poznan")
assert response == "inform"
# jezeli wybierze rodzaj platnosci to zapisz wybor i poinformuj o nim
# response = model("karta")
# response = model("Poproszę blikiem z góry")
response = model("Zapłacę kartą przy odbiorze")
assert response == "inform"
print()
# jezeli potwiedzi zamowienie to zakoncz zamawianie sukcesem i wypisz calosc
# response = model("Potwierdzam!")
# response = model("Tak!")
# response = model("Tak to wszystko!")
# response = model("Super, to zatem wszystko!")
response = model("Dobrze, nie mogę się już doczekać.")
assert response == "bye"
print()