跳到主要内容
valen

校准工单分流

用自己的带标签工单拟合复核规则,再为每条请求返回 automatic 或 human_review。本例使用原生模型,候选团队为账单、技术支持和账户服务。

准备环境与数据​

使用包含校准工具的 Valen 源码环境和已经下载好的原生模型,环境配置见原生推理。下载 Cookbook 源码包,然后解压:

Bash
# /path/to/Valen 是含 pyproject.toml 的 Valen 源码目录
# 仅安装 valen-sdk 不包含这里使用的原生校准工具
python -m pip install -e /path/to/Valen
python -m zipfile -e valen-cookbook.zip .
cd valen-cookbook

下载包包含统一维护的脚本和 JSON 样本,不含权重或媒体。下列命令均在这个目录执行,沿用同一 Valen 环境。

按带标签记录格式准备 tickets/calibration.jsonl、tickets/policy.jsonl 和 tickets/test.jsonl。每条记录包含稳定的来源 group_id、request 与 targets。同一客户或会话留在同一组,三个切分均与训练分开。候选含义与顺序应与应用一致,工作流版本记录在 calibration_protocol.json。

采集一次,离线拟合​

Bash
for role in calibration policy test; do
python -m valen.reliability_collect \
--model-dir /models/Valen-0.8B --device cuda \
--data tickets/$role.jsonl --role "$role" \
--protocol calibration_protocol.json \
--group-namespace support-customers-v1 --output cache/$role.json
done

python -m valen.calibrate pipeline \
--calibration-cache cache/calibration.json \
--policy-cache cache/policy.json --test-cache cache/test.json \
--output output/reliability

采集只读取本地权重并保留原始 logits。拟合与生成报告离线完成,无需重训模型。产物包含校准参数、分流规则,以及自动处理量、错误数和复核量的测试报告。默认 policy-2.json 对应验证集上的 5% 目标,采用前应查看实际测试结果。

加载规则分流​

Bash
python calibrated_ticket_routing.py \
--model-dir /models/Valen-0.8B --device cuda \
--request calibration_request.json \
--protocol calibration_protocol.json \
--calibration output/reliability/calibration.json \
--policy output/reliability/policy-2.json

脚本调用 valen.routing.route_choice,校验模型、校准参数和规则的关联,再给出分流建议。概率未达条件、推理失败或规则要求全部复核时,转入人工队列,不执行账户操作。本例应使用自己拟合的参数;发布的 BANKING77 参数属于另一套 77 意图任务。

查看完整脚本
calibrated_ticket_routing.py
"""Route tickets with fitted parameters and a frozen review policy. Apache-2.0."""
import argparse
import json


def main(argv=None):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--model-dir", required=True)
parser.add_argument("--model-id")
parser.add_argument("--revision")
parser.add_argument("--device", default="cuda")
parser.add_argument("--request", required=True)
parser.add_argument("--protocol", required=True)
parser.add_argument("--calibration", required=True)
parser.add_argument("--policy", required=True)
args = parser.parse_args(argv)
from valen.evaluation.calibration import load_calibration, read_json
from valen.reliability_collect import LocalRelease
from valen.routing import route_choice
model = LocalRelease(args.model_dir, read_json(args.protocol), model_id=args.model_id,
revision=args.revision, device=args.device)
calibration = load_calibration(args.calibration, model.identity)
policy = read_json(args.policy)
request = read_json(args.request)
questions = request["questions"]
if len(questions) != 1 or next(iter(questions.values()))["type"] != "choice":
raise ValueError("This example expects one Choice question")
qid = next(iter(questions))
try:
keys, logits = model.logits(request)[qid]
except Exception as exc:
result = {"route": "human_review", "reason": "inference_failed", "error_type": type(exc).__name__}
else:
result = route_choice(keys, logits, calibration, policy)
print(json.dumps(result, ensure_ascii=False, allow_nan=False))


if __name__ == "__main__":
main()
工作流声明与请求样本
calibration_protocol.json
{
"application": "ticket-intent-v1",
"candidate_schema": "billing-technical-account-v1",
"prompt_version": "ticket-routing-v1",
"label_policy": "human-adjudicated-intent-v1",
"media_budget": "text-only",
"question_grouping": "one Choice question per ticket"
}
calibration_request.json
{
"state": "I was charged twice for the same subscription.",
"questions": {
"intent": {
"type": "choice",
"instructions": "Which team should review this ticket?",
"criteria": {
"billing": "Payments, charges, refunds and invoices",
"technical": "Software errors and service availability",
"account": "Profile, sign-in and account access"
}
}
}
}

请求样本用于说明格式,不是评测数据。页面代码与两个 JSON 均直接引用下载包中的同一份源码。

发布模型实测 · 校准概览 · 指标与缓存协议