Dicembre 2016

Volume 31 Numero 13

Il presente articolo è stato tradotto automaticamente.

Microsoft Bot Framework - Usa Bot Framework per l'accesso ai dati applicazioni in qualsiasi momento e da qualsiasi posizione

Da Srikantan Sankaran

Numero precedente introdotto Microsoft Bot Framework e illustrato come è possibile sfruttare per affrontare una sfida che molte organizzazioni devono affrontare oggi consiste nell'offrire ai clienti l'accesso interattivo per i servizi vocali e il testo (msdn.com/magazine/mt788623). Nell'articolo descritto uno scenario di business che per consolidare i dati da diverse applicazioni line-of-business distribuite in un'organizzazione di assicurazioni, utilizzando tecnologie come Microsoft Flow e App di logica di Azure. Indicizzazione del contenuto, che comprendono dati strutturati e non strutturati, usando ricerca di Azure e quindi resi disponibili per le applicazioni client di utilizzare.

Figura 1, che è stato visualizzato anche nell'articolo precedente, viene illustrata l'architettura della soluzione che implementa lo scenario.

Architettura della soluzione
Figura 1 architettura della soluzione

In questo articolo, se si desidera compilare e distribuire un'applicazione bot in grado di utilizzare le informazioni raccolte tramite ricerca di Azure. L'applicazione bot verrà distribuito come un'app Web di Azure e pubblicata tramite il servizio del connettore Microsoft Framework Bot. Tramite il servizio del connettore, l'applicazione Bot verrà utilizzato dal canale Skype, che consente di concedere l'accesso da parte di consumer per lo stato delle richieste polizza e consentono di scaricare i documenti di criteri emesso, pianificare ispezione visite al sito e così via. I consumer sarà in grado di identificarsi bot usando l'account Microsoft che siano registrati con durante l'applicazione per una polizza assicurativa e può utilizzare entrambi i messaggi sul client Skype o comandi per interagire con i bot vocali. L'applicazione bot si integra con il servizio LUIS, uno dei numerosi servizi disponibili in servizi cognitivo di Azure, per interpretare le conversazioni dal consumer per eseguire query su ricerca di Azure.

Nella sequenza seguente sono illustrati i passaggi necessari per compilare la soluzione. I frammenti di codice provengono dalla soluzione Visual Studio 2015, che può essere scaricata con questo articolo. Di seguito è necessario procedere se utilizza:

  • Creare e pubblicare un modello LUIS che acquisisce le conversazioni diverse che devono essere supportate in bot, tramite l'interfaccia Utente fornita dal servizio LUIS.
  • Utilizzare il modello di Visual Studio 2015 per creare una nuova applicazione bot. È possibile quindi aggiungere i blocchi di codice dalla soluzione fornita in questo articolo, o seguire il resto dell'articolo che fa riferimento al file di soluzione scaricata. Il file MessageController.cs è il punto di ingresso nell'applicazione bot, ovvero un tipo speciale di un'applicazione MVC .NET.
  • Incorporare le funzionalità LUIS in bot, tramite la finestra di dialogo LUIS disponibile nel SDK Framework Bot. Questo viene implementato nel file PolicyInfoDialog.cs nella soluzione.
  • Mediante il SDK di ricerca di Azure, implementare il codice che richiama l'API di ricerca di Azure ed eseguire le richieste di ricerca interpretate dal servizio LUIS. Questo viene implementato nel file SearchService.cs nella soluzione.
  • Implementare una finestra di dialogo FormFlow per acquisire l'account dell'utente Microsoft nel canale di Skype, in modo interattivo, quando una richiesta dell'utente viene effettuata la prima volta. Questo viene implementato nel file SigninForm.cs nella soluzione di accompagnamento.
  • Utilizzare la ricerca di Azure SDK per recuperare le informazioni sul profilo utente in base all'account Microsoft quando l'utente accede innanzitutto bot acquisiti. Questo è implementato anche nelle SearchService.cs
  • Utilizzare il servizio di stato Bot per conservare le informazioni sul profilo utente. Informazioni indirizzo e contatto, che sono archiviate nel servizio di stato Bot, dell'utente bot viene utilizzate quando si pianifica una visita del sito. È implementato anche nel file PolicyInfoDialog.cs.
  • Testare l'applicazione bot eseguendolo in locale come servizio nel computer di sviluppo e utilizzare l'emulatore di canale Framework Bot per valutare l'interazione dell'utente con il servizio.
  • Dopo aver testato l'applicazione bot localmente, distribuirla a un'app Web in Azure destro da Visual Studio.
  • Registrare l'applicazione bot con il servizio del connettore Microsoft Framework Bot e configurare l'URL dell'applicazione bot distribuita in Azure.
  • Aggiungere il nome dell'applicazione bot, ID e segreto informazioni ottenute durante la registrazione del bot nella soluzione di Visual Studio e ripubblicarlo in Azure.
  • Abilitare l'applicazione bot per l'accesso dai canali come Skype e di flessibilità, lo sviluppatore bot del portale.

È possibile scaricare la soluzione di Visual Studio 2015 per l'applicazione di bot e un'esportazione di file del modello di LUIS utilizzato in questa applicazione dal repository GitHub in bit.ly/2cOfANh.

Creazione e Training del modello LUIS per scenari diversi casi di utilizzo

Figura 2 viene illustrato come è mappato come un utente potrebbe potenzialmente opposte (tramite un'espressione LUIS) con i bot e come questo deve essere interpretato come scopo LUIS specifico o come azione da eseguire tramite ricerca di Azure e come estrarre le parole chiave (entità LUIS) dall'emissione LUIS da utilizzare come parametri di query nella ricerca.

Figura 2 Utterances e tipi di Mapping

Conversazione o utterances Tipi di mapping o azioni Qualificatori o parametri
Qualcosa LUIS in grado di interpretare (o non è sottoposto a training per). Nessuno (predefinito) Non applicabile
Get (o mostrare) tutte le richieste il criterio. GetPolicyRequests Per l'utente connesso bot in cui è inclusa
Un'applicazione di richiesta di criteri, o viene approvata la richiesta di criteri? GetPendingPolicyRequests In cui è inclusa per le richieste di criteri in cui lo stato è diverso da approvato
Ottenere i dettagli del numero di richiesta di criteri VehPolicy001. GetPolicyRequestDetails Id richiesta di criteri – VehPolicy001
Ottenere lo stato della richiesta di criteri assicurazione sulla vita. GetPolicyRequestStatusByType Tipo di richiesta di criteri-vita
Ottenere il numero di documento di criteri Policy0101 rilasciato quest'anno. GetPolicyDocument Il nome-Policy0101 e lastmoddate-anno corrente
Pianificazione di un controllo del sito, visitare domani. ScheduleSiteVisit Data di ispezione: domani

Il servizio LUIS fornisce un'applicazione Web in luis.ai in cui un modello di applicazione LUIS è possibile creare visivamente per il problema in questione. Figura 3 Visualizza il modello LUIS configurato per questo scenario.

Il modello LUIS per uno Scenario
Figura 3. il modello LUIS per uno Scenario

 Intenti, entità e utterances identificato nel passaggio precedente possono essere creati nell'applicazione LUIS. Utilizzare il menu di tipi per aggiungere i tipi e il menu di entità per creare le entità. Si noti che esistono due particolari tipi di entità:

  • Entità gerarchiche: In questo caso, "Polizza assicurativa" viene creato come una gerarchica, l'elemento padre, con i vari tipi di entità, vita, veicolo, Home e così via, creato come elementi figlio.
  • Entità predefinite: È stata utilizzata un'entità esistente, purché LUIS denominata Datetime. Parametri di input, ad esempio l'anno di un documento di criteri è stato generato, o la data quando accede a un'ispezione del sito è pianificato, verrà eseguito il mapping dal motore di LUIS per questi tipi di entità predefiniti.

L'entità con il nome "Parola chiave" verrà utilizzato per eseguire una ricerca full-text nell'indice di documenti di criteri nella ricerca di Azure.

A questo punto, selezionare la nuova scheda utterances utterances per ognuna delle conversazioni identificati in precedenza e creare identificarli.

Per ogni espressione, identificare o label lo scopo e le entità associate. Ad esempio, In figura 3, eseguito il mapping di emissione, "get me lo stato della richiesta criterio di assicurazione sulla vita," a "GetPolicyRequestStatusByType", lo scopo e mappati il testo "Assicurazione sulla vita" all'entità gerarchiche "Assicurazione: vita".

Ripetere questo passaggio per aggiungere altre varianti, ad esempio quando il tipo di criteri è veicolo, Home o generali. Inoltre, valutare le variazioni in cui la stessa richiesta può essere effettuata in modo diverso. Tuttavia, non è necessario acquisire ogni permutazione e combinazione di modi lo stesso messaggio potrebbe essere trasmesse. Ad esempio, quando si aggiunge una nuova espressione con la frase "Mostra lo stato...," come mostrato nel figura 4, LUIS Impossibile giustamente interpretare che come una variante di quello precedente, utilizzato "get me lo stato..." LUIS ha il diritto lo scopo e le entità associate, anche se è stata posta la domanda in modo diverso.

Assegnazione di etichette LUIS Utterances e la gestione delle variazioni
Figura 4 etichette LUIS Utterances e la gestione delle variazioni

Dopo aver acquisito ogni espressione, l'applicazione LUIS fornisce l'opzione per il training del modello. In questo modo il motore di AI LUIS la generazione di modelli ottimizzati che possono quindi essere utilizzati dalle applicazioni client. Questo passaggio deve essere ripetuto ogni volta che sono contrassegnate con la nuova utterances o vengono apportate modifiche a quelli esistenti.

Pubblicato il modello LUIS consente alle applicazioni lato client richiamare, tramite un'API REST. Finestra di dialogo Pubblica l'applicazione consente inoltre di testare il modello per assicurarsi che funzioni come previsto. Figura 5 viene illustrato come testare rapidamente il modello LUIS passando una frase di conversazione e visualizzando l'output nel browser. (Per comodità, figura 5 Mostra gli snapshot da tre diverse chiamate della utterances e i risultati corrispondenti side-by.)

Test del modello LUIS
Figura 5 test del modello LUIS

Si noti che l'intento consigliato da LUIS ha assegnato il valore di probabilità massima e viene visualizzata per prima nell'elenco. Le entità che sono stati estratti dalla frase vengono inoltre restituite nella risposta. Se sono presenti più entità identificata nell'espressione, che sono restituiti, nonché. È possibile vedere come il modello LUIS interpreta termini quali "quest'anno" della frase di emissione, ne esegue il mapping a un'entità preesistente "Datetime" e restituisce il valore "2016", che è possibile utilizzare direttamente l'applicazione client.

Creazione dell'applicazione Bot

Ora che il modello LUIS è pronto, può essere utilizzato in un'applicazione bot. Scaricare il modello di Visual Studio 2015 da aka.ms/bf-bc-vstemplate per creare l'applicazione. (Visitare bit.ly/2dYrwyW per apprendere le nozioni fondamentali di creazione di un componente di applicazione e come utilizzare un emulatore bot per compilare e testare bot localmente.)

Il progetto creato quando si usa questo modello è una variante di un progetto MVC. Il punto di ingresso per il progetto è MessageController.cs, che elabora i messaggi in arrivo dai canali come Skype o Slack e invia le risposte.

LUISDialog per Framework Bot viene utilizzato per passare in modo implicito i messaggi da bot al modello LUIS. Per ognuno dei tipi implementati nel modello LUIS, viene implementato un metodo corrispondente che può essere chiamato direttamente quando l'applicazione bot è in esecuzione. Questo evita la necessità di codice personalizzato chiamare le API REST LUIS per interpretare la conversazione e per identificare la finalità e le entità.

I valori di segreto e l'Id applicazione LUIS vengono utilizzati per decorare gli attributi a livello di classe, vale a dire LuisModel. L'attributo LuisIntent viene utilizzato il metodo che fornisce l'implementazione quando viene rilevato questo intento nella richiesta dell'utente. Questo è tutto ciò che è necessario per ottenere l'integrazione LUIS bot in corso. Figura 6 viene illustrata l'implementazione nel codice.

Figura 6 implementazione LUIS integrazione

[LuisModel("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
  "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")]
[Serializable]
  public class PolicyInfoDialogs : LuisDialog<object>
  {
    [LuisIntent("")]
    public async Task None(IDialogContext context, LuisResult result)
    {
      // Called when the incoming utterance is not recognized (default bin)
    }
    [LuisIntent("GetPolicyRequests")]
    public async Task GetPolicyRequests(IDialogContext context, LuisResult result)
    {
      //
    }
        ----------------------
      }

A questo punto, l'implementazione in ognuno dei metodi può essere semplice. È possibile semplicemente visualizzare un messaggio che identifica quale implementazione LuisIntent è stato richiamato.

In MessageController.cs, aggiungere il frammento seguente per acquisire il messaggio in arrivo da parte dell'utente bot e trasferirlo al LuisDialog:

if (activity.Type == ActivityTypes.Message)
  {
    await Conversation.SendAsync(activity, () => new PolicyInfoDialog());
  }

Eseguire l'applicazione bot, avviare l'emulatore di canale Framework Bot, che può essere scaricato dal aka.ms/bf-bc-emulatore. Digitare il utterances che training del modello LUIS per versioni precedenti e assicurarsi che il messaggio di risposta indica che è stato richiamato il metodo corretto mappato allo scopo LUIS.

Integrazione di ricerca

Ora aggiungerò la ricerca di Azure SDK per .NET per la soluzione di Visual Studio utilizzando Gestione pacchetti NuGet. Il file SearchService.cs nella soluzione viene utilizzato questo SDK e incapsula tutti integrazione con il servizio di ricerca di Azure. Implementa metodi che eseguono query su ricerca di Azure, restituiscono UserProfile del cliente e recupero PolicyRequests e PolicyDocuments.

Comandi per i diversi scenari di ricerca vengono compilati utilizzando la sintassi di query Lucene, implementata nel file PolicyInfoDialog.cs. Ecco alcuni esempi: 

Recuperare tutte le richieste di criteri per l'utente bot nella conversazione:

command += "CustomerId:(" + msftid + ")";
Retrieve all policy requests for the bot user that haven’t yet been approved:
command += "CustomerId:(" + msftid + ") -PolicyStatus:(Approved)";
Query policy requests for the bot user based on the policy request Id:
public async Task GetPolicyRequestDetails(IDialogContext context, LuisResult result)
  {
    ----------------------
      string  command += "CustomerId:(" + msftid + ") AND PolicyRequestId:(" +
        result.Entities[0].Entity + ")";
    ----------------------
  }

Nel precedente frammento di seguito viene illustrato l'entità PolicyRequestId (i parametri di input per eseguire le query di ricerca) dal motore di LUIS tramite LuisResult (risultato).

Figura 7 viene illustrato come implementare un'applicazione basata su proprietà di ricerca e ricerca full-text per i documenti.

Si noti che è possibile consultare il mio articolo precedente per la relazione tra i nomi delle proprietà e valori di figura 7 codice. Inoltre, è possibile scaricare lo schema di tutte le tabelle nel database che accompagna questo articolo, utilizzando i collegamenti riportati nelle sezioni successive. 

Figura 7 implementazione basata sulle proprietà di ricerca e ricerca Full-Text per i documenti

foreach (EntityRecommendation curEntity in request.Entities)
  {
    switch (curEntity.Type)
      {
        case "PolicyNumber": // Look for documents with this filename
          {
            command += " filename:(" + request.Entities[0].Entity + ") ";
            break;
          }
        case "keyword": // Search within documents for this keyword expression
          {
            command += " " + request.Entities[0].Entity + " ";
            break;
          }
        case "builtin.datetime.date":
        // Retrieve based on the year a document was generated
          {
            char[] delimiterChars = { '.', ':' };
        List<string> allvalues = curEntity.Resolution.Values.ToList<string>();
             string val = allvalues[0];
             string[] vals = val.Split(delimiterChars);
             command += " lastmoddate:(" + vals[0] + ") ";
             break;
          }
        default:
          {
            break;
          }
        }
    }

La risposta all'utente di formattazione

È possibile formattare il testo nel messaggio di risposta restituito da bot per lo stile, aggiungere collegamenti ipertestuali o contenuto multimediale e così via. In questo modo il componente di applicazione più semplice. Di seguito sono riportati alcuni esempi...

Per impostare lo stile del carattere in grassetto, solo per i dati dinamici restituiti dalla ricerca di Azure, a capo all'interno di doppi asterischi (*):

foreach (SearchResult<PolicyRequest> result in eachGroup)
  {
    searchResponse += (counter) + ". **" + result.Document.PolicyRequestId + "**" +
      " on the insured :**" + result.Document.InsuredIdentifier + "**
      for an amount of :**" +
    result.Document.Currency + " " + result.Document.AssessedValue + "**
      has status: **" +
    result.Document.PolicyStatus + "**\n\n";
    counter++;
  }

Per aggiungere un collegamento ipertestuale a un documento di criteri restituito dalla ricerca di Azure, aggiungere l'attributo di collegamento all'URL del documento:

foreach (SearchResult<PolicyDocument> result in results)
 {
   searchResponse += counter + ". Link: [" + result.Document.filename + "](" +
     result.Document.fileurl + ") \n";
   counter++;
 }

Identificazione dell'utente Bot

Il Framework Bot fornisce l'Id del canale dell'utente e la visualizzazione del nome dal contesto conversazione, ma non fornisce il nome utente utilizzato per accedere al canale, ad esempio Skype. Di conseguenza, queste informazioni devono essere esplicitamente ottenute quando un utente inizia a interagire con i bot. La finestra di dialogo FormFlow descritto in precedenza viene utilizzato per richiedere all'utente per queste informazioni. Le informazioni sul profilo utente viene recuperati da ricerca di Azure in base al nome di account.

Per assicurarsi che l'utente interagisce con i bot è il proprietario del nome dell'account Microsoft condiviso il possibile, è possibile integrare un account di accesso interattivo per la pagina di accesso Account Microsoft e fornire l'accesso a bot solo dopo l'autenticazione e convalida. Questo esula dall'ambito dell'articolo. Al contrario, semplicemente richiedere all'utente il nome dell'account tramite la finestra di dialogo SigninForm e si presuppone che l'utente sia che egli afferma di essere:

public static IForm<SigninForm> BuildForm()
  {
    return new FormBuilder<SigninForm>()
      .Message("I would need some information before we get started.")
      .Field(nameof(MicrosoftAccount))
      .Build();
  }

Archiviare il profilo utente nello stato Bot

Una volta durante l'inizio di una conversazione in bot viene identificato l'utente, un oggetto del profilo utente viene recuperato da ricerca di Azure. Queste informazioni vengono archiviate nello stato bot, da utilizzare, ad esempio, quando l'utente richiede che è possibile pianificare una visita del sito. Il numero di contatto e indirizzo dell'utente viene verificato durante la conferma dell'ispezione.

Il Framework Bot fornisce un'API per archiviare queste informazioni nel contesto privateConversationData, per utente e la conversazione, come illustrato nella figura 8.

Figura 8, l'archiviazione del profilo utente

private async Task SignUpComplete(IDialogContext context, IAwaitable<SigninForm> result)
  {
----------------------------------------------
----------------------------------------------
  UserProfile profile =
    await LoadBotUserState(profileIdentityForm.MicrosoftAccount);
  if (profile == null)
  {
  message = $"Sorry, I could not locate your profile in our system.
    Please retry with the right Microsoft Account";
  }
  else
  {
    context.PrivateConversationData.SetValue<bool>("ProfileComplete", true);
    context.PrivateConversationData.SetValue<string>(
      "FirstName", profile.FirstName);
    context.PrivateConversationData.SetValue<string>("LastName", profile.LastName);
    context.PrivateConversationData.SetValue<string>("Address", profile.Address);
    context.PrivateConversationData.SetValue<string>("Phone", profile.Phone);
    context.PrivateConversationData.SetValue<string>(
      "CustomerId", profile.CustomerId);
    message = $"Thanks {profile.LastName},{profile.FirstName}
      for identifying yourself! \n\n
      Let me know how I could assist you.";
  }
    await context.PostAsync(message);
  }
    context.Wait(MessageReceived);
  }

Per ogni richiesta, l'applicazione bot controlla con lo stato di bot per garantire che venga verificata l'identità dell'utente che invia la richiesta, le informazioni sul profilo utente è disponibile.

Utilizzando l'emulatore Bot canale locale

L'applicazione bot richiede lo spazio dei nomi di ricerca di Azure, chiave di accesso e il nome dell'indice da utilizzare per eseguire le richieste da parte dell'utente. Questi parametri vengono archiviati nel file SearchParameters.cs e i relativi valori impostati dal file Web. config quando si esegue l'applicazione bot. È ora possibile eseguire la soluzione di Visual Studio.

Avviare l'emulatore di canale Bot e immettere il training del modello LUIS per le conversazioni. Uno scenario di interazione utente tipico viene acquisito nella figura 9. Dopo l'applicazione bot viene eseguito correttamente nell'ambiente locale, possono essere pubblicato a un'app Web di Azure.

Esecuzione del Bot da un emulatore
Figura 9 esecuzione Bot da un emulatore

Distribuzione Bot in Azure

Creare un'app Web in Azure dal portale di Azure, quindi nelle impostazioni dell'applicazione, aggiungere l'appSetting chiavi e i valori dal file Web. config nella soluzione Visual Studio.

Prima di pubblicare l'applicazione bot in un'app Web di Azure, è necessario registrare questo bot in dev.botframework.com/bots/new. Questo processo genera un ID Bot, un ID di App di Microsoft e un segreto. Aggiungere questi valori a Web. config dell'applicazione bot in Visual Studio 2015 e ripubblicare l'applicazione in Azure.

Durante il processo di registrazione per il parametro URL di reindirizzamento, utilizzare l'URL dell'applicazione bot SSL abilitato in Azure e suffisso che con "/ api/messaggi."

Abilitazione Bot attraverso i canali

Nel Registro di sistema Bot in dev.botframework.com/bots, è possibile abilitare bot su altri canali. Figura 10 viene illustrata l'applicazione bot abilitata attraverso i canali di Skype e il margine di flessibilità. Abilitazione dell'applicazione bot per Slack richiede alcuni passaggi aggiuntivi. Una procedura guidata viene avviata quando si sceglie di aggiungere bot a questo canale, che consente di eseguire i passaggi appropriati.

Bot sui più canali di registrazione
Figura 10 Bot sui più canali di registrazione

Figura 11 Mostra bot applicazione per l'accesso da Skype.

Accesso Bot da Skype
Figura 11 accede Bot da Skype

Conclusioni

Il Framework di Bot Microsoft e altre tecnologie di supporto come LUIS e ricerca di Azure forniscono la base appropriata per compilare applicazioni che consentano ai clienti bot intuitivo interagiscono con le applicazioni line-of-business. Il modo in cui ognuno di questi servizi adattata l'architettura complessiva della soluzione assicura che i singoli componenti possono essere maturati o migliorati indipendente dagli altri. Ad esempio, il modello LUIS può essere modificato per supportare più utterances che gli utenti potrebbero utilizzare per interagire con i bot durante il quale è necessaria alcuna modifica l'applicazione di bot principale o il contenuto di ricerca di Azure. Una volta distribuito, un'applicazione bot, senza modifiche al codice aggiuntivo, per attivare l'accesso da vari canali, e altri canali possono essere aggiunti nel tempo, per aumentare la portata e l'utilizzo dell'applicazione bot.


Srikantan Sankaranè un technical evangelist del team di DX in India, in base all'esterno di Bangalore.  Egli funziona con numerosi fornitori di software indipendenti in India e consente di progettare e distribuire le soluzioni in Microsoft Azure. Contattarlo all'indirizzo sansri@microsoft.com.

Grazie per i seguenti esperti tecnici Microsoft per la revisione dell'articolo: Sandeep Alur e Hemanth Kathuria
Sandeep Alur è l'Evangelist Lead per DX India e si basa in Bangalore.

Hemanth Kathuria è un consulente Senior del team di servizi India