Incorporación de telemetría al bot de QnA Maker
SE APLICA A: SDK v4
Nota
Azure AI QnA Maker se retirará el 31 de marzo de 2025. A partir del 1 de octubre de 2022, no podrá crear nuevos recursos ni bases de conocimiento de QnA Maker. Ya hay disponible una versión más reciente de la funcionalidad de preguntas y respuestas como parte de Lenguaje de Azure AI.
La respuesta a preguntas personalizada, una característica del lenguaje azure AI, es la versión actualizada del servicio QnA Maker. Para obtener más información sobre la compatibilidad con preguntas y respuestas en Bot Framework SDK, consulte Reconocimiento del lenguaje natural.
El registro de telemetría permite a las aplicaciones de bot enviar datos de eventos a servicios de telemetría, como Application Insights. La telemetría ofrece información al bot mostrando las características que se usan con mayor frecuencia, permite detectar comportamientos no deseados y ofrece visibilidad sobre la disponibilidad, el rendimiento y el uso.
Las TelemetryLoggerMiddleware
clases y QnAMaker
del SDK de Bot Framework habilitan el registro de telemetría en bots habilitados para QnA Maker.
TelemetryLoggerMiddleware
es un componente de middleware que registra la telemetría cada vez que se reciben, envían, actualizan o eliminan mensajes, y la QnAMaker
clase proporciona un registro personalizado que amplía las funcionalidades de telemetría.
En este artículo, aprenderá sobre:
- El código necesario para integrar la telemetría en el bot.
- El código necesario para habilitar el registro y los informes de QnA Maker estándar que usan las propiedades de evento estándar.
- Cómo modificar o extender las propiedades de evento predeterminadas del SDK para atender a una amplia variedad de necesidades de informes.
Prerrequisitos
- El código de ejemplo de QnA Maker.
- Una suscripción a Microsoft Azure
- Una clave de Application Insights
- Resulta útil estar familiarizado con QnA Maker.
- Una cuenta de QnA Maker.
- Un knowledge base de QnA Maker existente y publicado.
Nota
Este artículo se basa en el código de ejemplo de QnA Maker siguiendo los pasos necesarios para incorporar telemetría.
Incorporación de código de telemetría al bot de QnA Maker
Comenzaremos con la aplicación de ejemplo QnA Maker y agregaremos el código necesario para integrar la telemetría en un bot que use el servicio QnA Maker. Esto permitirá a Application Insights realizar un seguimiento de las solicitudes.
Abra la aplicación de ejemplo QnA Maker en Visual Studio.
Agregue el paquete NuGet
Microsoft.Bot.Builder.Integration.ApplicationInsights.Core
. Para más información sobre el uso de NuGet, consulte Instalación y administración de paquetes en Visual Studio:Incluya las siguientes instrucciones en
Startup.cs
:using Microsoft.ApplicationInsights.Extensibility; using Microsoft.Bot.Builder.ApplicationInsights; using Microsoft.Bot.Builder.Integration.ApplicationInsights.Core;
Nota
Si va a seguir al actualizar el código de ejemplo de QnA Maker, observará que la instrucción using para
Microsoft.Bot.Builder.Integration.AspNet.Core
ya existe en el ejemplo de QnA Maker.Agregue el siguiente código al método
ConfigureServices()
enStartup.cs
. Esto hará que los servicios de telemetría estén disponibles para el bot mediante la inserción de dependencias:// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { ... // Create the Bot Framework Adapter with error handling enabled. services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>(); // Add Application Insights services into service collection services.AddApplicationInsightsTelemetry(); // Add the standard telemetry client services.AddSingleton<IBotTelemetryClient, BotTelemetryClient>(); // Create the telemetry middleware to track conversation events services.AddSingleton<TelemetryLoggerMiddleware>(); // Add the telemetry initializer middleware services.AddSingleton<IMiddleware, TelemetryInitializerMiddleware>(); // Add telemetry initializer that will set the correlation context for all telemetry items services.AddSingleton<ITelemetryInitializer, OperationCorrelationTelemetryInitializer>(); // Add telemetry initializer that sets the user ID and session ID (in addition to other bot-specific properties, such as activity ID) services.AddSingleton<ITelemetryInitializer, TelemetryBotIdInitializer>(); ... }
Nota
Si va a seguir con la actualización del código de ejemplo de QnA Maker, observará que
services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();
ya existe.Indique al adaptador que use el código de middleware que se agregó al método
ConfigureServices()
. AbraAdapterWithErrorHandler.cs
y agregueIMiddleware middleware
a la lista de parámetros de constructores. Agregue laUse(middleware);
instrucción como la última línea del constructor:public AdapterWithErrorHandler(ICredentialProvider credentialProvider, ILogger<BotFrameworkHttpAdapter> logger, IMiddleware middleware, ConversationState conversationState = null) : base(credentialProvider) { ... Use(middleware); }
Agregue la clave de instrumentación de Application Insights a su archivo
appsettings.json
. Elappsettings.json
archivo contiene metadatos sobre los servicios externos que usa el bot mientras se ejecuta, como la conexión y los metadatos de Cosmos DB, Application Insights y QnA Maker. La adición al archivoappsettings.json
debe estar en este formato:{ "MicrosoftAppId": "", "MicrosoftAppPassword": "", "QnAKnowledgebaseId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "QnAEndpointKey": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "QnAEndpointHostName": "https://xxxxxxxx.azurewebsites.net/qnamaker", "ApplicationInsights": { "InstrumentationKey": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } }
Nota
- Puede encontrar información detallada sobre cómo obtener la clave de instrumentación de Application Insights en el artículo Claves de Application Insights.
- Ya debería tener una cuenta de QnA Maker. Para obtener información sobre cómo obtener el identificador de QnA Maker knowledge base, la clave de punto de conexión y los valores de host, consulte la sección Publicar para obtener el punto de conexión generateAnswer del artículo Obtención de una respuesta de QnA Maker con generateAnswer API.
En este momento, se realiza el trabajo preliminar para habilitar la telemetría mediante Application Insights. Puede ejecutar el bot localmente mediante el Bot Framework Emulator y, a continuación, ir a Application Insights para ver lo que se registra, como el tiempo de respuesta, el estado general de la aplicación y la información de ejecución general.
Sugerencia
Para obtener información sobre la información personal, vea Habilitar o deshabilitar el registro de eventos de actividad e información personal.
A continuación, veremos lo que debe incluirse para agregar la funcionalidad de telemetría al servicio QnA Maker.
Habilitación de la telemetría para capturar datos de uso del servicio QnA Maker
El servicio QnA Maker tiene disponible el registro de telemetría integrado, por lo que es poco necesario empezar a obtener datos de telemetría de QnA Maker. En primer lugar, veremos cómo incorporar telemetría en el código de QnA Maker para habilitar el registro de telemetría integrado y, a continuación, aprenderemos a reemplazar o agregar propiedades a los datos de eventos existentes para satisfacer una amplia gama de necesidades de informes.
Habilitación del registro predeterminado de QnA Maker
Cree un campo de solo lectura privado de tipo
IBotTelemetryClient
en la claseQnABot
enQnABot.cs
:public class QnABot : ActivityHandler { private readonly IBotTelemetryClient _telemetryClient; ... }
Agregue un parámetro
IBotTelemetryClient
al constructor de la claseQnABot
enQnABot.cs
y asigne su valor al campo privado creado en el paso anterior:public QnABot(IConfiguration configuration, ILogger<QnABot> logger, IHttpClientFactory httpClientFactory, IBotTelemetryClient telemetryClient) { ... _telemetryClient = telemetryClient; }
Se requiere el parámetro
telemetryClient
al crear una instancia del nuevo objeto QnAMaker enQnABot.cs
:var qnaMaker = new QnAMaker(new QnAMakerEndpoint { KnowledgeBaseId = _configuration["QnAKnowledgebaseId"], EndpointKey = _configuration["QnAEndpointKey"], Host = _configuration["QnAEndpointHostName"] }, null, httpClient, _telemetryClient);
Sugerencia
Asegúrese de que los nombres de propiedad que use en las
_configuration
entradas coinciden con los nombres de propiedad que usó en el archivo AppSettings.json y los valores de esas propiedades se obtienen seleccionando el botón Ver código en la página Mis bases de conocimiento en el portal de QnA Maker:
Visualización de los datos de telemetría registrados desde las entradas predeterminadas de QnA Maker
Puede ver los resultados del uso del bot de QnA Maker en Application Insights después de ejecutar el bot en el Bot Framework Emulator siguiendo estos pasos:
En el Azure Portal, vaya al recurso de Application Insights para el bot.
En Supervisión, seleccione Registros.
Escriba la siguiente consulta de Kusto y seleccione Ejecutar.
customEvents | where name == 'QnaMessage' | extend answer = tostring(customDimensions.answer) | summarize count() by answer
Deje esta página abierta en el explorador; volveremos a ella después de agregar una nueva propiedad personalizada.
Sugerencia
Si no está familiarizado con el lenguaje de consulta kusto que se usa para escribir consultas de registro en Azure Monitor, pero está familiarizado con el lenguaje de consulta SQL, puede que le resulte útil la hoja de referencia rápida de consultas de registro de SQL a Azure Monitor .
Modificar o ampliar las propiedades de eventos predeterminadas
Si necesita propiedades que no estén definidas en la QnAMaker
clase hay dos maneras de controlar esto, ambas requieren la creación de su propia clase derivada de la QnAMaker
clase . La primera se explica en la sección siguiente titulada Adición de propiedades, en la que se agregan propiedades al evento QnAMessage
existente. El segundo método le permite crear nuevos eventos a los que puede agregar propiedades, tal y como se describe en Adición de nuevos eventos con propiedades personalizadas.
Nota
El evento QnAMessage
forma parte del SDK Bot Framework y proporciona todas las propiedades de evento predefinidas que se registran en Application Insights.
Adición de propiedades
En el siguiente ejemplo se muestra la derivación desde la clase QnAMaker
. En el ejemplo se muestra cómo agregar la propiedad "MyImportantProperty" al evento QnAMessage
. El evento QnAMessage
se registra cada vez que se realiza una llamada a GetAnswers de QnA.
Después de aprender a agregar propiedades personalizadas, veremos cómo crear un nuevo evento personalizado y asociar propiedades con él, ejecutaremos el bot localmente mediante el Bot Framework Emulator y veremos lo que se registra en Application Insights mediante el lenguaje de consulta Kusto.
Cree una nueva clase llamada
MyQnAMaker
en el espacio de nombresMicrosoft.BotBuilderSamples
que herede de la claseQnAMaker
, y guárdela comoMyQnAMaker.cs
. Para heredar de laQnAMaker
clase , deberá agregar laMicrosoft.Bot.Builder.AI.QnA
instrucción using. El código tendrá el siguiente aspecto:using Microsoft.Bot.Builder.AI.QnA; namespace Microsoft.BotBuilderSamples { public class MyQnAMaker : QnAMaker { } }
Agregue un constructor de clase a
MyQnAMaker
. Necesitará dos instrucciones using más para los parámetros del constructor paraSystem.Net.Http
yMicrosoft.Bot.Builder
:using Microsoft.Bot.Builder.AI.QnA; using System.Net.Http; using Microsoft.Bot.Builder; namespace Microsoft.BotBuilderSamples { public class MyQnAMaker : QnAMaker { public MyQnAMaker( QnAMakerEndpoint endpoint, QnAMakerOptions options = null, HttpClient httpClient = null, IBotTelemetryClient telemetryClient = null, bool logPersonalInformation = false) : base(endpoint, options, httpClient, telemetryClient, logPersonalInformation) { } } }
Agregue la nueva propiedad al evento QnAMessage después del constructor e incluya las instrucciones
System.Collections.Generic
,System.Threading
ySystem.Threading.Tasks
:using Microsoft.Bot.Builder.AI.QnA; using System.Net.Http; using Microsoft.Bot.Builder; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace Microsoft.BotBuilderSamples { public class MyQnAMaker : QnAMaker { ... protected override async Task OnQnaResultsAsync( QueryResult[] queryResults, Microsoft.Bot.Builder.ITurnContext turnContext, Dictionary<string, string> telemetryProperties = null, Dictionary<string, double> telemetryMetrics = null, CancellationToken cancellationToken = default(CancellationToken)) { var eventData = await FillQnAEventAsync( queryResults, turnContext, telemetryProperties, telemetryMetrics, cancellationToken) .ConfigureAwait(false); // Add new property eventData.Properties.Add("MyImportantProperty", "myImportantValue"); // Log QnAMessage event TelemetryClient.TrackEvent( QnATelemetryConstants.QnaMsgEvent, eventData.Properties, eventData.Metrics ); } } }
Modifique el bot para usar la nueva clase, en lugar de crear un
QnAMaker
MyQnAMaker
objeto enQnABot.cs
:var qnaMaker = new MyQnAMaker(new QnAMakerEndpoint { KnowledgeBaseId = _configuration["QnAKnowledgebaseId"], EndpointKey = _configuration["QnAEndpointKey"], Host = _configuration["QnAEndpointHostName"] }, null, httpClient, _telemetryClient);
Visualización de los datos de telemetría registrados desde la nueva propiedad MyImportantProperty
Después de ejecutar el bot en el emulador, puede ver los resultados en Application Insights haciendo lo siguiente:
Vuelva al explorador que tiene activa la vista Registros (Analytics) .
Escriba la siguiente consulta de Kusto y seleccione Ejecutar. Esto le dará el número de veces que se ejecutó la nueva propiedad:
customEvents | where name == 'QnaMessage' | extend MyImportantProperty = tostring(customDimensions.MyImportantProperty) | summarize count() by MyImportantProperty
Para mostrar los detalles en lugar del recuento, quite la última línea y vuelva a ejecutar la consulta:
customEvents | where name == 'QnaMessage' | extend MyImportantProperty = tostring(customDimensions.MyImportantProperty)
Adición de nuevos eventos con propiedades personalizadas
Si necesita registrar datos en un evento diferente al de QnaMessage
, puede crear su propio evento personalizado con sus propiedades. Para ello, agregaremos código al final de la MyQnAMaker
clase como se indica a continuación:
public class MyQnAMaker : QnAMaker
{
...
// Create second event.
var secondEventProperties = new Dictionary<string, string>();
// Create new property for the second event.
secondEventProperties.Add(
"MyImportantProperty2",
"myImportantValue2");
// Log secondEventProperties event
TelemetryClient.TrackEvent(
"MySecondEvent",
secondEventProperties);
}
Panel de Application Insights
Cada vez que cree un recurso de Application Insights en Azure, Azure creará un nuevo panel asociado al recurso. Para mostrar el panel desde la hoja Application Insights, seleccione Panel de aplicaciones.
Como alternativa, para ver los datos, vaya al Azure Portal, expanda el menú del portal y seleccione Panel. A continuación, seleccione el panel que desee en el menú desplegable.
El panel muestra información predeterminada sobre el rendimiento del bot y cualquier otra consulta que haya anclado al panel.