You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过编程修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 12:39:10