如何将qnamaker.ai的QnA Service连接至Azure Bot Service?及Bot创建疑问
我来帮你逐个解决这两个问题:
问题1:将QnA Maker创建的QnA Service连接到Azure Bot Service
连接的核心是把QnA服务的配置信息给到Bot,再在Bot代码里调用QnA的接口,具体步骤如下:
先获取QnA Service的关键信息
登录qnamaker.ai,打开你的知识库,点击右上角的「设置」。在「Deployment details」区域,复制三个重要内容:知识库ID、QnA Maker资源密钥和终结点URL(注意终结点只需要主机部分,比如https://your-qna-resource.azurewebsites.net,去掉后面的/qnamaker路径)。在Azure Bot中配置QnA参数
登录Azure门户,找到你创建的Bot(比如Web App Bot),进入管理页面后,左侧选「配置」,再点「应用程序设置」。在这里添加三个键值对:QnAKnowledgebaseId:粘贴刚才的知识库IDQnAAuthKey:粘贴QnA资源密钥QnAEndpointHostName:粘贴处理后的终结点主机地址
保存这些设置。
修改Bot代码调用QnA服务
如果你用的是Bot Framework SDK,以Node.js为例:- 先安装依赖包:
npm install botbuilder-ai - 在Bot的核心逻辑代码里,初始化QnAMaker实例,然后在对话流程中调用它获取回答:
const { QnAMaker } = require('botbuilder-ai'); // 从环境变量读取配置(就是刚才在应用程序设置里加的键值对) const qnaMaker = new QnAMaker({ knowledgeBaseId: process.env.QnAKnowledgebaseId, endpointKey: process.env.QnAAuthKey, host: process.env.QnAEndpointHostName }); async onTurn(context) { // 调用QnA服务获取回答 const qnaResults = await qnaMaker.getAnswers(context); if (qnaResults.length > 0) { await context.sendActivity(qnaResults[0].answer); } else { await context.sendActivity('抱歉,我暂时没法回答这个问题'); } } - 把修改后的代码部署到Azure Bot Service,之后测试聊天就能看到QnA的回答了。
- 先安装依赖包:
问题2:创建Bot时找不到「Bot Service (Preview)」选项的解决方案
不用慌,「Bot Service (Preview)」是Azure旧版的入口,现在已经拆分整合为你看到的这几个选项了,对应关系和选择建议如下:
- Web App Bot:这是最常用的选项,对应旧版的Bot Service,基于Web App托管,支持绝大多数Bot Framework功能,适合创建需要持续运行、有复杂逻辑的Bot。如果你要做集成QnA的聊天机器人,选这个就对了。
- Functions Bot:基于Azure Functions的无服务器Bot,适合轻量级、触发式的场景(比如只有特定事件才响应),成本更低,但功能相对受限。
- Bot Channels Registration:这个不是用来创建新Bot的,而是把你自己托管的Bot(比如本地运行或者其他服务器上的)注册到Azure,方便连接Teams、微信等聊天渠道。
如果要创建集成QnA的Bot,选「Web App Bot」后,在「Bot template」步骤可以直接选「Question and Answer」模板(如果有的话),这样Azure会自动帮你配置基础的QnA集成;如果没看到这个模板,选「Empty Bot」之后再按照问题1的步骤手动集成也可以。
内容的提问来源于stack exchange,提问作者Sukhman Preet Singh Jawa




