通过拆解"COPT 线性规划 Skill",你将掌握:
- Skill 的核心组成:一份好的 Skill 包含哪些文件?
- 设计流程:从需求分析到落地实现
- 关键决策点:何时提问?何时假设?边界在哪里?
- 最佳实践:如何让 Skill 既专业又易用?
Skill = 一个让 AI 能够专业、可靠地解决某一类数学问题的"能力包"
它包含:
- 领域知识:如何建模、如何求解、如何解释
- 工具链:调用哪些求解器/库
- 交互规范:如何与用户沟通、何时提问
- 边界意识:知道能做什么、不能做什么
| 场景 | 没有 Skill | 有 Skill |
|---|---|---|
| 用户提问模糊 | AI 可能胡乱猜测 | AI 知道如何澄清 |
| 涉及专业工具 | AI 可能不会调用 | AI 按规范调用求解器 |
| 结果需要解释 | AI 只给数字 | AI 给出业务含义 |
| 超出范围的问题 | AI 可能硬撑 | AI 明确告知边界 |
┌─────────────────────────────────────────────────────────┐
│ 需求分析 │
│ • 解决什么问题? • 目标用户是谁? • 输入输出是什么? │
└────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 能力边界定义 │
│ • 能做什么? • 不能做什么? • 何时需要澄清? │
└────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 技术选型 │
│ • 选用什么求解器/库? • 如何集成? • 依赖是什么? │
└────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 交互设计 │
│ • 处理哪些输入形式? • 输出模板是什么? • 歧义如何处理? │
└────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 文档与示例 │
│ • README • 参考示例 • 快速上手指南 │
└─────────────────────────────────────────────────────────┘
Q1:解决什么问题?
帮助用户求解线性规划(LP)问题
Q2:目标用户是谁?
- 运筹学学生:做作业、学习建模
- 业务分析师:生产计划、资源分配
- 研究者:快速验证想法
Q3:输入输出是什么?
- 输入:自然语言描述 或 矩阵/JSON 格式
- 输出:求解状态、最优值、变量取值、结果解释
能做什么(In Scope):
✅ 连续变量的线性规划(LP)
✅ 最大化或最小化目标
✅ 线性不等式约束(≤)
✅ 线性等式约束(=)
✅ 变量上下界
不能做什么(Out of Scope):
❌ 整数规划(需要 MILP)
❌ 非线性目标(如 x₁·x₂)
❌ 逻辑蕴含(需要 Big-M 建模)
❌ 随机规划
关键决策:
当用户提出整数问题时,明确告知超出范围,而不是偷偷松弛成连续变量求解。
求解器选择:
| 候选 | 优势 | 劣势 |
|---|---|---|
| COPT | 国产、免费学术授权、Python 接口友好 | 需要配置 License |
| Gurobi | 业界标准 | 学术授权申请流程 |
| CBC | 完全开源 | 性能较弱 |
| scipy.optimize | 无需额外安装 | 功能受限、文档混乱 |
最终选择:COPT(兼顾性能与可获取性)
依赖管理:
import coptpy as cp
from coptpy import COPT
import numpy as np 用户输入
│
┌────────────┴────────────┐
│ │
▼ ▼
┌─────────┐ ┌─────────────┐
│ 自然语言 │ │ 矩阵/JSON │
└────┬────┘ └──────┬──────┘
│ │
▼ │
┌─────────────┐ │
│ 1. 重述题意 │ │
│ 2. 符号化 │ │
│ 3. 数值化 │ ────────────────┘
│ 4. 求解 │
│ 5. 解释结果 │
└──────┬──────┘
│
▼
输出结果
### 问题重述
...
### 符号化模型
- 决策变量:...
- 目标函数:...
- 约束:...
### 数值化(可选)
- c: ...
- A_ub / b_ub: ...
### 求解结果
- status: ...
- objective: ...
- x: ...
### 结果解释
...| 歧义点 | 处理方式 |
|---|---|
| 目标是 max 还是 min? | 提问或根据上下文推断(利润→max,成本→min) |
| "不超过"是≤还是≥? | 明确规则:"不超过"=≤,"不少于"=≥ |
| 是否允许分数解? | 默认连续 LP;若明确整数要求→告知超出范围 |
| 非负约束? | 物理量默认≥0,但需在变量表中写明假设 |
copt-linear-program/
├── SKILL.md # Skill 说明书(核心文档)
├── scripts/
│ └── solve_lp.py # 求解器封装脚本
└── reference/
├── matrix-json-examples.md # 矩阵格式示例
└── natural-language-examples.md # 自然语言示例
| 文件 | 读者 | 内容 |
|---|---|---|
SKILL.md |
AI + 用户 | 技能使用说明、交互规范、边界定义 |
scripts/solve_lp.py |
开发者 | 实际求解逻辑 |
reference/*.md |
用户 + AI | 示例库,供 Few-shot 学习 |
# 标题:一句话说明这个 Skill 做什么
## 适用场景
- 列举 3-5 类典型问题
- 给出简短例子
## Quick Start(先做这个)
- 一个检查清单,AI 按步骤执行
## 执行流程
- 路径判断:用户给的是什么类型输入?
- 流程图:不同输入走不同分支
## 输出模板
- AI 回答的标准格式
## 歧义与澄清
- 何时提问?何时假设?
- 常见歧义列表及处理策略
## 范围与边界
- 能做什么
- 不能做什么
- 超出范围时如何告知用户
## 技术细节
- 依赖
- 接口说明
- 错误处理
## 示例
- 端到端示例(输入→输出)设计点 1:路径判断
用户输入可能是自然语言,也可能是矩阵。不要默认要求用户先整理成矩阵——这是反用户的。
设计点 2:输出模板
统一输出格式让 AI 的回答结构清晰、可预测。
设计点 3:边界声明
明确写出"不能做什么"比什么都重要。AI 需要知道何时说"这个我做不了"。
设计点 4:错误解释
求解失败时,给出可操作的诊断:
INFEASIBLE→ 约束矛盾,检查不等号方向UNBOUNDED→ 缺少必要约束,检查是否漏了非负