Node.js Bot Framework SDK调用迁移后自定义问答服务生成答案失败
问题根因
旧版botbuilder-ai v4.15.0内置的QnAMaker类仅适配已退市的传统QnAMaker服务,你升级后的自定义问答服务使用全新的API路径、参数规范,与旧版类的内部逻辑完全不兼容,所以会出现请求失败报错。你排查到的URL拼接差异是核心不兼容点之一,除此之外旧版QnAMaker类的请求体、返回值结构也与新版自定义问答服务不匹配,仅修改env配置的主机地址无法解决问题。
解决方案
方案1:迁移到官方新版自定义问答SDK(长期稳定方案)
- 卸载旧的无效依赖,安装官方提供的自定义问答专用SDK:
npm install @azure/ai-language-questionanswering @azure/core-auth
- 替换原有QnAMaker初始化逻辑:
const { QuestionAnsweringClient } = require("@azure/ai-language-questionanswering"); const { AzureKeyCredential } = require("@azure/core-auth"); // 初始化客户端 this.qnaClient = new QuestionAnsweringClient( process.env.QnAEndpointHostName, new AzureKeyCredential(process.env.QnAEndpointKey) );
- 替换原有调用逻辑,原有
QnAKnowledgebaseId对应自定义问答的项目名:
const projectName = process.env.QnAKnowledgebaseId; const deploymentName = "production"; const qnaResults = await this.qnaClient.getAnswers( step.context.activity.text, projectName, deploymentName );
方案2:临时兼容方案(不换核心依赖,仅重写请求逻辑)
如果不想大幅改动现有代码结构,可以直接按照自定义问答的API规范手写POST请求,跳过旧版QnAMaker类的内部拼接逻辑:
- 若项目未安装axios先安装依赖:
npm install axios
- 替换原有调用逻辑:
const axios = require('axios'); // 调用示例 const qnaResults = await axios.post( `${process.env.QnAEndpointHostName}/language/:query-knowledgebases?projectName=${process.env.QnAKnowledgebaseId}&api-version=2021-10-01&deploymentName=production`, { question: step.context.activity.text, top: 3, // 自定义返回结果数量 confidenceScoreThreshold: 0.5 // 自定义置信度阈值 }, { headers: { "Ocp-Apim-Subscription-Key": process.env.QnAEndpointKey, "Content-Type": "application/json" } } ).then(res => res.data.answers);
内容的提问来源于stack exchange,提问作者Hessel
相关产品推荐
相关产品推荐

