大语言模型写诗、写代码、写摘要的能力已经被各类基准反复检验,但"规划"这项更接近真实决策的核心能力,一直缺乏系统化、可扩展的评测手段。腾讯混元团队联合中国人民大学高瓴人工智能学院等机构开源的 PlanningBench,正是要补上这块短板——它从真实规划场景出发,抽象任务结构与约束,构建覆盖 30+ 任务类型的数据生成与验证体系,让"模型到底能不能规划"这个问题有了可量化、可复现的答案。
规划能力评测为什么难
规划不同于单步推理或文本生成。一个完整的规划任务通常包含:
- 多步依赖:后续步骤依赖前序步骤的结果,一步错则全盘错。
- 约束满足:资源上限、时间窗口、互斥条件等硬约束必须同时满足。
- 动态调整:执行过程中环境变化,需要重新规划。
传统评测要么用几道手工设计的谜题(如 Block World),要么拿现成数据集做端到端准确率统计,问题很明显——题量少、覆盖窄、答案不可自动验证。模型答对了可能是蒙的,答错了也不知道是哪一步出了问题。
PlanningBench 的思路是:把规划任务本身做成一个可程序化生成、可自动验证的对象,而不是靠人工一道一道写题。
30+ 任务类型与可扩展生成框架
PlanningBench 将真实规划场景抽象为若干任务族,每个族内通过参数化生成大量实例:
| 任务族示例 | 核心约束 | 难度调节维度 |
|---|---|---|
| 旅行路线规划 | 时间窗口、预算上限 | 目的地数量、交通方式组合 |
| 资源分配调度 | 容量上限、互斥占用 | 资源种类数、冲突密度 |
| 项目任务编排 | 前后依赖、截止日期 | 依赖链深度、并行分支数 |
| 仓储物流调度 | 库存容量、补货周期 | SKU 数量、需求波动幅度 |
框架的关键设计在于难度因素的系统化注入——不是简单增加输入长度,而是在约束数量、依赖深度、解空间大小等维度上逐步加压,使得同一任务族可以生成从入门到极端的连续难度梯度。
验证体系同样重要。每个生成的任务实例都附带一个形式化规约(可类比为 PDDL 或约束编程的描述),使得任何候选方案都能被程序化地判定"是否满足全部约束",而非依赖人工标注或 LLM 自评。
用 PlanningBench 做一次规划能力评测
以下示例展示如何基于 PlanningBench 框架生成任务、调用模型、并自动验证结果。当前框架以开源仓库形式发布,具体 API 可能随版本迭代调整,使用前请查阅仓库最新文档与示例。
假设说明:下方代码基于 PlanningBench 公开仓库的典型使用模式编写,部分接口名称为合理推断,请以仓库实际 API 为准。
# 安装(请以仓库 README 中的最新指令为准)
# pip install planningbench 或从源码安装
from planningbench import TaskGenerator, Verifier, PlannerEvaluator
# 1. 生成旅行规划任务实例
generator = TaskGenerator(task_type="travel_planning", seed=42)
task = generator.generate(
num_destinations=5, # 目的地数量
budget_limit=3000, # 预算上限(元)
time_window_days=7, # 时间窗口
difficulty="medium" # 难度级别:easy / medium / hard
)
print("任务描述:", task.description)
print("约束列表:", task.constraints)
# 输出类似:
# 任务描述:请在7天内规划一条覆盖5个城市的旅行路线...
# 约束列表:[总预算≤3000元, 每城停留≥1天, 相邻城市间有直达交通...]
# 2. 调用待评测模型生成规划方案
from openai import OpenAI
client = OpenAI(
base_url="https://api.hunyuan.tencent.com/v1", # 或其他兼容端点
api_key="YOUR_API_KEY"
)
prompt = f"""你是一位旅行规划师。请根据以下任务和约束,输出一个完整的日程安排表。
任务:{task.description}
约束:{task.constraints}
请按如下格式输出:
日期 | 城市 | 活动 | 预估花费 | 交通方式
"""
response = client.chat.completions.create(
model="hunyuan-lite", # 替换为你要评测的模型
messages=[{"role": "user", "content": prompt}],
temperature=0.3
)
plan_text = response.choices[0].message.content
print("模型输出:\n", plan_text)
# 3. 自动验证方案是否满足全部约束
verifier = Verifier(task_type="travel_planning")
result = verifier.verify(task=task, plan_text=plan_text)
print("验证结果:", result.summary)
print("约束满足详情:")
for c in result.constraint_details:
print(f" {c.name}: {'✅ 满足' if c.satisfied else '❌ 违反'} — {c.reason}")
运行上述脚本后,你会得到一份结构化的验证报告:每条约束是否满足、违反原因、以及整体通过率。这使得评测不再停留在"看起来合理"的主观判断,而是有硬性判定标准。
批量评测与难度梯度分析
单条任务只能看个例,真正有价值的是跨难度梯度的批量评测:
from planningbench import BenchmarkRunner
runner = BenchmarkRunner(
task_types=["travel_planning", "resource_allocation", "project_scheduling"],
difficulties=["easy", "medium", "hard", "extreme"],
samples_per_config=50 # 每种配置生成50个实例
)
# 对多个模型运行评测
results = runner.run(
models=["hunyuan-lite", "gpt-4o-mini", "deepseek-chat"],
api_configs={
"hunyuan-lite": {"base_url": "https://api.hunyuan.tencent.com/v1", "api_key": "KEY_A"},
"gpt-4o-mini": {"base_url": "https://api.openai.com/v1", "api_key": "KEY_B"},
"deepseek-chat": {"base_url": "https://api.deepseek.com/v1", "api_key": "KEY_C"},
},
temperature=0.3,
max_tokens=2048
)
# 查看各模型在不同难度下的通过率
results.plot_pass_rate_by_difficulty()
results.export_csv("planning_eval_results.csv")
批量跑完后,你可以直观看到:哪个模型在 easy 级别轻松过关,却在 hard 级别骤降;哪个模型在资源分配类任务上表现稳定,却在项目编排上频繁违反依赖约束。这些细粒度信号远比一个笼统的"准确率"更有工程指导意义。
采纳建议与注意事项
谁应该关注 PlanningBench:
- 正在评估大模型能否承担调度、排期、路线优化等真实决策任务的团队——用它做准入测试,比看通用基准分数靠谱得多。
- 训练规划增强模型的研究者——框架的数据生成能力可以直接产出训练语料,验证能力则提供可靠的 reward signal。
- 需要向业务方解释"模型规划能力边界"的工程师——难度梯度报告比一句"模型还不够好"更有说服力。
使用时的几个现实考量:
- 验证器与领域对齐:框架内置的验证逻辑覆盖了通用约束类型,但特定业务场景可能有独特约束(如合规红线、行业惯例),需要自行扩展验证器。
- 生成多样性 vs 可控性:参数化生成保证了可控的难度梯度,但实例之间的语义多样性可能不如真实业务日志。建议将生成数据与真实案例混合使用。
- 模型输出格式稳定性:验证的前提是模型输出能被结构化解析。实际运行中,模型格式漂移(多加一句解释、少写一列)是常见问题,需要在 prompt 设计和后处理上预留容错空间。
- 成本控制:批量评测 30+ 任务类型 × 4 难度 × 50 样本,调用量不小。建议先用小规模跑通流程,再逐步扩展。
PlanningBench 的核心贡献不是又一个排行榜,而是给"规划能力"这个模糊概念装上了刻度尺和检验台。对于任何想把 LLM 从聊天伙伴升级为决策助手的团队来说,这把尺子值得先刻好再用。