Leksikon Bot
THIS ARTICLE HAS BEEN TRANSLATED TO ENGLISH. FOR THE ENGLISH VERSION PLEASE VISIT The english README.md
Dette programmet er en chatbot. Programmet lar brukeren søke og bla i Store Norske Leksikon. Programmet er laget for opplæring og undervisning. Ved å følge oppskriften under lærer du Microsoft LUIS og Microsoft Bot Framework Oppskriften er ment å ta fra 1 til 2 timer. Etter oppskriften har du laget din første chatbot og testet den i botsimulatoren.
Forutsetninger
Noen ting må være på plass din PC eller Mac før vi kan begynne
-
.NET Core SDK version 2.1
# bestem dotnet versjon dotnet --version
Oppskrift
Før vi starter installer Bot Framework Emulator 4.5.2 etter oppskriften Getting Started. Microsoft refererer til programmet ngrok under installasjonen. For våt formål trenger vi det ikke. Derfor anbefales det å IKKE INSTALLERE NGROK. Etter installasjon skal Bot framework settings bør inneholde
Alternativ | Verdi |
---|---|
Path to ngrok | |
Bypass ngrok for local addresses | YES |
Run ngrok when the emulator starts up | NO |
localhost override | localhost |
Locale | nb-NO |
Importer LUIS-modellen
Last ned en eksportert modell fra EncyclopediaBot.json. Last opp denne modellen på eu.luis.ai: logg inn med en Microsoft bruker, og last opp JSON-filen fra Import New menyen ![LUIS Import App](/documentation/import-LUIS-model.png
-
I terminalen git klon Microsoft BotBuilder Samples
git clone https://github.com/Microsoft/botbuilder-samples.git
-
naviger til
samples/csharp_dotnetcore/05.multi-turn-prompt
-
kopier filene i denne mappen til en ny mappe. Kall denne mappen
EncyclopediaBot
. -
Naviger til denne nye mappen EncyclopediaBot. Kjør boten fra terminalen eller fra Visual Studio. Velg alternativ A eller B.
A) From terminalen
# run the bot dotnet run
B) Eller fra Visual Studio
- Kjør Visual Studio
- File -> Open -> Project/Solution
- Naviger til
EncyclopediaBot
mappen - Velg
MultiTurnPromptBot.csproj
filen - Trykk
F5
for å kjøre prosjektet
Test prosjektet i Bot Framework Emulator
- Åpne Bot Framework Emulator
- File -> Open Bot
- Oppgi Bot URL
http://localhost:3978/api/messages
Si "hei" til boten, og den vil begynne å stille deg spørsmål om transport.
Lukk simulatoren når du er ferdig.
Oppdater Prosjektet
- Hvis
MultiTurnPromptBot.sln
finnes i allerede hopp over dette steget. Åpne MultiTurnPromptBot.csproj i Visual Studio og kjør prosjektet. En ny Visual Studio Solution dukker opp i mappen med davn. - Bytt navn på Visual Studio Solution-filen fra
MultiTurnPromptBot.sln
tilEncyclopediaBot.sln
. - Flytt alle andre filer og mapper til til en ny mappe
EncyclopediaBot.Web
som du lager. Bytt navn på MultiTurnPromptBot.csproj tilEncyclopediaBot.Web.sln
. - Åpne
EncyclopediaBot.sln
igjen i Visual Studio. Slett det ekstistrende prosjektet i solution explorer ved å høyreklikke på navnet og velge delete. - Høyreklikk på Solution
EncyclopediaBot
og velg Add > Add Existing Project... VelgEncyclopediaBot.Web.sln
dialogen som dukker opp. - Søk og erstatt namespace Microsoft.BotBuilderSamples med namespace EncyclopediaBot.Web
- Høyreklikk på Solution
EncyclopediaBot
og velg Add > Add New Project... Velg prosjekt type Class Library .NET Core og .NET Runtime 2.1. Oppgi navnetEncyclopediaBot.Logic
. - Høyreklikk Prosjektet
EncyclopediaBot.Web
node Dependencies og legg til en referanse tilEncyclopediaBot.Logic
. - Åpne EncyclopediaBot.Logic. Slipp inn filene i EncyclopediaBot.Logic inn i prosjektet.
- Høyreklikk Prosjektet
EncyclopediaBot.Logic
og velg Manage Nuget Packages... Søk opp pakken Newtonsoft.Json versjon 12.0.1, Microsoft.Bot.Builder.AI.Luis versjon XXX, System.Reflection versjon 4.3.0. - Åpne EncyclopediaBot.Web og legg til en ny mappe
Dialogs
og slipp filene koden fra github Dialogs/ inn i din nye mappe. - Åpne EncyclopediaBot.Web og legg til en ny mappe
Model
og slipp filene koden fra github Model/ inn i din nye mappe. - Åpne klassen DialogBot.cs og putt inn snutten rett under konstruktøren.
#region custom
public bool IsConfigured
{
get
{
return _recognizer != null;
}
}
internal void SetupLUIS()
{
string hostname = _luisSetup.Hostname;
var luisApplication = new LuisApplication(_luisSetup.AppId,
_luisSetup.APIKey,
hostname);
_recognizer = new LuisRecognizer(luisApplication);
}
protected override Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
string greeting = "Hei. Jeg er leksikonbot.";
var promptMessage = MessageFactory.Text(greeting, greeting, InputHints.IgnoringInput);
turnContext.SendActivityAsync(promptMessage, cancellationToken);
string describeGreeting = "Jeg kan svare på spørsmål om kjente personer, steder eller historiske hendelser.";
turnContext.SendActivityAsync(MessageFactory.Text(describeGreeting, describeGreeting, InputHints.AcceptingInput), cancellationToken);
string exGreeting = "For eksempel";
turnContext.SendActivityAsync(MessageFactory.Text(exGreeting, exGreeting, InputHints.AcceptingInput), cancellationToken);
string whoIsGreeting = "Definer algebra.";
turnContext.SendActivityAsync(MessageFactory.Text(whoIsGreeting, whoIsGreeting, InputHints.AcceptingInput), cancellationToken);
string whatPlaceGreeting = "Fortell meg om en viktig mur i Tyskland.";
turnContext.SendActivityAsync(MessageFactory.Text(whatPlaceGreeting, whatPlaceGreeting, InputHints.AcceptingInput), cancellationToken);
return base.OnMembersAddedAsync(membersAdded, turnContext, cancellationToken);
}
#endregion
- I klassen DialogBot.cs og bytt ut innholdet i metoden OnMessageActivityAsync med.
Logger.LogInformation("Running dialog with Message Activity.");
if (!IsConfigured) { SetupLUIS(); }
var resultTask = _recognizer.RecognizeAsync(turnContext, cancellationToken);
var recognized = await resultTask;
if (recognized != null)
{
var (intent, _) = recognized.GetTopScoringIntent();
switch (intent)
{
case "Define":
{
_searchState = ConversationState.CreateProperty<DialogState>("define");
string query = new BotHelper().GetQuery(recognized);
if (!string.IsNullOrWhiteSpace(query))
{
_searchDialog.Query = query;
await _searchDialog.RunAsync(turnContext, _searchState, cancellationToken);
}
else
{
await turnContext.SendActivityAsync(MessageFactory.Text("Jeg fant ikke tema du nakker om. kan du formulere deg på en annen måte?"), cancellationToken);
}
}
break;
default:
// Run the Dialog with the new message Activity.
await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>(nameof(DialogState)), cancellationToken);
break;
}
}
- Åpne filen Startup.cs. Legg til konstruktøren under
#region custom
private readonly IConfiguration Configuration;
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
#endregion
I bunn av metoden ConfigureServices putt inn
services.AddSingleton<Dialogs.Search.SearchDialog>();
// configuration for LUIS
string APIkey = Configuration["LuisAPIKey"];
string appId = Configuration["LuisAppId"];
string hostname = Configuration["LuisAPIHostname"];
services.AddSingleton((serviceProvider) => {
return new LuisSetup
{
APIKey = APIkey,
AppId = appId,
Hostname = hostname
};
});
services.AddTransient<DefinitionManager>();
services.AddSingleton<Logic.ILogger, WebLogger>((serviceProvider) =>
{
var logger = serviceProvider.GetRequiredService<Microsoft.Extensions.Logging.ILogger<Startup>>();
var webLogger = new WebLogger(logger);
return webLogger;
});
- Åpne filen settings.json og tre nye verdier. Disse er sensitiv informasjon, må hentes fra https://eu.luis.ai/ .
- Kopier filen BotHelper.cs inn i mappen Bots i Encyclopedia.Web.
- Start prosjektet i Visual Studio med
F5
. Debug prosjektet i visual studio og observer hva som skjer.
Så du det? Hver gang du kommer til en Dialog, og spørsmål ChoicePrompt i UserProfileDialog.cs eller SearchDialog.cs dukker opp, så slutter samtalen. Årsaken er at alle meldinger går gjennom OnMessageActivityAsync. Den nye LUIS-implementasjonen vi laget i steg 14 bestemmer hvilken dialog som styrer samtalen. Oppførselen føles som samtalen "faller ut".
Løsningen er å putte alle dialoger i et DialogSet. Etterpå må alltid dialogen fortsettes fra OnMessageAcitivityAsync før en ny startes. Se metoden RunAsyncWithLUISDispatcher, og du vil se
var results = await dialogContext.ContinueDialogAsync(cancellationToken).ConfigureAwait(false);
if (results.Status == DialogTurnStatus.Empty)
{
await dialogContext.BeginDialogAsync(dialog.Id, null, cancellationToken).ConfigureAwait(false);
}
- Nå retter vi feilen. Bytt ut din DialogBot.cs med github DialogBot.cs.
Programmet er nå ferdig. Kjører du det i simulatoren en gang til kan du stille spørsmål om alle artiklene.