Как
Этого можно достичь, установив свойство Text
для Activity
, которое находится под свойством Context
, следующим образом:
stepContext.Context.Activity.Text = "The phrase that you want to pass through here";
Выполните это назначение ДО , по которому вы звоните LuisHelper.ExecuteLuisQuery
, в противном случае ваше обновленное значение Text
не будет отправлено.
Почему это должноработа
Поскольку LuisHelper.ExecuteLuisQuery(Configuration, Logger, stepContext.Context, cancellationToken)
проходит через stepContext.Context
и под сценами здесь этот контекст передается в вызов RecognizeAsync
внутри метода ExecuteLuisQuery
.Кроме того, переменная recognizer
имеет тип LuisRecognizer
, исходный код для этого класса доступен здесь .Строка, которая вас интересует, это эта , которая показывает Text
свойство turnContext
, используемого в качестве высказывания, которое передается через.
Объяснение исходного кода / Дополнительная информация
Для дальнейшего использования (в случае изменения кода или ссылок) упрощенная версия исходного кода:
public virtual async Task<RecognizerResult> RecognizeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
=> await RecognizeInternalAsync(turnContext, null, null, null, cancellationToken).ConfigureAwait(false);
, где RecognizeInteralAsync
выглядит следующим образом:
private async Task<RecognizerResult> RecognizeInternalAsync(ITurnContext turnContext, LuisPredictionOptions predictionOptions, Dictionary<string, string> telemetryProperties, Dictionary<string, double> telemetryMetrics, CancellationToken cancellationToken)
{
var luisPredictionOptions = predictionOptions == null ? _options : MergeDefaultOptionsWithProvidedOptions(_options, predictionOptions);
BotAssert.ContextNotNull(turnContext);
if (turnContext.Activity.Type != ActivityTypes.Message)
{
return null;
}
// !! THIS IS THE IMPORTANT LINE !!
var utterance = turnContext.Activity?.AsMessageActivity()?.Text;
RecognizerResult recognizerResult;
LuisResult luisResult = null;
if (string.IsNullOrWhiteSpace(utterance))
{
recognizerResult = new RecognizerResult
{
Text = utterance,
Intents = new Dictionary<string, IntentScore>() { { string.Empty, new IntentScore() { Score = 1.0 } } },
Entities = new JObject(),
};
}
else
{
luisResult = await _runtime.Prediction.ResolveAsync(
_application.ApplicationId,
utterance,
timezoneOffset: luisPredictionOptions.TimezoneOffset,
verbose: luisPredictionOptions.IncludeAllIntents,
staging: luisPredictionOptions.Staging,
spellCheck: luisPredictionOptions.SpellCheck,
bingSpellCheckSubscriptionKey: luisPredictionOptions.BingSpellCheckSubscriptionKey,
log: luisPredictionOptions.Log ?? true,
cancellationToken: cancellationToken).ConfigureAwait(false);
recognizerResult = new RecognizerResult
{
Text = utterance,
AlteredText = luisResult.AlteredQuery,
Intents = LuisUtil.GetIntents(luisResult),
Entities = LuisUtil.ExtractEntitiesAndMetadata(luisResult.Entities, luisResult.CompositeEntities, luisPredictionOptions.IncludeInstanceData ?? true),
};
LuisUtil.AddProperties(luisResult, recognizerResult);
if (_includeApiResults)
{
recognizerResult.Properties.Add("luisResult", luisResult);
}
}
// Log telemetry code
await OnRecognizerResultAsync(recognizerResult, turnContext, telemetryProperties, telemetryMetrics, cancellationToken).ConfigureAwait(false);
var traceInfo = JObject.FromObject(
new
{
recognizerResult,
luisModel = new
{
ModelID = _application.ApplicationId,
},
luisOptions = luisPredictionOptions,
luisResult,
});
await turnContext.TraceActivityAsync("LuisRecognizer", traceInfo, LuisTraceType, LuisTraceLabel, cancellationToken).ConfigureAwait(false);
return recognizerResult;
}