Prompt Optimizer 通过 Worker-Master 双模型架构,迭代式地分析分类错误、改写 Prompt,逐步提升 Prompt 在目标任务上的准确率。无需手动调 Prompt,无需训练模型。
┌─────────────────┐
│ 标注数据 CSV │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Train/Val 抽样 │ 每轮随机抽样,不重叠
└────────┬────────┘
│
┌──────────────┴──────────────┐
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Worker 预测 │ │ Worker 预测 │
│ (Train 集) │ │ (Val 集) │
└────────┬────────┘ └────────┬────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ 收集错误样本 │ │ 计算 Val Score │
└────────┬────────┘ └────────┬────────┘
│ │
└──────────────┬───────────────┘
│
▼
┌────────────────────┐
│ Master 分析错误 │ 直接基于原始错误样本
│ + 增量改写 Prompt │ 一步完成,无中间层
└─────────┬──────────┘
│
▼
┌──────────────────┐
│ Val Score 提升? │
└────────┬─────────┘
是 / \ 否
▼ ▼
保留新 Prompt 回滚到 Best Prompt
│ │
└────┬─────┘
│
▼
┌──────────────────────────┐
│ Git Commit + results.tsv │ 记录每轮结果
└──────────┬───────────────┘
│
▼
┌──────────────────┐
│ 继续迭代 / │
│ Early Stop / │
│ 达到最大轮数 │
└──────────────────┘
关键设计:
- Train/Val 随机抽样 — 每轮从全量数据随机抽取不重叠的 train/val 样本
- 原始错误驱动 — 直接把原始错误样本喂给 Master,一步完成分析+改写,无二次转述损失
- 增量改写 — Master 只做小幅修改,保留已有效的规则,避免推倒重来
- 多指标评估 — 同时计算 Accuracy、F1(macro)、Precision、Recall,支持选择主指标
- 多数投票 — 同一 query 可跑多次取多数票,减少 LLM 输出随机性
- 自动回滚 — Val score 下降时回滚到最优 Prompt,在 best 基础上继续优化
- Git 集成 — 每轮自动 commit prompt 文件,方便回溯任何历史版本
- 结构化记录 —
results.tsv记录每轮指标,可程序化分析 - Early Stop — 连续 N 轮无提升则自动停止,节省 API 调用
- 异常重试 — LLM 调用失败自动指数退避重试
| 模式 | 说明 | 示例 |
|---|---|---|
| classify | 单文本分类,Worker 直接输出标签 | 情感分析、意图识别、内容审核 |
| judge | 多字段评测,Worker 对比多个输入字段后输出判定 | RAG 问答质量评测、翻译质量评测 |
git clone https://github.com/shibing624/prompt-optimizer.git
cd prompt-optimizer
pip install -r requirements.txtcp .env.example .env编辑 .env,填入 API Key 和模型配置:
# Worker 模型(执行分类/评测任务,推荐用快速且便宜的模型)
WORKER_API_KEY=your_worker_api_key
WORKER_BASE_URL=https://api.openai.com/v1
WORKER_MODEL_NAME=gpt-4o-mini
# Master 模型(分析错误 + 改写 prompt,推荐用更强的模型)
MASTER_API_KEY=your_master_api_key
MASTER_BASE_URL=https://api.openai.com/v1
MASTER_MODEL_NAME=gpt-4o支持任何兼容 OpenAI API 格式的模型服务(OpenAI、Azure、DeepSeek、本地部署等)。
项目自带两个示例,可以直接运行:
示例 1:情感分类(classify 模式)
# 复制示例数据和 prompt 到根目录
cp examples/classify/data.csv data.csv
cp examples/classify/prompt.md prompt.md
# 运行(默认配置即为 classify 模式)
python run.py --iterations 3 --train-sample-size 20 --val-sample-size 10示例 2:RAG 问答评测(judge 模式)
# 复制示例数据和 prompt
cp examples/judge/data.csv data.csv
cp examples/judge/prompt.md prompt.md然后修改 prepare.py 中的数据格式配置(可直接参考 examples/judge/prepare.py):
TASK_TYPE = "judge"
TEXT_COLUMNS = ["knowledge", "question", "answer"]
LABEL_COLUMN = "label"
LABEL_MAP = {"正确": "正确", "错误": "错误", "无效": "无效"}
LABEL_DESCRIPTIONS = {
"正确": "模型答案基于知识片段正确回答了问题",
"错误": "知识片段与问题相关,但模型答案存在关键错误",
"无效": "知识片段与问题不相关,无法据此判断答案质量",
}
PROMPT_VARIABLES = {
"knowledge": "knowledge",
"question": "question",
"answer": "answer",
}python run.py --iterations 3 --train-sample-size 10 --val-sample-size 5- 准备 CSV 格式的标注数据文件
data.csv - 修改
prepare.py中的数据格式配置(TEXT_COLUMNS、LABEL_COLUMN、LABEL_MAP等) - 编写初始 Prompt 到
prompt.md(classify 模式用{{query}}占位符,judge 模式用自定义变量占位符) - 运行
python run.py
python run.py --iterations 10 --patience 3 --metric f1 --vote-count 3 --concurrency 20所有参数均可通过命令行覆盖 prepare.py 中的默认值。
在 prepare.py 中可调整以下参数:
| 参数 | 默认值 | CLI 参数 | 说明 |
|---|---|---|---|
TASK_TYPE |
classify | --task-type |
任务模式(classify / judge) |
ITERATIONS |
5 | --iterations |
优化迭代轮数 |
TRAIN_SAMPLE_SIZE |
200 | --train-sample-size |
每轮 train 抽样条数 |
VAL_SAMPLE_SIZE |
100 | --val-sample-size |
每轮 valid 抽样条数 |
CONCURRENCY |
10 | --concurrency |
LLM 请求并发数 |
PATIENCE |
2 | --patience |
连续 N 轮无提升则 early stop |
VOTE_COUNT |
1 | --vote-count |
多数投票次数(1=不投票,3/5=投票) |
PRIMARY_METRIC |
f1 | --metric |
主评估指标(accuracy/f1/precision/recall) |
MAX_RETRIES |
3 | — | LLM 调用失败时的最大重试次数 |
数据格式配置(在 prepare.py 中修改):
| 参数 | 说明 |
|---|---|
TEXT_COLUMNS |
CSV 中用于构建 prompt 的列名列表 |
LABEL_COLUMN |
CSV 中标签列名 |
LABEL_MAP |
CSV 标签值 → 模型输出值的映射 |
LABEL_DESCRIPTIONS |
模型输出值 → 可读描述 |
PROMPT_VARIABLES |
Prompt 模板变量 → CSV 列名映射(仅 judge 模式) |
Worker 和 Master 均支持 THINKING 参数(enabled / disabled / auto),用于控制模型的思考模式。
prompt-optimizer/
├── prepare.py # 配置文件(模型、数据格式、实验参数、CLI 解析)
├── run.py # 主程序(优化循环)
├── prompt.md # Prompt 文件(自动更新)
├── research_log.md # 实验日志(自动生成)
├── examples/
│ ├── classify/ # 情感分类示例
│ │ ├── data.csv # 30 条标注数据
│ │ ├── prompt.md # 初始 prompt
│ │ └── prepare.py # 配置参考
│ └── judge/ # RAG 问答评测示例
│ ├── data.csv # 15 条标注数据
│ ├── prompt.md # 初始 prompt
│ └── prepare.py # 配置参考
├── requirements.txt # Python 依赖
├── .env.example # 环境变量示例
└── LICENSE # Apache 2.0
| 文件 | 说明 |
|---|---|
prompt.md |
最优 Prompt(每轮自动更新) |
results.tsv |
结构化实验结果(每轮 train/val 指标) |
research_log.md |
完整实验日志(prompt + 指标 + 错误分析) |
| Git 历史 | 每轮自动 commit,可 git log 查看 prompt 演化 |
本工具适用于任何可以用 LLM + Prompt 解决的分类/评测任务,例如:
- 情感分析(positive / negative)
- 意图识别(事实类 / 非事实类)
- 内容审核(合规 / 违规)
- 主题分类
- RAG 问答质量评测(正确 / 错误 / 无效)
- 翻译质量评测
只需修改 prepare.py 中的配置和 data.csv 即可适配不同任务。
- GitHub Issues — 提交 issue
- 微信群 — 添加微信号
xuming624,备注 "nlp",加入技术交流群
如果您在研究中使用了 Prompt Optimizer,请引用:
@software{xu2026promptoptimizer,
author = {Xu, Ming},
title = {Prompt Optimizer: Automatic LLM Prompt Optimization with Labeled Data},
year = {2026},
publisher = {GitHub},
url = {https://github.com/shibing624/prompt-optimizer}
}欢迎贡献!请提交 Pull Request。
