Nehéz lehet megérteni, hogy a felhasználó mit jelent a beszélgetésben és a kontextusban, de természetesebb beszélgetési környezetet biztosíthat a robotnak. A Language Understanding (LUIS) egy felhőalapú API-szolgáltatás, amely lehetővé teszi, hogy a robot felismerje a felhasználói üzenetek célját, természetesebb nyelvet biztosíthasson a felhasználótól, és jobban irányíthassa a beszélgetési folyamatot.
Ez a témakör végigvezeti a LUIS hozzáadásán egy járatfoglalási alkalmazáshoz, hogy felismerje a felhasználói bemenetben található különböző szándékokat és entitásokat.
Ez az alapvető robotminta egy repülőtéri járatfoglalási alkalmazás példáját mutatja be. Egy LUIS-szolgáltatással ismeri fel a felhasználói bemenetet, és visszaadja a legjobban felismert LUIS-szándékot.
A nyelvi modell három szándékot tartalmaz: Book Flight, Cancelés None. A LUIS ezeket a szándékokat arra használja, hogy megértse, mit jelentett a felhasználó, amikor üzenetet küld a robotnak. A nyelvi modell olyan entitásokat is meghatároz, amelyeket a LUIS ki tud nyerni a felhasználó bemenetéből, például a kiindulási vagy a célteret.
A felhasználói bevitel minden feldolgozása után menti mind a kettő aktuális állapotát, DialogBot mind ConversationStatepedig a UserState . Az összes szükséges információ összegyűjtése után a kódolási minta létrehoz egy bemutató járatfoglalási foglalást. Ebben a cikkben a minta LUIS-aspektusait fogjuk lefedni. A minta általános folyamata azonban alább látható:
OnMembersAddedAsync A akkor lesz meghívva, amikor egy új felhasználó csatlakozik, és megjelenít egy üdvözlőkártyát.
OnMessageActivityAsync A minden fogadott felhasználói bemenethez meg van hívva.
A OnMessageActivityAsync modul a megfelelő párbeszédpanelt futtatja a Run párbeszédpanel-bővítmény metódusán keresztül. Ezután a fő párbeszédpanel meghívja a LUIS segítőt, hogy megtalálja a legmagasabb pontszámú felhasználói szándékot. Ha a felhasználói bevitel felső szándéka "BookFlight" értéket ad vissza, a segéd kitölti a LUIS által visszaadott felhasználó adatait. Ezután a fő párbeszédpanel elindítja a BookingDialog, amely szükség szerint további információkat szerez be a felhasználótól, például:
Origin az eredeti város
TravelDate a járat lefoglalásának dátuma
Destination a célváros
A felhasználói bevitel minden feldolgozása után menti mind a kettő aktuális állapotát, dialogBot mind conversationStatepedig a userState . Az összes szükséges információ összegyűjtése után a kódolási minta létrehoz egy bemutató járatfoglalási foglalást. Ebben a cikkben a minta LUIS-aspektusait fogjuk lefedni. A minta általános folyamata azonban alább látható:
onMembersAdded A akkor lesz meghívva, amikor egy új felhasználó csatlakozik, és megjelenít egy üdvözlőkártyát.
OnMessage A minden fogadott felhasználói bemenethez meg van hívva.
A onMessage modul a mainDialog felhasználói bemenetet gyűjtő modult futtatja.
Ezután a fő párbeszédpanel meghívja a LUIS segítőt FlightBookingRecognizer , hogy megtalálja a legmagasabb pontszámú felhasználói szándékot. Ha a felhasználói bevitel felső szándéka "BookFlight" értéket ad vissza, a segéd kitölti a LUIS által visszaadott felhasználó adatait.
A válasz visszalépése után megőrzi a LUIS által visszaadott felhasználó adatait, mainDialog és elindul bookingDialog. bookingDialog szükség szerint további információkat szerez be a felhasználótól, például
destination a cél város.
origin az eredeti város.
travelDate a járat lefoglalásának dátuma.
A felhasználói bevitel minden feldolgozása után menti mind a kettő aktuális állapotát, DialogBot mind ConversationStatepedig a UserState .
Az összes szükséges információ összegyűjtése után a kódolási minta létrehoz egy bemutató járatfoglalási foglalást.
Ebben a cikkben a minta LUIS-aspektusait fogjuk lefedni. A minta általános folyamata azonban alább látható:
onMembersAdded A akkor lesz meghívva, amikor egy új felhasználó csatlakozik, és megjelenít egy üdvözlőkártyát.
onMessageActivity A minden fogadott felhasználói bemenethez meg van hívva.
A onMessageActivity modul a megfelelő párbeszédpanelt futtatja a run párbeszédpanel-bővítmény metódusán keresztül. Ezután a fő párbeszédpanel meghívja a LUIS segítőt, hogy megtalálja a legmagasabb pontszámú felhasználói szándékot. Ha a felhasználói bevitel felső szándéka "BookFlight" értéket ad vissza, a segéd kitölti a LUIS által visszaadott felhasználó adatait. Ezután a fő párbeszédpanel elindítja a BookingDialog, amely szükség szerint további információkat szerez be a felhasználótól, például:
Origin az eredeti város
TravelDate a járat lefoglalásának dátuma
Destination a célváros
A felhasználói bevitel minden feldolgozása után menti mind a kettő aktuális állapotát, DialogBot mind conversation_statepedig a user_state . Az összes szükséges információ összegyűjtése után a kódolási minta létrehoz egy bemutató járatfoglalási foglalást. Ebben a cikkben a minta LUIS-aspektusait fogjuk lefedni. A minta általános folyamata azonban alább látható:
on_members_added_activity A akkor lesz meghívva, amikor egy új felhasználó csatlakozik, és megjelenít egy üdvözlőkártyát.
on_message_activity A minden fogadott felhasználói bemenethez meg van hívva.
A on_message_activity modul a megfelelő párbeszédpanelt futtatja a run_dialog párbeszédpanel-bővítmény metódusán keresztül. Ezután a fő párbeszédpanel hívja LuisHelper meg a legmagasabb pontszámú felhasználói szándékot. Ha a felhasználói bemenet felső szándéka a "BookFlight" értéket adja vissza, a segédfüggvény kitölti a LUIS által visszaadott felhasználó adatait. Ezután a fő párbeszédpanel elindítja a BookingDialog, amely szükség szerint további információkat szerez be a felhasználótól, például:
A LUISBeszélgetési alkalmazások lapján válassza az Új alkalmazás jobb oldalán található lefelé mutató nyilat, majd válassza az Importálás JSON-ként lehetőséget.
Az Új alkalmazás importálása párbeszédpanelen:
Válassza ki a FlightBooking.json fájlt a minta CognitiveModels mappájában.
Adja meg FlightBooking az alkalmazás nem kötelező nevét, és válassza a Kész lehetőséget.
A rendszer kérheti az összetett entitások frissítését. Ezt figyelmen kívül hagyhatja, és válassza az Emlékeztető később lehetőséget:
Betanítsa és közzétegye az alkalmazást az éles környezetben.
További információkért tekintse meg az alkalmazások betanítása és közzététele luis-dokumentációját.
Miért érdemes entitásokat használni?
A LUIS-entitások lehetővé teszik, hogy a robot megértse a szabványos szándékokon túli eseményeket. Ez lehetővé teszi, hogy további információkat gyűjtsön a felhasználóktól, amelyek lehetővé teszik a kérdések továbbítását és az intelligensebb válaszadást. A FlightBooking.json fájl a három LUIS-szándék definíciói mellett a "Book Flight", a "Cancel" és a "None" szándékot is tartalmazza, például a "From.Airport" és a "To.Airport" entitásokat. Ezek az entitások lehetővé teszik a LUIS számára, hogy észlelje és visszaadja a felhasználó eredeti bemenetében található további információkat, amikor új utazási foglalást kér.
Értékek beszerzése a LUIS-alkalmazáshoz való csatlakozáshoz
A LUIS-alkalmazás közzététele után a robotból érheti el. A LUIS-alkalmazás roboton belüli eléréséhez több értéket is rögzítenie kell. Ezeket az információkat a LUIS-portálon lehet lekérni.
Alkalmazásadatok lekérése a LUIS.ai portálról
A beállításfájl (appsettings.json.envvagy config.py) az összes szolgáltatáshivatkozás egy helyen való összevonásának helye. A lekért információk a következő szakaszban lesznek hozzáadva ehhez a fájlhoz.
Amikor meg van nyitva a közzétett LUIS-alkalmazás, válassza a KEZELÉS lapot.
Válassza a bal oldalon a Beállítások lapot, és rögzítse az alkalmazásazonosítóhoz<megjelenített értéket YOUR_APP_ID>.
Válassza a bal oldalon az Azure-erőforrások lapot, majd a Szerzői erőforrás csoportot. Jegyezze fel a Hely<> mezőben YOUR_REGION és az elsődleges kulcs<értékét YOUR_AUTHORING_KEY>.
Adja hozzá a LUIS-alkalmazás eléréséhez szükséges információkat, beleértve az alkalmazásazonosítót, a szerzői kulcsot és a régiót a appsettings.json fájlban. Ezek azok az értékek, amelyeket korábban mentett a közzétett LUIS-alkalmazásból. Vegye figyelembe, hogy az API-gazdagép nevének formátumának <your region>.api.cognitive.microsoft.comkell lennie.
Adja hozzá a LUIS-alkalmazás eléréséhez szükséges információkat, beleértve az alkalmazásazonosítót, a szerzői kulcsot és a régiót a .env fájlban. Ezek azok az értékek, amelyeket korábban mentett a közzétett LUIS-alkalmazásból. Vegye figyelembe, hogy az API-gazdagép nevének formátumának <your region>.api.cognitive.microsoft.comkell lennie.
Adja hozzá a LUIS-alkalmazás eléréséhez szükséges információkat, beleértve az alkalmazásazonosítót, a szerzői kulcsot és a régiót a application.properties fájlban. Ezek azok az értékek, amelyeket korábban mentett a közzétett LUIS-alkalmazásból. Vegye figyelembe, hogy az API-gazdagép nevének formátumának <your region>.api.cognitive.microsoft.comkell lennie.
Adja hozzá a LUIS-alkalmazás eléréséhez szükséges információkat, beleértve az alkalmazásazonosítót, a szerzői kulcsot és a régiót a config.py fájlban. Ezek azok az értékek, amelyeket korábban mentett a közzétett LUIS-alkalmazásból. Vegye figyelembe, hogy az API-gazdagép nevének formátumának <your region>.api.cognitive.microsoft.comkell lennie.
Győződjön meg arról, hogy a Microsoft.Bot.Builder.AI.Luis NuGet-csomag telepítve van a projekthez.
A LUIS-szolgáltatáshoz való csatlakozáshoz a robot lekéri a fent megadott információkat az appsetting.json fájlból. Az FlightBookingRecognizer osztály az appsetting.json fájlban található beállításokat tartalmazó kódot tartalmaz, és meghívja RecognizeAsync a LUIS-szolgáltatást.
FlightBookingRecognizer.cs
public class FlightBookingRecognizer : IRecognizer
{
private readonly LuisRecognizer _recognizer;
public FlightBookingRecognizer(IConfiguration configuration)
{
var luisIsConfigured = !string.IsNullOrEmpty(configuration["LuisAppId"]) && !string.IsNullOrEmpty(configuration["LuisAPIKey"]) && !string.IsNullOrEmpty(configuration["LuisAPIHostName"]);
if (luisIsConfigured)
{
var luisApplication = new LuisApplication(
configuration["LuisAppId"],
configuration["LuisAPIKey"],
"https://" + configuration["LuisAPIHostName"]);
// Set the recognizer options depending on which endpoint version you want to use.
// More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
var recognizerOptions = new LuisRecognizerOptionsV3(luisApplication)
{
PredictionOptions = new Bot.Builder.AI.LuisV3.LuisPredictionOptions
{
IncludeInstanceData = true,
}
};
_recognizer = new LuisRecognizer(recognizerOptions);
}
}
// Returns true if luis is configured in the appsettings.json and initialized.
public virtual bool IsConfigured => _recognizer != null;
public virtual async Task<RecognizerResult> RecognizeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
=> await _recognizer.RecognizeAsync(turnContext, cancellationToken);
public virtual async Task<T> RecognizeAsync<T>(ITurnContext turnContext, CancellationToken cancellationToken)
where T : IRecognizerConvert, new()
=> await _recognizer.RecognizeAsync<T>(turnContext, cancellationToken);
}
Ez FlightBookingEx.cs tartalmazza a kinyerni kívánt logikát a Feladó, a To és a TravelDate között; kiterjeszti a LUIS-eredmények tárolására használt részleges osztályt FlightBooking.cs a hívás FlightBookingRecognizer.RecognizeAsync<FlightBooking> során a MainDialog.cs.
CognitiveModels\FlightBookingEx.cs
// Extends the partial FlightBooking class with methods and properties that simplify accessing entities in the luis results
public partial class FlightBooking
{
public (string From, string Airport) FromEntities
{
get
{
var fromValue = Entities?._instance?.From?.FirstOrDefault()?.Text;
var fromAirportValue = Entities?.From?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
return (fromValue, fromAirportValue);
}
}
public (string To, string Airport) ToEntities
{
get
{
var toValue = Entities?._instance?.To?.FirstOrDefault()?.Text;
var toAirportValue = Entities?.To?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
return (toValue, toAirportValue);
}
}
// This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part.
// TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year.
public string TravelDate
=> Entities.datetime?.FirstOrDefault()?.Expressions.FirstOrDefault()?.Split('T')[0];
}
A LUIS használatához a projektnek telepítenie kell a botbuilder-ai npm csomagot.
A LUIS szolgáltatáshoz való csatlakozáshoz a robot a fájlból .env a fent megadott adatokat használja. Az flightBookingRecognizer.js osztály tartalmazza azt a kódot, amely importálja a beállításokat a .env fájlból, és lekérdezi a LUIS szolgáltatást a hívási recognize() metódussal.
párbeszédpanelek/flightBookingRecognizer.js
class FlightBookingRecognizer {
constructor(config) {
const luisIsConfigured = config && config.applicationId && config.endpointKey && config.endpoint;
if (luisIsConfigured) {
// Set the recognizer options depending on which endpoint version you want to use e.g v2 or v3.
// More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
const recognizerOptions = {
apiVersion: 'v3'
};
this.recognizer = new LuisRecognizer(config, recognizerOptions);
}
}
get isConfigured() {
return (this.recognizer !== undefined);
}
/**
* Returns an object with preformatted LUIS results for the bot's dialogs to consume.
* @param {TurnContext} context
*/
async executeLuisQuery(context) {
return await this.recognizer.recognize(context);
}
getFromEntities(result) {
let fromValue, fromAirportValue;
if (result.entities.$instance.From) {
fromValue = result.entities.$instance.From[0].text;
}
if (fromValue && result.entities.From[0].Airport) {
fromAirportValue = result.entities.From[0].Airport[0][0];
}
return { from: fromValue, airport: fromAirportValue };
}
getToEntities(result) {
let toValue, toAirportValue;
if (result.entities.$instance.To) {
toValue = result.entities.$instance.To[0].text;
}
if (toValue && result.entities.To[0].Airport) {
toAirportValue = result.entities.To[0].Airport[0][0];
}
return { to: toValue, airport: toAirportValue };
}
/**
* This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part.
* TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year.
*/
getTravelDate(result) {
const datetimeEntity = result.entities.datetime;
if (!datetimeEntity || !datetimeEntity[0]) return undefined;
const timex = datetimeEntity[0].timex;
if (!timex || !timex[0]) return undefined;
const datetime = timex[0].split('T')[0];
return datetime;
}
}
A Forrás, a Cél és a TravelDate kinyerésére vonatkozó logika segédmeteként van implementálva.flightBookingRecognizer.js Ezeket a metódusokat a rendszer a következőből való hívás flightBookingRecognizer.executeLuisQuery() után használja: mainDialog.js
Győződjön meg arról, hogy a com.microsoft.bot.bot-ai-luis-v3 csomag hozzá van adva a pom.xml fájlhoz.
A LUIS szolgáltatáshoz való csatlakozáshoz a robot lekéri a fent megadott adatokat az application.properties fájlból. Az FlightBookingRecognizer osztály az application.properties fájlban található beállításokat tartalmazó kódot tartalmaz, és hívási recognize metódussal lekérdezi a LUIS szolgáltatást.
FlightBookingRecognizer.java
/**
* The constructor of the FlightBookingRecognizer class.
*
* @param configuration The Configuration object to use.
*/
public FlightBookingRecognizer(Configuration configuration) {
Boolean luisIsConfigured = StringUtils.isNotBlank(configuration.getProperty("LuisAppId"))
&& StringUtils.isNotBlank(configuration.getProperty("LuisAPIKey"))
&& StringUtils.isNotBlank(configuration.getProperty("LuisAPIHostName"));
if (luisIsConfigured) {
LuisApplication luisApplication = new LuisApplication(
configuration.getProperty("LuisAppId"),
configuration.getProperty("LuisAPIKey"),
String.format("https://%s", configuration.getProperty("LuisAPIHostName"))
);
// Set the recognizer options depending on which endpoint version you want to use.
// More details can be found in
// https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
LuisRecognizerOptionsV3 recognizerOptions = new LuisRecognizerOptionsV3(luisApplication);
recognizerOptions.setIncludeInstanceData(true);
this.recognizer = new LuisRecognizer(recognizerOptions);
}
}
* Runs an utterance through a recognizer and returns a generic recognizer result.
*
* @param turnContext Turn context.
* @return Analysis of utterance.
*/
@Override
public CompletableFuture<RecognizerResult> recognize(TurnContext turnContext) {
return this.recognizer.recognize(turnContext);
}
}
Ez FlightBookingRecognizer.cs tartalmazza a kinyerni kívánt logikát a Feladó, a Cél és a TravelDate között, és a MainDialog.java luis-lekérdezés eredményének dekódolásához hívja meg a rendszer.
FlightBookingRecognizer.java
* Gets the From data from the entities which is part of the result.
*
* @param result The recognizer result.
* @return The object node representing the From data.
*/
public ObjectNode getFromEntities(RecognizerResult result) {
String fromValue = "", fromAirportValue = "";
if (result.getEntities().get("$instance").get("From") != null) {
fromValue = result.getEntities().get("$instance").get("From").get(0).get("text")
.asText();
}
if (!fromValue.isEmpty()
&& result.getEntities().get("From").get(0).get("Airport") != null) {
fromAirportValue = result.getEntities().get("From").get(0).get("Airport").get(0).get(0)
.asText();
}
ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
ObjectNode entitiesNode = mapper.createObjectNode();
entitiesNode.put("from", fromValue);
entitiesNode.put("airport", fromAirportValue);
return entitiesNode;
}
/**
* Gets the To data from the entities which is part of the result.
*
* @param result The recognizer result.
* @return The object node representing the To data.
*/
public ObjectNode getToEntities(RecognizerResult result) {
String toValue = "", toAirportValue = "";
if (result.getEntities().get("$instance").get("To") != null) {
toValue = result.getEntities().get("$instance").get("To").get(0).get("text").asText();
}
if (!toValue.isEmpty() && result.getEntities().get("To").get(0).get("Airport") != null) {
toAirportValue = result.getEntities().get("To").get(0).get("Airport").get(0).get(0)
.asText();
}
ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
ObjectNode entitiesNode = mapper.createObjectNode();
entitiesNode.put("to", toValue);
entitiesNode.put("airport", toAirportValue);
return entitiesNode;
}
/**
* This value will be a TIMEX. And we are only interested in a Date so grab the first result and
* drop the Time part. TIMEX is a format that represents DateTime expressions that include some
* ambiguity. e.g. missing a Year.
*
* @param result A {link RecognizerResult}
* @return The Timex value without the Time model
*/
public String getTravelDate(RecognizerResult result) {
JsonNode datetimeEntity = result.getEntities().get("datetime");
if (datetimeEntity == null || datetimeEntity.get(0) == null) {
return null;
}
JsonNode timex = datetimeEntity.get(0).get("timex");
if (timex == null || timex.get(0) == null) {
return null;
}
String datetime = timex.get(0).asText().split("T")[0];
return datetime;
}
Győződjön meg arról, hogy a botbuilder-ai PyPI csomag telepítve van a projekthez.
A LUIS szolgáltatáshoz való csatlakozáshoz a robot a fájlból config.py a fent megadott adatokat használja. Az FlightBookingRecognizer osztály tartalmazza azt a kódot, amely importálja a beállításokat a config.py fájlból, és lekérdezi a LUIS szolgáltatást a hívási recognize() metódussal.
flight_booking_recognizer.py
class FlightBookingRecognizer(Recognizer):
def __init__(self, configuration: DefaultConfig):
self._recognizer = None
luis_is_configured = (
configuration.LUIS_APP_ID
and configuration.LUIS_API_KEY
and configuration.LUIS_API_HOST_NAME
)
if luis_is_configured:
# Set the recognizer options depending on which endpoint version you want to use e.g v2 or v3.
# More details can be found in https://docs.microsoft.com/azure/cognitive-services/luis/luis-migration-api-v3
luis_application = LuisApplication(
configuration.LUIS_APP_ID,
configuration.LUIS_API_KEY,
"https://" + configuration.LUIS_API_HOST_NAME,
)
self._recognizer = LuisRecognizer(luis_application)
@property
def is_configured(self) -> bool:
# Returns true if luis is configured in the config.py and initialized.
return self._recognizer is not None
async def recognize(self, turn_context: TurnContext) -> RecognizerResult:
return await self._recognizer.recognize(turn_context)
A forrásból, a célból és a travel_date kinyerni kívánt logika segédmeteként van implementálva a LuisHelper belső luis_helper.pyosztályból. Ezeket a metódusokat a rendszer a következőből való hívás LuisHelper.execute_luis_query() után használja: main_dialog.py
segítők/luis_helper.py
class LuisHelper:
@staticmethod
async def execute_luis_query(
luis_recognizer: LuisRecognizer, turn_context: TurnContext
) -> (Intent, object):
"""
Returns an object with preformatted LUIS results for the bot's dialogs to consume.
"""
result = None
intent = None
try:
recognizer_result = await luis_recognizer.recognize(turn_context)
intent = (
sorted(
recognizer_result.intents,
key=recognizer_result.intents.get,
reverse=True,
)[:1][0]
if recognizer_result.intents
else None
)
if intent == Intent.BOOK_FLIGHT.value:
result = BookingDetails()
# We need to get the result from the LUIS JSON which at every level returns an array.
to_entities = recognizer_result.entities.get("$instance", {}).get(
"To", []
)
if len(to_entities) > 0:
if recognizer_result.entities.get("To", [{"$instance": {}}])[0][
"$instance"
]:
result.destination = to_entities[0]["text"].capitalize()
else:
result.unsupported_airports.append(
to_entities[0]["text"].capitalize()
)
from_entities = recognizer_result.entities.get("$instance", {}).get(
"From", []
)
if len(from_entities) > 0:
if recognizer_result.entities.get("From", [{"$instance": {}}])[0][
"$instance"
]:
result.origin = from_entities[0]["text"].capitalize()
else:
result.unsupported_airports.append(
from_entities[0]["text"].capitalize()
)
# This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop
# the Time part. TIMEX is a format that represents DateTime expressions that include some ambiguity.
# e.g. missing a Year.
date_entities = recognizer_result.entities.get("datetime", [])
if date_entities:
timex = date_entities[0]["timex"]
if timex:
datetime = timex[0].split("T")[0]
result.travel_date = datetime
else:
result.travel_date = None
except Exception as exception:
print(exception)
return intent, result
A LUIS most már konfigurálva van, és csatlakoztatva van a robothoz.
Az Emulatorban írjon be egy üzenetet, például"utazás Párizsba" vagy "párizsból Berlinbe". A FlightBooking.json fájlban található bármely kimondott szöveget használhatja a "Book flight" szándék betanításához.
Ha a LUIS által visszaadott leggyakoribb szándék "Repülőjegy lefoglalása" lesz, a robot további kérdéseket tesz fel, amíg nem rendelkezik elegendő információval az utazási foglalás létrehozásához. Ezen a ponton visszaküldi ezt a foglalási információt a felhasználónak.
Ezen a ponton a kódrobot logikája alaphelyzetbe áll, és továbbra is létrehozhat további foglalásokat.
További információ
A LUIS-ról további információt a LUIS dokumentációban talál: