用自然语言描述排班难题?VibeSolve 实战:Plain English 秒变 Timefold 优化求解器
在日常开发中,”优化排班””路径规划””资源调度”这类问题听起来就像数学竞赛题。学校需要给教师排课,物流公司需要规划配送路线,医院需要安排护士班次……这类问题统称为约束求解(Constraint Satisfaction),传统做法要么写复杂的数学公式,要么购买昂贵的企业级求解器。
今天介绍一个开源项目 VibeSolve,它能让你用纯自然语言描述优化问题,然后自动生成完整的 Java + Timefold 求解器项目——包含领域模型、约束条件、REST API、测试用例,并通过 Docker 自动验证编译和运行的正确性。
安装与准备
VibeSolve 是 Python CLI 工具,15 行命令以内就能跑起来:
git clone https://github.com/vibesolve/vibesolve.git cd vibesolve conda create -n vibesolve python=3.11 -y conda activate vibesolve pip install -e . cp .env.example .env.local
依赖只有三项:Python 3.11+、Docker 20+(用于自动验证)、一个 LLM API Key(默认 OpenAI,支持 Anthropic Claude)。Docker 用于编译和运行生成的 Java 项目,VibeSolve 会在首次运行时自动构建验证镜像。
实战场景 1:学校排课(入门级)
VibeSolve 内置了一个学校排课示例,一行命令即可体验完整流程:
vibesolve run
整个流程是这样的:VibeSolve 读取描述文件 → 7 个 specialized LLM Agent 级联执行(解析→建模→约束→IO→集成→Review→Fix)→ 生成完整的 Maven 项目 → 在 Docker 中 mvn compile 验证 → 输出最终项目到 results/run_。
生成的目录结构包含:
results/run_20260626_123456/ ├── pom.xml ├── src/main/java/ │ ├── domain/ # 领域模型(Lesson, Teacher, Room 等类) │ ├── solver/ # ConstraintProvider 约束实现 │ └── rest/ # REST API 端点 ├── src/test/java/ # 测试用例 └── docker-run.sh # 一键容器启动脚本
第一次运行约 1-2 分钟(主要是 7 个 Agent 的 LLM 调用和 Docker 编译)。你可以看到每个 Agent 的输出日志,了解 pipeline 的进展。
实战场景 2:用自己的问题文件(进阶)
排课只是 Timefold 最经典的应用场景。VibeSolve 真正的能力在于——你可以写自己的问题描述,用纯文本文件提交给它。
创建一个 user_input/my-shift-scheduling.txt:
I run a small clinic with 5 doctors and 10 nurses. We open 8am to 8pm, 7 days a week. Each shift is 8 hours: morning (8-4), evening (4-12). A doctor must be present during all opening hours. At least 2 nurses per shift. No one works more than 5 days in a row. Weekend shifts are split equally among staff. Nurses prefer not to switch between morning and evening shifts on consecutive days.
然后运行:
vibesolve run user_input/my-shift-scheduling.txt
VibeSolve 的 Parser Agent 会先解析这段文字,提取出:
- 实体(Doctor、Nurse、Shift、Slot)
- 硬约束(必须有医生在场、每班至少 2 名护士)
- 软约束(连续两天不换班次)
- 数据范围(5 名医生、10 名护士、16 小时/天、7 天/周)
如果你想在代码生成前人工检查解析结果,使用 --user-validate 标志:
vibesolve run user_input/my-shift-scheduling.txt --user-validate
它会先输出一个 Plain-Language 的 ProblemSpec 摘要让你确认,确认无误后才进入后续 Agent 流程。这是我们实际使用中最实用的功能——避免 AI 误解你的意图。
实战场景 3:批量求解 + 结果服务化(完整方案)
真正生产环境中,你不会只解决一个问题——你可能需要为一周的每一天生成不同的排班方案,或者为一个部门生成排班后验证合理性。
VibeSolve 的 batch 命令支持批量处理 user_input/ 目录下的所有 .txt 文件:
ls user_input/ vibesolve batch --workers 5
加 --serve 标志还可以在生成的项目中包含 Dockerfile 和启动脚本,方便直接部署为 REST 服务:
vibesolve run user_input/standby-rotation.txt --serve
生成的 docker-run.sh 包含完整的容器启动命令,运行后即可通过 REST API 调用求解器:
POST /api/solve GET /api/solution
如果你想使用 Anthropic Claude 而非 OpenAI,只需传一个参数:
vibesolve run --provider claude
VibeSolve 的 config.yaml 中为每个 Agent 配置了独立的模型和推理强度——Parser 和 Model Builder 用轻量模型(gpt-5-mini),Fixer 用最强模型(gpt-5-mini,但配置 high reasoning effort),因为修复错误的推理复杂度最高。
最佳实践
- 先写约束再写实体:问题描述中,约束条件比实体定义更重要。VibeSolve 的 Parser Agent 对约束的描述更敏感,先列约束能让 Model Builder 生成更精确的领域模型。
- 使用
--user-validate调试:前几次运行建议加上这个标志。它像是一个”中间检查点”——在 AI 进入昂贵的代码生成阶段之前确认方向正确。避免生成 500 行代码后才发现”哦,它理解错了我的需求”。
- 描述要具体但要避免过度约束:Timefold 是优化求解器,不是规则引擎。为每个约束加”必须”会导致无解。使用”优先””尽量””如果可以”等软约束表述。VibeSolve 会把约束自动分类为 hard/medium/soft。
- Docker 镜像只需构建一次:首次运行时会自动构建验证镜像,后续运行直接复用。如果修改了 Dockerfile,手动
docker build -t timefold-validator docker/重建即可。
- 多 Provider 利用价格差:Parser 和 Model Builder 这类简单任务可以用 OpenAI 的 mini 模型(便宜快速);Fixer 等复杂推理任务切到 Claude 或使用
highreasoning effort。config.yaml支持每个 Agent 独立配置 provider 和模型。
总结
VibeSolve 把”约束求解”这件事的门槛降到了”你只要会写字”。它不是一个通用的代码生成器——它的定位非常精准:Plain English → Timefold 求解器项目。如果你的工作中涉及到排班、调度、路径规划、资源分配、装箱等优化问题,VibeSolve 是目前最直接的开源选择(MIT 许可)。15 分钟装好,20 行描述跑通第一个原型——这就是今天 AI 辅助开发的实际水平。
相关链接: