置信度
TypeSafe 如何报告确定性、它与概率有何不同,以及如何用它控制系统行为。
TypeSafe 返回的所有 Score 和 Choice 答案都包含一个 probabilities 属性,表示在各个选项(Choice)或等级(Score)上的概率分布。正是这个分布的形状告诉你模型有多确定:集中于某个结果意味着答案很确定,分散则意味着不确定。
答案的 confidence 属性将这个形状压缩成一个 0 到 1 之间的单一数字,你可以直接基于它设置阈值,而无需自己计算。(Noul 答案不带这个属性。)
置信度由概率推导而来
confidence 是根据答案已经给出的概率分布计算出的统计量。TypeSafe 会替你完成计算,并在每个 Choice 和 Score 答案中返回它,因此常见场景无需你在本地做任何额外工作。
一个可靠的默认值: 我们提供 confidence 作为适用于大多数用例的便捷度量,但你绝不会被困在我们的定义里。取决于你在评估什么,另一种度量可能更适合你——这正是我们在响应中给出完整 probabilities 的原因。不同计算方式的利弊是一个专门话题,我们会把它放到另一份实战指南中而非本页,届时会在这里补充链接!
对于 Choice,分布是跨各个选项的 probabilities;对于 Score,它是跨各个等级的分布。两种情况下,越平坦的分布意味着越低的置信度:Choice 的低置信度通常意味着没有任何一个选项明显胜过其他选项,而 Score 的低置信度通常意味着等级含糊、多维,或者状态中包含的信息不足以做出判断。
“我不知道”是一个有用的信号
一个智能系统,无论是人还是机器,如果无法表达真实的不确定性,就无法被信任。
置信度为你提供了一种内置机制,让模型能够说“这个我不太确定”。这使你的代码可以针对不同的确定程度实现不同的行为,而这正是构建真正可依赖的系统的基础。
在代码中使用置信度的三条路径
一个实用的入门模式是将置信度划分为三个区间,每个区间对应不同的系统行为:
高置信度: 自动执行。模型的判断清晰明确,你可以在无需人工参与的情况下继续。
中等置信度: 谨慎推进。模型给出了合理的答案但并不确定。根据上下文,你可以请用户确认、标记以供审核,或在行动前收集更多信息。
低置信度: 不要行动。转给人工、请求澄清,或回退到另一个系统。模型在告诉你:它没有足够的信息,或者这个问题并不适合它。
这些边界画在哪里取决于风险高低。
阈值随风险调整
置信度阈值不是一个数字。同一系统中的不同操作,应根据出错的后果在不同的水平上设置门槛。
response = client.system_one(
state=user_message,
questions={
"action": Choice(
instructions="What is the user trying to do?",
criteria={
"check_balance": "View account balance",
"approve_transfer": "Approve the pending withdrawal request",
"support": "Get help with an issue",
},
),
},
)
action = response.answers["action"]
confidence = action.confidence
if confidence < 0.5:
# Model is genuinely unsure. Don't guess.
route_to_human(user_message)
elif action.choice == "check_balance":
# Low stakes. Showing the wrong screen is recoverable.
show_balance(account_id)
elif action.choice == "approve_transfer":
if confidence > 0.9:
# High stakes, high confidence. Proceed with confirmation.
confirm_then_execute(account_id)
else:
# High stakes, moderate confidence. Verify first.
ask_user_to_confirm(account_id)0.5 的置信度下限会拦下所有模型报告为真正不确定的情况。在此基础上,未经确认就执行操作的阈值,对破坏性操作要高于只读操作。你的代码负责编码风险容忍度。
正确的阈值取决于你的领域以及模型在你的用例上的表现。从保守的阈值开始,用你自己的数据测试,并根据观察到的结果进行调整。