feat: add Expert 5 (three-stage) and Expert 6 (two-stage) prompt generators

- Expert 5: disambiguation → optimized prompt → sample execution (3 API calls)
- Expert 6: disambiguation → optimized prompt only (2 API calls, faster)
- Chinese disambiguation rules table for correct intent classification
- Domain-specific meta-prompt templates (技术/创意/分析/咨询)
- Simplified homepage to use Expert 6 flow directly, removed template cards

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-28 00:06:10 +08:00
parent 8ddd7ddfc7
commit 83c541bb8e
6 changed files with 1709 additions and 4599 deletions

View File

@@ -0,0 +1,319 @@
# -*- coding: utf-8 -*-
"""
智能提示词优化5号专家 — 三阶段流水线
阶段1:消歧增强意图分析(复用4号)
阶段2:生成优化提示词(核心产出,用户可复制复用)
阶段3:用优化提示词立即调模型产出样例(证明提示词质量)
"""
from flask import Blueprint, render_template, request, jsonify
from openai import OpenAI
import hashlib
import json
import logging
import os
import time
from datetime import datetime
from src.flask_prompt_master import db
from src.flask_prompt_master.models.models import User, Prompt
from src.flask_prompt_master.models.history_models import PromptHistory, UserStatistics
logger = logging.getLogger(__name__)
expert_generate_5_bp = Blueprint('expert_generate_5', __name__)
_dedup_cache = {}
client = OpenAI(
api_key=os.environ.get('LLM_API_KEY') or 'sk-fdf7cc1c73504e628ec0119b7e11b8cc',
base_url=os.environ.get('LLM_API_URL') or 'https://api.deepseek.com/v1'
)
# 阶段1:消歧增强意图分析(与4号完全相同)
INTENT_PROMPT_V4 = """你是一位资深的意图分析专家。你的任务是精确理解用户需求,尤其要处理中文多义词的歧义。
## 消歧规则(优先级从高到低)
### 规则1:"设计"的多义性
| 上下文 | 判定 |
|--------|------|
| 系统设计、架构设计、数据库设计、API设计、模块设计、技术方案设计 | **技术** |
| UI设计、海报设计、品牌设计、视觉设计、创意设计、艺术设计 | **创意** |
| 流程设计、组织设计、商业模式设计、制度设计 | **咨询** |
### 规则2:"方案"的多义性
| 上下文 | 判定 |
|--------|------|
| 技术方案、架构方案、实施方案、部署方案 | **技术** |
| 营销方案、活动方案、传播方案、内容方案 | **创意** |
| 管理方案、策略方案、优化方案、治理方案 | **咨询** |
### 规则3:"分析"的多义性
| 上下文 | 判定 |
|--------|------|
| 数据分析、日志分析、性能分析、安全分析 | **分析** |
| 需求分析、竞品分析、市场分析 | **咨询** |
| 色彩分析、构图分析、文案分析 | **创意** |
### 规则4:技术关键词强信号
看到以下词时,优先判为技术:
Agent、API、SDK、架构、微服务、数据库、后端、前端、部署、DevOps、容器化、分布式、协议、接口、中间件、算法、模型训练、推理、向量、RAG、Pipeline、CI/CD、Kubernetes、Docker、Git
## 判定流程
1. 提取核心名词+动词组合
2. 查询上述消歧表
3. 判断用户最终要产出什么
4. 给出判定 + 置信度
## 输出格式
严格返回以下JSON,不要任何额外内容:
{
"core_intent": "技术",
"sub_category": "多Agent协作系统设计",
"domain": "二级精确领域",
"confidence": 0.92,
"disambiguation_note": "判定依据简述",
"alternative_intent": "咨询",
"key_requirements": ["需求1", "需求2", "需求3"],
"expected_output": "精确的预期产出描述",
"constraints": ["约束1", "约束2"],
"keywords": ["关键词1", "关键词2", "关键词3"]
}
"""
# 阶段2:生成优化提示词的 meta-prompt(每种领域不同结构)
PROMPT_GENERATOR_TEMPLATES = {
"技术": """你是一位资深提示词工程师,专精于技术领域。你的任务是生成一个高质量的提示词,让下游LLM能够输出专业的技术方案。
意图分析:
{analysis}
请生成一个完整的提示词,必须包含以下要素:
1. **角色设定**:明确LLM扮演什么技术专家角色(架构师/开发者/技术顾问),给出具体的专业背景
2. **任务描述**:清晰陈述要完成的技术任务,拆解为2-4个可执行步骤
3. **输出结构**:定义输出的章节和每章要包含的具体内容(不要只列标题,要说明每章怎么写)
4. **质量标准**:给出具体的质量要求(如"每个API必须给出字段级规范"而非"详细描述")
5. **约束条件**:明确禁止什么、必须包含什么
关键原则:
- 你生成的是提示词,不是最终答案
- 提示词必须自包含——用户复制后可以直接在任何LLM中使用
- 使用具体的技术术语和可验证的标准
- 每个章节指引都应该是"如何写"而非"写什么"
请在末尾附上一句给用户的简短说明(用「」括起来),解释这个提示词适合什么场景使用。""",
"创意": """你是一位资深提示词工程师,专精于创意领域。你的任务是生成一个高质量的提示词,让下游LLM能够输出专业的创意方案。
意图分析:
{analysis}
请生成一个完整的提示词,必须包含以下要素:
1. **角色设定**:明确LLM扮演什么创意角色(创意总监/文案策划/品牌顾问),给出具体的风格偏好
2. **任务描述**:清晰陈述创意任务,包括目标受众、品牌调性、传播目标
3. **输出结构**:定义输出的章节和每章要包含的具体内容——给出框架但不能限制创意发挥
4. **质量标准**:给出具体的创意质量要求(如"每个视觉描述必须包含色彩/形状/情绪三个维度")
5. **灵感框架**:提供1-2个创作维度的引导,但不预设具体答案
关键原则:
- 你生成的是提示词,不是最终文案/设计稿
- 提示词必须引导LLM发挥创意,同时给出足够结构约束避免空泛
- 拒绝"高端大气上档次"这类空话——给出可触摸的质量标准
请在末尾附上一句给用户的简短说明(用「」括起来),解释这个提示词适合什么场景使用。""",
"分析": """你是一位资深提示词工程师,专精于数据分析领域。你的任务是生成一个高质量的提示词,让下游LLM能够输出专业的数据分析报告。
意图分析:
{analysis}
请生成一个完整的提示词,必须包含以下要素:
1. **角色设定**:明确LLM扮演什么分析角色(数据分析师/商业分析师/研究员),给出分析方法论倾向
2. **任务描述**:清晰陈述分析目标、数据范围、要回答的核心问题
3. **输出结构**:定义输出的章节——包括分析框架、指标定义、可视化建议、洞察和局限性
4. **质量标准**:给出具体的分析质量标准(如"所有结论必须附数据支撑""指标必须给出计算口径")
5. **方法论指引**:建议使用的分析思维(MECE/假设驱动/探索式),但不强制
关键原则:
- 你生成的是提示词,不是最终分析报告
- 提示词必须要求LLM展示推理过程,而非只给结论
- 要求LLM诚实标注数据局限性和置信度
请在末尾附上一句给用户的简短说明(用「」括起来),解释这个提示词适合什么场景使用。""",
"咨询": """你是一位资深提示词工程师,专精于管理咨询领域。你的任务是生成一个高质量的提示词,让下游LLM能够输出专业的咨询建议。
意图分析:
{analysis}
请生成一个完整的提示词,必须包含以下要素:
1. **角色设定**:明确LLM扮演什么咨询角色(管理顾问/策略顾问/组织顾问),给出咨询方法论倾向
2. **任务描述**:清晰陈述咨询问题、客户背景、决策情境
3. **输出结构**:定义输出的章节——诊断→方案矩阵→推荐→路线图→风险→ROI
4. **质量标准**:给出具体的咨询质量标准(如"方案必须可比较""风险必须有概率×影响评估")
5. **决策导向**:提示词应引导LLM最终输出可执行的决策建议,而非泛泛分析
关键原则:
- 你生成的是提示词,不是最终咨询报告
- 提示词必须要求LLM给出带权重的选项,而非单一建议
- 要求LLM明确标注假设前提
请在末尾附上一句给用户的简短说明(用「」括起来),解释这个提示词适合什么场景使用。"""
}
def _get_user_id():
try:
from flask_login import current_user
if current_user.is_authenticated:
return getattr(current_user, 'id', None) or getattr(current_user, 'uid', None)
except Exception:
pass
from flask import session
uid = session.get('user_id')
if uid is not None:
return uid
try:
u = User.query.filter_by(login_name='admin').first()
return u.uid if u else 1
except Exception as e:
logger.warning("5号专家 获取默认用户失败: %s", e)
return 1
@expert_generate_5_bp.route('/expert-generate-5', methods=['GET'])
def expert_generate_5_page():
return render_template('expert_generate_5.html')
@expert_generate_5_bp.route('/api/expert-generate-5/generate', methods=['POST'])
def expert_generate_5_api():
"""三阶段流水线:消歧分析 → 生成提示词 → 执行样例"""
try:
if not request.is_json:
return jsonify({'code': 400, 'message': '请求必须是JSON格式', 'data': None})
payload = request.get_json() or {}
raw_input = (payload.get('input_text') or '').strip()
if not raw_input:
return jsonify({'code': 400, 'message': '请输入您的需求', 'data': None})
uid = _get_user_id()
req_key = (uid, hashlib.md5(raw_input.encode()).hexdigest())
now_ts = time.time()
if req_key in _dedup_cache and (now_ts - _dedup_cache[req_key]) < 8:
return jsonify({'code': 429, 'message': '请勿重复提交', 'data': None})
_dedup_cache[req_key] = now_ts
if len(_dedup_cache) > 500:
_dedup_cache.clear()
# ===== 阶段1:消歧意图分析 =====
logger.info("5号专家 阶段1 开始")
resp1 = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": INTENT_PROMPT_V4},
{"role": "user", "content": raw_input}
],
temperature=0.05,
timeout=60
)
intent_raw = (resp1.choices[0].message.content or "").strip()
intent_raw = intent_raw.replace('```json', '').replace('```', '').strip()
try:
intent_data = json.loads(intent_raw)
for f in ['core_intent', 'domain', 'key_requirements', 'expected_output', 'constraints', 'keywords']:
if f not in intent_data:
raise ValueError(f"缺少字段: {f}")
if intent_data['core_intent'] not in ('技术', '创意', '分析', '咨询'):
intent_data['core_intent'] = '技术'
for arr_f in ['key_requirements', 'constraints', 'keywords']:
v = intent_data.get(arr_f)
if not isinstance(v, list) or len(v) == 0:
intent_data[arr_f] = ['未指定']
intent_data.setdefault('sub_category', intent_data['domain'])
intent_data.setdefault('confidence', 0.75)
intent_data.setdefault('disambiguation_note', '')
intent_data.setdefault('alternative_intent', '')
except (json.JSONDecodeError, ValueError) as e:
logger.error("5号专家 JSON解析失败: %s", e)
return jsonify({'code': 500, 'message': '意图分析格式有误,请重试', 'data': None})
logger.info("5号专家 阶段1完成 | intent=%s | confidence=%.2f",
intent_data['core_intent'], intent_data.get('confidence', 0))
# ===== 阶段2:生成优化提示词 =====
logger.info("5号专家 阶段2 开始")
core_intent = intent_data['core_intent']
meta_prompt = PROMPT_GENERATOR_TEMPLATES[core_intent]
analysis_str = json.dumps(intent_data, ensure_ascii=False, indent=2)
resp2 = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": meta_prompt.format(analysis=analysis_str)},
{"role": "user", "content": f"用户需求:{raw_input}\n\n请基于上述意图分析,生成一个高质量的提示词。"}
],
temperature=0.5,
max_tokens=1500,
timeout=90
)
optimized_prompt = (resp2.choices[0].message.content or "").strip()
if not optimized_prompt:
return jsonify({'code': 500, 'message': '提示词生成失败', 'data': None})
logger.info("5号专家 阶段2完成 | prompt_len=%d", len(optimized_prompt))
# ===== 阶段3:执行样例 =====
logger.info("5号专家 阶段3 开始")
resp3 = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": optimized_prompt},
{"role": "user", "content": raw_input}
],
temperature=0.7,
max_tokens=1200,
timeout=90
)
sample_output = (resp3.choices[0].message.content or "").strip()
if not sample_output:
sample_output = "(模型未返回样例,请直接用上方提示词调用)"
logger.info("5号专家 阶段3完成 | sample_len=%d", len(sample_output))
# 保存
try:
db.session.add(Prompt(
input_text=raw_input,
generated_text=optimized_prompt,
user_id=uid,
created_at=datetime.utcnow()
))
db.session.commit()
except Exception as e:
db.session.rollback()
logger.warning("5号专家 保存失败: %s", e)
try:
PromptHistory.add_history(
user_id=uid,
original_input=raw_input,
generated_prompt=optimized_prompt,
template_name=f'智能提示词优化5号专家(三阶段-{core_intent})'
)
UserStatistics.update_statistics(uid)
except Exception as e:
logger.warning("5号专家 历史保存失败: %s", e)
return jsonify({
'code': 200,
'message': 'success',
'data': {
'method': 'three-stage-pipeline',
'api_calls': 3,
'intent_analysis': intent_data,
'optimized_prompt': optimized_prompt,
'sample_output': sample_output
}
})
except Exception as e:
logger.exception("5号专家 生成失败")
return jsonify({'code': 500, 'message': str(e) or '生成失败,请重试', 'data': None})