"""在一个微型字符词表上演示约束解码；不加载模型，不解析通用 JSON Schema。"""
import math

# 简化场景：只允许输出两个带引号的类别字符串。
# 真正模型的词表单位是 Token，这里用字符只是为了能逐个看清分支。
allowed_answers = ['"billing"', '"security"']
prefix = '"'
# 人工设置下一字符的分数：非法的 x 得分反而最高。
logits = {"b": 2.0, "s": 1.0, "x": 3.0}

# 一个字符只有在追加后仍能补全为某个合法答案，才允许被选择。
legal = {
    char: score for char, score in logits.items()
    if any(answer.startswith(prefix + char) for answer in allowed_answers)
}
# 先减最大分数再取指数，避免大数溢出；这不改变 softmax 比例。
peak = max(legal.values())
weights = {char: math.exp(score - peak) for char, score in legal.items()}
total = sum(weights.values())
probabilities = {char: weight / total for char, weight in weights.items()}
print("合法下一字符的概率：", probabilities)
# b 的条件概率约为 0.731。这个结果只保证合法选择，不证明 billing 分类正确。
print("贪心选择：", max(probabilities, key=probabilities.get))
