能否通过编程修改Azure QnA Maker答案置信度?求API实现
好问题!QnA Maker本身并不支持直接修改API返回的置信度,但有两种可行的方式来实现你想要的效果,分别适合不同的场景:
方法1:应用层动态修改返回结果(推荐用于业务逻辑驱动的动态调整)
这种方式不需要修改QnA Maker的知识库,而是在你的应用收到API返回的候选答案后,直接修改目标答案的置信度并重新排序。这完全符合你提到的“管理员基于业务逻辑调整”的需求——你可以在代码里加入任意判断逻辑,决定是否修改、修改多少置信度,灵活性拉满。
示例代码(Python)
import requests import json # 替换为你的QnA Maker配置信息 QNA_ENDPOINT = "https://<你的资源名称>.azurewebsites.net/qnamaker" KB_ID = "你的知识库ID" SUBSCRIPTION_KEY = "你的订阅密钥" USER_QUESTION = "用户的查询问题" # 1. 调用QnA Maker查询API获取候选答案 headers = { "Authorization": f"EndpointKey {SUBSCRIPTION_KEY}", "Content-Type": "application/json" } query_payload = { "question": USER_QUESTION, "top": 4 # 指定返回4个候选答案 } response = requests.post( f"{QNA_ENDPOINT}/v4.0/knowledgebases/{KB_ID}/generateAnswer", headers=headers, json=query_payload ) qna_results = response.json() # 2. 定位目标答案并修改置信度 # 这里用答案内容定位,也可以用问答对的ID(更可靠,避免内容重复) TARGET_ANSWER_CONTENT = "Answer 3的具体文本内容" for answer in qna_results["answers"]: if answer["answer"] == TARGET_ANSWER_CONTENT: answer["confidenceScore"] = 95 # 直接修改为目标置信度 break # 3. 按置信度重新排序(确保修改后的答案排第一) qna_results["answers"].sort(key=lambda x: x["confidenceScore"], reverse=True) # 4. 将修改后的结果返回给用户或进行后续处理 print(json.dumps(qna_results, indent=2))
方法2:修改知识库中问答对的权重(适合长期固定调整)
QnA Maker的置信度计算会参考问答对的权重(weight),权重越高,匹配时的置信度加成越大。你可以通过QnA Maker的更新API修改目标问答对的权重,间接提升它的置信度排名。这种方式会修改知识库,需要发布后生效,适合需要长期固定提升某答案优先级的场景。
示例代码(Python)
import requests import json # 替换为你的QnA Maker配置信息 QNA_ENDPOINT = "https://<你的资源名称>.azurewebsites.net/qnamaker" KB_ID = "你的知识库ID" SUBSCRIPTION_KEY = "你的订阅密钥" TARGET_ANSWER_CONTENT = "Answer 3的具体文本内容" headers = { "Authorization": f"EndpointKey {SUBSCRIPTION_KEY}", "Content-Type": "application/json" } # 1. 获取知识库中的所有问答对,找到目标问答对的ID get_kb_response = requests.get( f"{QNA_ENDPOINT}/v4.0/knowledgebases/{KB_ID}", headers=headers ) kb_data = get_kb_response.json() target_qna_id = None for qna_doc in kb_data["qnaDocuments"]: if qna_doc["answer"] == TARGET_ANSWER_CONTENT: target_qna_id = qna_doc["id"] break if not target_qna_id: print("未找到目标问答对,请检查答案内容是否正确") exit() # 2. 发送更新请求修改权重(默认权重为1,可调整为更高值,比如10) update_payload = { "update": [ { "id": target_qna_id, "weight": 10 # 权重越高置信度加成越大,需根据测试调整具体数值 } ], "add": [], "delete": [] } update_response = requests.patch( f"{QNA_ENDPOINT}/v4.0/knowledgebases/{KB_ID}", headers=headers, json=update_payload ) update_response.raise_for_status() # 3. 发布知识库,使修改生效 publish_response = requests.post( f"{QNA_ENDPOINT}/v4.0/knowledgebases/{KB_ID}/publish", headers=headers ) publish_response.raise_for_status() print("权重修改成功,知识库已发布,下次查询将生效")
关键注意事项
- 方法1的优势是完全可控、即时生效、不修改知识库,非常适合你提到的“基于业务逻辑动态调整”的需求——管理员可以在代码中配置规则,比如特定场景下自动提升某类答案的置信度。
- 方法2的权重调整对置信度的影响是算法计算的,不是线性对应(比如权重设为10不一定直接让置信度到95%),需要测试调整权重值来达到预期效果。
- 如果你需要更精准的控制,方法1是首选;如果需要长期固定提升某答案的优先级,方法2更合适。
内容的提问来源于stack exchange,提问作者Umer Qureshi
相关产品推荐
相关产品推荐

