使用 LuisRecognizer 模拟 LUIS 响应不起作用
Mocking LUIS response with LuisRecognizer not working
我正在尝试通过 nock 模拟对 LUIS 的调用,它使用来自 botbuilder-ai 的 LuisRecognizer。这里是相关资料。
机器人本身正在调用 LUIS 并通过 const recognizerResult = await this.dispatchRecognizer.recognize(context);
获取结果。我抓取的实际结果如下:
{"text":"I want to look up my order","intents":{"viewOrder":{"score":0.996454835},"srStatus":{"score":0.0172454268},"expediteOrder":{"score":0.0108480565},"escalate":{"score":0.007967358},"qna":{"score":0.00694736559},"Utilities_Cancel":{"score":0.005627355},"manageProfile":{"score":0.004953466},"getPricing":{"score":0.001781322},"Utilities_Help":{"score":0.0007197641},"getAvailability":{"score":0.0005667514},"None":{"score":0.000321137835}},"entities":{"$instance":{}},"sentiment":{"label":"negative","score":0.171873689},"luisResult":{"query":"I want to look up my order","topScoringIntent":{"intent":"viewOrder","score":0.996454835},"intents":[{"intent":"viewOrder","score":0.996454835},{"intent":"srStatus","score":0.0172454268},{"intent":"expediteOrder","score":0.0108480565},{"intent":"escalate","score":0.007967358},{"intent":"qna","score":0.00694736559},{"intent":"Utilities.Cancel","score":0.005627355},{"intent":"manageProfile","score":0.004953466},{"intent":"getPricing","score":0.001781322},{"intent":"Utilities.Help","score":0.0007197641},{"intent":"getAvailability","score":0.0005667514},{"intent":"None","score":0.000321137835}],"entities":[],"sentimentAnalysis":{"label":"negative","score":0.171873689}}}
为了简洁起见,我在下面将其称为"recognizerResult"。我用nock成功拦截了我的测试文件中的API调用,配置如下:
nock('https://westus.api.cognitive.microsoft.com')
.post(/.*/)
.reply(200,{recognizerResult});
我试过以 JSON 对象和字符串的形式返回,但我几乎可以肯定这需要是 JSON 对象,如图所示(我正在模拟对 QnA 的调用制造商采用相同的方法)。当我通过 mocha 运行 这个测试时,我得到以下错误:
TypeError: Cannot read property 'replace' of undefined
at LuisRecognizerV2.normalizeName (node_modules\botbuilder-ai\src\luisRecognizerOptionsV2.ts:96:21)
at luisResult.intents.reduce (node_modules\botbuilder-ai\src\luisRecognizerOptionsV2.ts:104:31)
at Array.reduce (<anonymous>)
at LuisRecognizerV2.getIntents (node_modules\botbuilder-ai\src\luisRecognizerOptionsV2.ts:102:32)
at LuisRecognizerV2.<anonymous> (node_modules\botbuilder-ai\src\luisRecognizerOptionsV2.ts:81:27)
at Generator.next (<anonymous>)
at fulfilled (node_modules\botbuilder-ai\lib\luisRecognizerOptionsV2.js:11:58)
at process._tickCallback (internal/process/next_tick.js:68:7)
我查看了 luisRecognizerOptionsV2.ts 文件中有问题的代码,但看不出哪里有问题。替换是规范化意图名称的一部分,用于用“_”替换不受支持的字符。机器人 运行 在部署到 Azure(和本地)时正常运行,并且测试在不模拟调用的情况下工作。但是,我真的希望能够在不进行实际 LUIS 调用的情况下对此进行测试。我收到此错误的原因以及如何修复有什么想法吗?
作为参考,这是正在运行的 QnA Maker 模拟,但请注意,我使用的是简单的 REST 调用而不是识别器。
nock('https://myqnaservicename.azurewebsites.net')
.post(/.*/)
.reply(200, {"answers": [{"questions": ["I need an unrecognized utterance for testing"], "answer": "I can hear you now!", "score": 28.48, "id": 1234}]});
问题是您的 {recognizerResult}
是 保存到 const recognizerResult
的内容,但 不是 的内容由 API 调用返回。
需要大量挖掘才能找到所有内容,但是 V2 LUIS 客户端会得到 API 响应,然后 converts it into recognizerResult
。
对于"fixing"这个你有几个选项:
- 在那个
node_modules\botbuilder-ai\src\luisRecognizerOptionsV2
文件的那个 const result =
行设置一个断点并抓取 luisResult
.
- 使用类似 Fiddler 的东西来记录实际的 API 响应并使用它
- 手动写
作为参考,您可以在我们的测试中看到我们是如何做到这一点的:
你可以看到我们的nock() returns response.v2
, which does not contain .topScoringIntent
, which is what it's looking for,这就是抛出错误的原因。
具体来说,模拟响应需要只是 v2/luisResults 属性。也就是说,使用luisRecognizer时,nock中设置的response需要
.reply(200,{ "query": "Sample query", "topScoringIntent": { "intent": "desiredIntent", "score":1}, "entities":[]});
如果您查看上面链接的测试数据,实际响应中还有其他属性。但如果您只是想让 topIntent 测试路由,那么这是最低要求的响应。如果您需要其他属性,您可以添加它们,例如您可以在 v2 中添加所有内容,如 this file 或一些更复杂的文件,例如多个意图。
我正在尝试通过 nock 模拟对 LUIS 的调用,它使用来自 botbuilder-ai 的 LuisRecognizer。这里是相关资料。
机器人本身正在调用 LUIS 并通过 const recognizerResult = await this.dispatchRecognizer.recognize(context);
获取结果。我抓取的实际结果如下:
{"text":"I want to look up my order","intents":{"viewOrder":{"score":0.996454835},"srStatus":{"score":0.0172454268},"expediteOrder":{"score":0.0108480565},"escalate":{"score":0.007967358},"qna":{"score":0.00694736559},"Utilities_Cancel":{"score":0.005627355},"manageProfile":{"score":0.004953466},"getPricing":{"score":0.001781322},"Utilities_Help":{"score":0.0007197641},"getAvailability":{"score":0.0005667514},"None":{"score":0.000321137835}},"entities":{"$instance":{}},"sentiment":{"label":"negative","score":0.171873689},"luisResult":{"query":"I want to look up my order","topScoringIntent":{"intent":"viewOrder","score":0.996454835},"intents":[{"intent":"viewOrder","score":0.996454835},{"intent":"srStatus","score":0.0172454268},{"intent":"expediteOrder","score":0.0108480565},{"intent":"escalate","score":0.007967358},{"intent":"qna","score":0.00694736559},{"intent":"Utilities.Cancel","score":0.005627355},{"intent":"manageProfile","score":0.004953466},{"intent":"getPricing","score":0.001781322},{"intent":"Utilities.Help","score":0.0007197641},{"intent":"getAvailability","score":0.0005667514},{"intent":"None","score":0.000321137835}],"entities":[],"sentimentAnalysis":{"label":"negative","score":0.171873689}}}
为了简洁起见,我在下面将其称为"recognizerResult"。我用nock成功拦截了我的测试文件中的API调用,配置如下:
nock('https://westus.api.cognitive.microsoft.com')
.post(/.*/)
.reply(200,{recognizerResult});
我试过以 JSON 对象和字符串的形式返回,但我几乎可以肯定这需要是 JSON 对象,如图所示(我正在模拟对 QnA 的调用制造商采用相同的方法)。当我通过 mocha 运行 这个测试时,我得到以下错误:
TypeError: Cannot read property 'replace' of undefined
at LuisRecognizerV2.normalizeName (node_modules\botbuilder-ai\src\luisRecognizerOptionsV2.ts:96:21)
at luisResult.intents.reduce (node_modules\botbuilder-ai\src\luisRecognizerOptionsV2.ts:104:31)
at Array.reduce (<anonymous>)
at LuisRecognizerV2.getIntents (node_modules\botbuilder-ai\src\luisRecognizerOptionsV2.ts:102:32)
at LuisRecognizerV2.<anonymous> (node_modules\botbuilder-ai\src\luisRecognizerOptionsV2.ts:81:27)
at Generator.next (<anonymous>)
at fulfilled (node_modules\botbuilder-ai\lib\luisRecognizerOptionsV2.js:11:58)
at process._tickCallback (internal/process/next_tick.js:68:7)
我查看了 luisRecognizerOptionsV2.ts 文件中有问题的代码,但看不出哪里有问题。替换是规范化意图名称的一部分,用于用“_”替换不受支持的字符。机器人 运行 在部署到 Azure(和本地)时正常运行,并且测试在不模拟调用的情况下工作。但是,我真的希望能够在不进行实际 LUIS 调用的情况下对此进行测试。我收到此错误的原因以及如何修复有什么想法吗?
作为参考,这是正在运行的 QnA Maker 模拟,但请注意,我使用的是简单的 REST 调用而不是识别器。
nock('https://myqnaservicename.azurewebsites.net')
.post(/.*/)
.reply(200, {"answers": [{"questions": ["I need an unrecognized utterance for testing"], "answer": "I can hear you now!", "score": 28.48, "id": 1234}]});
问题是您的 {recognizerResult}
是 保存到 const recognizerResult
的内容,但 不是 的内容由 API 调用返回。
需要大量挖掘才能找到所有内容,但是 V2 LUIS 客户端会得到 API 响应,然后 converts it into recognizerResult
。
对于"fixing"这个你有几个选项:
- 在那个
node_modules\botbuilder-ai\src\luisRecognizerOptionsV2
文件的那个const result =
行设置一个断点并抓取luisResult
. - 使用类似 Fiddler 的东西来记录实际的 API 响应并使用它
- 手动写
作为参考,您可以在我们的测试中看到我们是如何做到这一点的:
你可以看到我们的nock() returns response.v2
, which does not contain .topScoringIntent
, which is what it's looking for,这就是抛出错误的原因。
具体来说,模拟响应需要只是 v2/luisResults 属性。也就是说,使用luisRecognizer时,nock中设置的response需要
.reply(200,{ "query": "Sample query", "topScoringIntent": { "intent": "desiredIntent", "score":1}, "entities":[]});
如果您查看上面链接的测试数据,实际响应中还有其他属性。但如果您只是想让 topIntent 测试路由,那么这是最低要求的响应。如果您需要其他属性,您可以添加它们,例如您可以在 v2 中添加所有内容,如 this file 或一些更复杂的文件,例如多个意图。