基于 LangGraph 的自动 Prompt 优化系统,使用 Flask 提供 Web 界面。
系统主界面包含以下功能模块:
- 数据集上传:支持 CSV、JSON、JSONL 格式
- Prompt 输入:输入原始 prompt,系统会自动优化
- 参数设置:
- 最大迭代轮次:设置优化迭代的上限(1-20 轮,默认 3)
- 验证阈值:设置验证改写的严格程度(0-100%,默认 50%)
- 50%:宽松模式,解决一半 badcase 即可接受(默认)
- 100%:严格模式,必须解决所有 badcase
- 遗传算法候选数量:每次改写生成 n 个不同版本的 prompt,系统会评估所有版本并选择最好的(1-10,默认 3)
- 1:不使用遗传算法,每次只生成一个版本
- 3-5:平衡效果和速度(推荐)
- 10:最大多样性,可能找到更好的 prompt,但耗时更长
- 实时日志:实时显示优化过程,包括预测、分析、改写、验证等各阶段信息
- 优化结果:优化完成后显示准确率指标、变化趋势图和优化后的 prompt
系统提供实时日志功能,通过 Server-Sent Events (SSE) 技术实时推送优化过程的详细信息:
- 实时更新:日志会随着优化进程实时滚动显示,无需刷新页面
- 结构化信息:每条日志包含时间戳、迭代轮次、执行阶段(预测、记忆、分析、改写、验证等)
- 彩色高亮:
- 迭代分隔线:每轮迭代之间有明显的分隔线标识
- 成功/错误标记:✓ 和 ✗ 符号高亮显示
- 数字和百分比:准确率、正确数等关键数据高亮显示
- 自动滚动:日志窗口会自动滚动到最新内容,方便查看最新进度
- 完整记录:记录整个优化过程的所有关键步骤,包括:
- 每轮预测的详细结果(每个样本的预测值和正确性)
- 验证过程的详细反馈(哪些 badcase 被解决,哪些未解决)
- 回滚和重新改写的情况
- 系统状态信息(history 记录、准确率统计等)
系统会显示完整的准确率变化折线图,包含所有迭代轮次的数据点,清晰展示优化过程中准确率的提升轨迹。图表支持交互式查看,可以直观地看到每轮迭代的准确率变化。
系统会自动优化 Prompt,左侧显示原始 Prompt,右侧显示优化后的 Prompt。如果最终准确率未达到 100%,系统会智能选择历史最高准确率对应的 prompt,并标注来源和轮次信息。
通过下拉框可以选择查看任意轮次的详细信息,包括:
- 该轮次的 Prompt
- 所有预测结果(正确/错误标记)
- 准确率统计
- 改进建议
历史记录会显示每轮 analyze 时的 prompt 和结果,如果发生回滚,最终被接受的 prompt 会在下一轮的 history 中记录。
系统会自动总结每次优化的经验,包括:
- 迭代轮次和准确率变化趋势(上升/下降)
- Prompt 的具体更改内容(通过 diff 展示)
- 详细的案例变化分析(改进、退化、预测改变但正确性不变)
- 后续优化方向的建议
- 可复用的优化原则
这些经验会形成可复用的知识库,供后续优化参考,并保存在独立的实验文件夹中。
- 📁 上传数据集文件(CSV/JSON/JSONL)
- ✍️ 输入原始 Prompt
- ⚙️ 设置最大迭代轮次、验证阈值和遗传算法候选数量
- 🤖 六个 Agent 协作优化:
- 预测 Agent: 根据数据集和当前 prompt 进行预测
- 记忆 Agent: 从 prompt 更改和准确率变化中总结经验,形成可复用的优化知识库
- 分析 Agent: 分析错误案例并给出修改意见
- 改写 Agent: 根据分析结果和历史经验改写 Prompt,支持生成多个候选版本(遗传算法)
- 验证 Agent: 验证改写后的 prompt 是否能解决目标 badcase,评估所有候选版本并选择最好的
- 杂交 Agent: 如果有两个或以上通过验证的候选,融合最强的两个生成杂交 prompt
- 🧬 遗传算法机制:每次改写生成多个候选版本,评估后选择最好的进入下一轮
- 🔀 杂交机制:融合两个最强候选的优势,生成更好的 prompt
- 🔄 自动循环优化直到达到最大迭代次数或所有预测正确
- 🧠 智能记忆机制:每次优化都会总结通用经验,并应用于后续优化过程
- 📂 实验隔离:每次任务自动创建独立的实验文件夹,不同任务互不干扰
系统使用 LangGraph 构建了一个状态机工作流,每轮迭代的执行顺序如下:
开始
↓
[预测 Agent] → 使用当前 prompt 对数据集进行预测
↓
[记忆 Agent] → 对比本轮与上轮的 prompt 差异、准确率变化和案例变化,总结优化经验
↓
[分析 Agent] → 分析当前预测结果的错误案例,给出改进建议
↓
判断是否有错误?
├─ 所有预测正确 → 结束,返回优化后的 prompt
└─ 有错误 → 继续
↓
[改写 Agent] → 根据分析建议和历史经验改写 prompt
├─ 生成 n 个候选版本(遗传算法,默认 3 个)
└─ 使用不同 temperature 增加多样性
↓
[验证 Agent] → 评估所有候选版本
├─ 对每个候选版本进行验证
├─ 选择最好的一个(优先选择通过验证的,否则选择解决率最高的)
└─ 记录所有通过验证的候选(用于杂交)
↓
判断验证结果?
├─ 接受(至少有一个通过验证)→ [杂交 Agent]
│ ├─ 如果有 >=2 个通过验证的候选:
│ │ ├─ 融合最强的两个生成杂交 prompt
│ │ ├─ 验证杂交 prompt
│ │ └─ 对比杂交 prompt 和父代,选择更好的进入下一轮
│ └─ 如果只有 1 个通过验证的候选:跳过杂交,直接进入下一轮
│ ↓
│ 判断是否继续迭代
│ ├─ 继续迭代(未达上限)→ 增加迭代次数 → 回到预测 Agent
│ └─ 达到最大迭代次数 → [最终验证] → 使用最终优化后的 prompt 进行最后一次预测 → 结束
└─ 拒绝(所有候选都未通过验证)→ 回滚 prompt → 重新分析 → 回到改写 Agent
- 预测阶段:使用当前 prompt 对数据集中的所有样本进行预测
- 记忆阶段(从第二轮开始):对比本轮与上一轮的 prompt、准确率和具体案例变化,生成可复用的优化经验
- 分析阶段:分析当前预测结果中的错误案例,识别问题并给出改进建议
- 改写阶段(遗传算法):
- 结合分析建议和历史优化经验,生成 n 个候选版本的 prompt(默认 3 个)
- 使用不同的 temperature(0.5-1.2)增加多样性
- 每个候选版本都是独立的优化尝试
- 验证阶段:
- 对所有候选版本进行评估
- 选择策略:优先选择通过验证的候选中解决率最高的;如果没有通过验证的,选择解决率最高的
- 记录所有通过验证的候选(用于后续杂交)
- 接受条件:解决率 >= 验证阈值(默认 50%)
- 拒绝处理:如果所有候选都未通过验证,回滚到改写前的 prompt,重新分析并改写
- 杂交阶段(Crossover):
- 如果有两个或以上通过验证的候选,执行杂交:
- 融合最强的两个候选的优势
- 生成杂交 prompt
- 验证杂交 prompt
- 对比杂交 prompt 和父代(最强的候选),选择解决率更高的进入下一轮
- 如果只有一个通过验证的候选,跳过杂交,直接进入下一轮
- 如果有两个或以上通过验证的候选,执行杂交:
- 终止条件:
- 所有预测都正确:直接结束,返回当前优化后的 prompt
- 达到最大迭代次数:会执行一次
final_predict节点,使用最终优化后的 prompt 进行验证,然后结束 - 智能选择:如果最终准确率未达到 100%,系统会自动返回历史最高准确率对应的 prompt
系统引入了 Verifier Agent(验证 Agent),确保改写的 prompt 真正有效:
- 验证时机:每次改写完成后,在进入下一轮迭代之前
- 验证目标:使用新 prompt 对上一轮预测中的 badcase(错误案例)进行验证
- 多候选评估:当使用遗传算法时,会对所有候选版本进行评估,选择最好的一个
- 接受标准:解决率 >= 验证阈值(默认 50%),否则拒绝此次改写
- 拒绝处理:
- 回滚到改写前的 prompt(基于回滚后的 prompt 重新改写,而不是最原始的 prompt)
- 将验证反馈信息传递给分析 Agent
- 重新分析错误案例(结合验证反馈)
- 重新改写 prompt(生成新的候选版本)
- 优势:避免无效的改写进入下一轮,确保每轮迭代都基于有效的 prompt
系统引入了 遗传算法(Genetic Algorithm),通过生成多个候选版本并选择最好的来提升优化效果:
- 候选生成:每次改写时,Rewrite Agent 会生成 n 个不同版本的 prompt(默认 3 个)
- 多样性策略:使用不同的 temperature(0.5-1.2)来增加候选版本的多样性
- 评估选择:Verifier Agent 评估所有候选版本,选择最好的一个进入下一轮
- 选择策略:
- 优先选择通过验证的候选中解决率最高的
- 如果没有通过验证的候选,选择解决率最高的
- 优势:通过探索多个优化方向,提高找到更好 prompt 的概率
系统引入了 Crossover Agent(杂交 Agent),融合两个最强候选的优势:
- 触发条件:当有两个或以上通过验证的候选时,自动触发杂交
- 杂交过程:
- 选择最强的两个通过验证的候选
- 分析两个候选各自解决的 badcase
- 融合两个候选的优势,生成杂交 prompt
- 验证对比:
- 对杂交 prompt 进行验证
- 对比杂交 prompt 和父代(最强的候选)的解决率
- 选择解决率更高的进入下一轮
- 优势:通过融合多个优秀候选的特点,可能生成更好的 prompt
系统引入了 Memory Agent(记忆 Agent),它在每轮迭代的预测之后立即执行:
- 执行时机:在预测完成后、分析之前执行,确保能够对比当前轮次与上一轮次的完整预测结果
- 对比逻辑:对比上一轮使用的 prompt 与当前轮使用的 prompt(即上一轮 rewrite 的结果)、两轮的准确率变化、以及具体案例的预测变化
- 总结经验:分析 prompt 的更改内容(通过 diff 展示)、准确率变化趋势、具体案例的变化情况(改进、退化、预测改变但正确性不变)
- 生成经验文档:将总结的经验追加保存到独立的实验文件夹中
- 应用经验:在后续的改写过程中,Rewrite Agent 会读取并参考这些历史经验来优化 prompt
经验总结包含:
- 📊 迭代轮次和准确率变化趋势(上升/下降)
- 📝 Prompt 的具体更改内容(通过 diff 展示)
- 🎯 详细的案例变化分析:
- 哪些案例从错误变正确(改进)
- 哪些案例从正确变错误(退化)
- 哪些案例预测内容改变但正确性不变
- 💡 后续优化方向的建议
- 🔑 可复用的优化原则
实验隔离:
- 每次优化任务会自动生成唯一的
experiment_id - 每个任务的经验文件保存在
experiments/{experiment_id}/memory_experiences.txt - 不同任务之间的经验互不干扰,便于对比和管理
注意:
- Memory Agent 在第一次迭代时不会执行(因为没有上一轮的数据可对比)
- 从第二次迭代开始,每次预测完成后都会总结经验
- 达到最大迭代次数时,会执行
final_predict节点对最终优化后的 prompt 进行验证
-
克隆或下载项目
-
创建虚拟环境(推荐使用 conda):
conda create -y python=3.10 -n AutoPrompt
conda activate AutoPrompt- 安装依赖:
pip install -r requirements.txt注意:如果使用其他虚拟环境工具(如 venv),也可以:
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt本项目支持两种 LLM 服务,你只需要配置其中一种:
- OpenAI(标准 OpenAI API)
- Azure OpenAI(Azure 上的 OpenAI 服务)
使用 .env 文件(推荐):
- 复制示例配置文件:
cp .env.example .env- 编辑
.env文件,将your_openai_api_key_here替换为你的实际 API Key:
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
获取 API Key:
- 访问 https://platform.openai.com/api-keys
- 登录你的 OpenAI 账号
- 点击 "Create new secret key" 创建新的 API Key
- 复制生成的 Key(只显示一次,请妥善保存)
使用 .env 文件(推荐):
- 复制示例配置文件:
cp .env.example .env- 编辑
.env文件,取消注释 Azure OpenAI 相关配置,并填入你的实际值:
AZURE_OPENAI_API_KEY=你的Azure_API密钥
AZURE_OPENAI_ENDPOINT=https://your-resource-name.openai.azure.com/
AZURE_OPENAI_DEPLOYMENT_NAME=你的部署名称(如 gpt-35-turbo)
AZURE_OPENAI_API_VERSION=2024-02-15-preview
获取 Azure OpenAI 配置信息:
- 在 Azure Portal 中,进入你的 Azure OpenAI 资源
- 在 "Keys and Endpoint" 页面可以找到 API Key 和 Endpoint
- 在 "Deployments" 页面可以看到部署名称
注意:
- 如果同时配置了 OpenAI 和 Azure OpenAI,系统会优先使用 Azure OpenAI
- 详细配置说明请查看 CONFIG.md
python app.py-
上传数据集
- 支持 CSV、JSON、JSONL 格式
- CSV 文件应包含
input和ground_truth列(或类似名称) - JSON/JSONL 文件应包含
input和ground_truth字段 - 💡 快速测试:可以直接使用项目中的
example_data/example_dataset.csv
-
输入原始 Prompt
- 在文本框中输入你的初始 prompt
- Prompt 应该描述任务要求和期望的输出格式
- 💡 快速测试:可以复制
example_data/example_prompt.txt中的内容
-
设置参数
- 最大迭代轮次:设置优化迭代的上限(1-20,默认 3)
- 验证阈值:设置验证改写的严格程度(0-100%,默认 50%)
- 50%:宽松模式,解决一半 badcase 即可接受(默认)
- 100%:严格模式,必须解决所有 badcase
- 遗传算法候选数量:每次改写生成 n 个候选版本(1-10,默认 3)
- 1:不使用遗传算法
- 3-5:平衡效果和速度(推荐)
- 10:最大多样性,可能找到更好的 prompt,但耗时更长
- 点击"开始优化"按钮
-
查看结果
- 系统会自动进行多轮优化
- 显示准确率变化折线图(包含所有轮次的数据点)
- 显示最终优化后的 prompt(与原始 prompt 对比)
- 如果最终准确率未达到 100%,系统会自动选择历史最高准确率对应的 prompt
- 前端会标注 prompt 的来源(最终轮次或历史最高准确率)和对应的轮次
- 显示累积的优化经验(Memory Agent 总结的经验)
- 通过下拉框查看每轮迭代的详细结果(prompt、预测结果、改进建议)
- 实时日志窗口显示优化过程的详细信息,包括验证结果和回滚情况
- 系统会返回
experiment_id,可用于追踪本次实验
-
查看经验文件
- 每次任务的经验总结保存在
experiments/{experiment_id}/memory_experiences.txt - 经验文件包含了详细的优化过程记录和通用原则
- 可以在前端界面直接查看累积的经验内容
- 每次任务的经验总结保存在
项目提供了示例数据在 example_data/ 目录中,你可以直接使用它们进行测试。
example_data/example_dataset.csv 是一个文本分类任务的数据集:
itemId Headline Typography
jxMuJYMZn7BCIg Daily life in RAJASTHAN, INDIA 🇮🇳- CITY vs RURAL 1
BB1pyNbo Review: INSANE 8-across Business Class on United's 777-200 1
AA1oW3oj 10 of the Coolest Cars Ever Made & 10 That Nobody Cares About 0
AA1okiqu BLACK FOREST Mega Cake!! _ How To Cake It 1说明:
Headline列会被自动识别为输入列Typography列会被自动识别为标准答案列(0 或 1)itemId列会被保留但不参与预测
[
{
"input": "Daily life in RAJASTHAN, INDIA 🇮🇳- CITY vs RURAL",
"ground_truth": "1"
},
{
"input": "10 of the Coolest Cars Ever Made & 10 That Nobody Cares About",
"ground_truth": "0"
}
]{"input": "Daily life in RAJASTHAN, INDIA 🇮🇳- CITY vs RURAL", "ground_truth": "1"}
{"input": "10 of the Coolest Cars Ever Made & 10 That Nobody Cares About", "ground_truth": "0"}autoprompt-langgraph/
├── app.py # Flask 主应用
├── graph.py # LangGraph 工作流
├── utils.py # 工具函数(文件处理、数据加载)
├── agents/ # Agent 模块
│ ├── __init__.py # 模块初始化
│ ├── prediction_agent.py # 预测 Agent
│ ├── analysis_agent.py # 分析 Agent
│ ├── rewrite_agent.py # 改写 Agent(支持生成多个候选版本)
│ ├── memory_agent.py # 记忆 Agent(总结经验)
│ ├── verifier_agent.py # 验证 Agent(验证改写效果)
│ └── crossover_agent.py # 杂交 Agent(融合两个最强候选)
├── templates/ # HTML 模板
│ └── index.html # 主页面
├── static/ # 静态文件
│ ├── style.css # 样式文件
│ └── script.js # 前端脚本
├── docs/ # 文档目录
│ └── images/ # 图片资源
│ ├── image.png # 系统主界面截图
│ ├── image2.png # Prompt 对比图
│ └── image3.png # 优化历史详情图
├── experiments/ # 实验数据目录(自动创建)
│ └── {experiment_id}/ # 每次任务的独立文件夹
│ └── memory_experiences.txt # 经验总结文件
├── uploads/ # 上传文件目录(自动创建)
├── example_data/ # 示例数据目录
│ ├── example_dataset.csv # 示例数据集
│ └── example_prompt.txt # 示例 prompt
├── .env.example # 环境变量配置示例文件
├── requirements.txt # 依赖包
└── README.md # 说明文档
- LangGraph: 构建工作流图
- LangChain: LLM 调用和 Prompt 管理
- Flask: Web 框架
- OpenAI API: LLM 服务
- 需要有效的 OpenAI API Key(或 Azure OpenAI 配置)
- 优化过程可能需要较长时间,取决于数据集大小和迭代次数
- 建议先用小数据集测试
- 确保数据集包含
ground_truth字段用于评估 - 每次任务的经验文件会保存在
experiments/目录下,目录会自动创建 - Memory Agent 会在第二次迭代及以后才开始总结经验(第一次迭代没有历史数据可对比)
- 达到最大迭代次数时,系统会对最终优化后的 prompt 执行一次验证预测(
final_predict),确保返回的是最终版本的准确结果 - 系统内部设置了足够的递归限制,避免在迭代过程中出现递归限制错误
- 验证机制:每次改写后必须通过验证(解决率 >= 验证阈值,默认 50%)才会进入下一轮,否则会回滚并重新改写
- 遗传算法:默认生成 3 个候选版本,系统会评估所有版本并选择最好的。可以通过参数调整候选数量(1-10)
- 杂交机制:当有两个或以上通过验证的候选时,会自动融合最强的两个生成杂交 prompt,并选择更好的进入下一轮
- 重新改写逻辑:如果验证失败,重新改写时基于回滚后的 prompt(即上一轮被接受的 prompt),而不是最原始的 prompt
- 智能选择:如果最终准确率未达到 100%,系统会自动返回历史最高准确率对应的 prompt,并在前端标注来源
- 历史记录:每轮迭代的 history 记录的是该轮 analyze 时的 prompt 和结果,如果发生回滚,最终被接受的 prompt 会在下一轮的 history 中记录
项目提供了示例 prompt 在 example_data/example_prompt.txt,这是一个文本分类任务的 prompt:
你是一个文本分类专家。你的任务是根据新闻标题headline预测其 Typography 类别是否为标题党
输入:一个新闻标题
输出:0 或 1(只返回数字,不要包含其他文字, 1 为标题党)
请仔细分析标题的内容、风格和特征,然后给出分类结果。
使用示例数据测试:
- 上传
example_data/example_dataset.csv作为数据集 - 复制
example_data/example_prompt.txt中的内容作为原始 prompt - 设置参数(默认值已优化):
- 最大迭代轮次:3(默认)
- 验证阈值:50%(默认)
- 遗传算法候选数量:3(默认)
- 点击"开始优化"进行测试
MIT License





