AutoPE (Automatic Prompt Engineering) 是一个基于 多智能体博弈 的提示词自动优化框架。系统通过模拟 客服(Seller) 与 消费者(Buyer) 的对话,由 评审团(Judge Panel) 评分,再由 策略优化器(Optimizer) 迭代改进客服的提示词策略。
核心思路:不靠人工调 prompt,而是让 AI 自己在对话博弈中进化出更好的 prompt。
┌─────────────────────────────────────────────────────┐
│ OptimizationLoop │
│ (autope/core/optimization_loop.py) │
│ │
│ ┌──────────┐ 对话 ┌──────────┐ │
│ │ Buyer │◄──────────►│ Seller │ │
│ │ Agent │ │ Agent │ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ │ 用户画像 │ 产品知识库 + 可变策略 │
│ │ (user_profiles) │ (knowledge_base) │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────────────┐ │
│ │ Judge Panel (3位评审) │ │
│ │ 专业度 │ 服务质量 │ 销售转化 │ │
│ └──────────────┬──────────────────┘ │
│ │ 评分 + 反馈 │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ Optimizer Agent │ │
│ │ (策略优化器) │──► 生成新策略 ──► 下一轮 │
│ └──────────────────────┘ │
└─────────────────────────────────────────────────────┘
- Buyer 发言 — 根据用户画像,模拟消费者的自然反应
- Seller 回复 — 根据产品知识库 + 当前策略,给出客服回复
- 状态判断 — LLM 判断对话是否结束(success/fail/end/continue)
- 重复 1-3 直到对话结束(或达到最大轮次)
- Judge 评分 — 3 位评审从不同角度打分(0-10)
- Optimizer 优化 — 每 3 轮根据评分反馈迭代更新客服策略
AutoPE/
├── run_autope.py # 入口脚本
├── autope/
│ ├── config.py # 配置(API Key、模型参数)
│ ├── llm.py # Gemini API 调用封装
│ ├── models.py # 数据结构(UserProfile, SimulationResult)
│ ├── agents/
│ │ ├── user_agent.py # Buyer 智能体
│ │ ├── sales_agent.py # Seller 智能体
│ │ ├── judge_agent.py # Judge 评审 + JudgePanel
│ │ └── optimizer_agent.py # Optimizer 策略优化器
│ ├── core/
│ │ └── optimization_loop.py # 主循环(编排所有 Agent)
│ └── prompts/
│ ├── prompt_loader.py # 所有 Prompt 模板(核心)
│ └── judge_prompts.py # Judge prompt 加载
├── data/
│ ├── business_knowledge_base.json # 产品知识库(客服的知识来源)
│ └── user_profiles.json # 用户画像(消费者角色数据)
├── utils/ # 数据转换工具(辅助)
├── analyze.py # 实验结果分析脚本
└── *.md # Prompt 的可读版本(参考用)
| 模块 | 文件 | 职责 |
|---|---|---|
| Buyer Agent | agents/user_agent.py |
模拟消费者,基于画像生成自然对话 |
| Seller Agent | agents/sales_agent.py |
模拟客服,基于知识库+策略推荐产品 |
| Judge Panel | agents/judge_agent.py |
3 位评审打分(专业度/服务/转化) |
| Optimizer | agents/optimizer_agent.py |
参考评分+历史最佳策略,生成新策略 |
| Loop | core/optimization_loop.py |
编排上述 Agent,管理实验数据持久化 |
| Prompts | prompts/prompt_loader.py |
所有 Prompt 模板的唯一来源 |
| LLM | llm.py |
Gemini API 调用(JSON 输出模式) |
# Python 3.10+
pip install google-genai# Linux / macOS
export GEMINI_API_KEY="your-api-key-here"
# Windows PowerShell
$env:GEMINI_API_KEY = "your-api-key-here"或直接在 autope/config.py 中修改:
API_KEY = "your-api-key-here"python run_autope.py运行后会在 exp_history/run_<时间戳>/ 下生成:
| 文件 | 内容 |
|---|---|
rounds.jsonl |
每轮完整记录(对话、评分、策略) |
qa_pairs.jsonl |
每个对话 turn 的详细数据 |
strategy_history.jsonl |
策略演化历史 |
detailed_logs.jsonl |
全量日志 |
用 analyze.py 分析结果:
# 修改 analyze.py 中的 base 变量指向目标实验目录
python analyze.py=== Round 1 Start ===
[对话状态判断] continue | 客户还在了解阶段
[对话状态判断] continue | 客户在询问价格
[对话状态判断] success | 客户表示愿意下单
分数: 7.33 | 用户ID: 1 | 结果: success
评价: judge_1:推荐方向正确,但可以更深入 | judge_2:服务态度好 | judge_3:成交但过程可以更自然
=== Round 2 Start ===
[对话状态判断] continue | 双方还在交流
[对话状态判断] end | 对话自然结束
分数: 5.67 | 用户ID: 2 | 结果: end
评价: judge_1:推荐缺乏针对性 | judge_2:节奏太快 | judge_3:未推进到决策阶段
=== Round 3 Start ===
...
分数: 6.50 | 用户ID: 3 | 结果: success
执行策略优化...
策略已更新
初始策略(Round 1-3):
- 礼貌开场,了解客户的使用场景和预算。
- 不要一次推荐太多产品,先聚焦客户最关心的需求。
优化后策略(Round 4+):
- 开场先确认客户身份和使用场景,不急于推荐。
- 针对客户提到的具体痛点,从知识库中精准匹配1-2款产品。
- 用对比方式帮客户理解不同产品的差异,而不是单方面推销。
- 客户犹豫时,主动提供试用体验或无理由退换的信息降低决策风险。
在 autope/config.py 中调整:
| 参数 | 默认值 | 说明 |
|---|---|---|
MODEL_NAME |
gemini-3-flash-preview |
LLM 模型 |
TEMPERATURE |
0.8 |
生成温度 |
MAX_OUTPUT_TOKENS |
2000 |
最大输出 token |
DEFAULT_MAX_TURNS |
20 |
单轮对话最大 turn 数 |
DEFAULT_REPEAT_TIMES |
3 |
每个用户画像重复次数 |
DEFAULT_USER_LIMIT |
20 |
使用的用户画像数量上限 |
编辑 data/user_profiles.json,保持以下结构:
{
"user_id": 1,
"full_profile": {
"人口信息": { "姓名": "...", "职业": "...", ... },
"心理特征": { "性格": "...", ... },
"动态特征": { "使用经历": "...", "产品需求": "...", ... }
},
"seller_view": {
"known_info": { "人口信息": { ... } },
"inferred_profile": {
"心理特征": { "性格": "Unknown", ... },
"动态特征": { "使用经历": "Unknown", ... }
}
}
}
full_profile= Buyer 可见的完整画像(上帝视角)seller_view= Seller 初始只能看到known_info,通过对话逐步推断inferred_profile
编辑 data/business_knowledge_base.json,添加你的产品和服务信息。
所有 Prompt 集中在 autope/prompts/prompt_loader.py,修改对应的模板变量即可。