229 lines
10 KiB
Python
229 lines
10 KiB
Python
|
|
"""
|
|||
|
|
高级优化技巧选择器模块
|
|||
|
|
支持多种优化技巧,动态调整 Prompt 生成策略
|
|||
|
|
"""
|
|||
|
|
from typing import List, Dict, Optional
|
|||
|
|
from enum import Enum
|
|||
|
|
|
|||
|
|
|
|||
|
|
class OptimizationTechnique(Enum):
|
|||
|
|
"""优化技巧类型"""
|
|||
|
|
EVIDENCE_DRIVEN = "evidence_driven" # 证据驱动
|
|||
|
|
CONVERSATIONAL = "conversational" # 对话式设计
|
|||
|
|
STORYTELLING = "storytelling" # 故事化叙述
|
|||
|
|
COMPARATIVE = "comparative" # 对比式结构
|
|||
|
|
STEP_BY_STEP = "step_by_step" # 步骤式指南
|
|||
|
|
DATA_RICH = "data_rich" # 数据丰富
|
|||
|
|
CASE_STUDY = "case_study" # 案例研究
|
|||
|
|
FAQ_FOCUSED = "faq_focused" # FAQ 聚焦
|
|||
|
|
|
|||
|
|
|
|||
|
|
class OptimizationTechniqueManager:
|
|||
|
|
"""优化技巧管理器"""
|
|||
|
|
|
|||
|
|
def __init__(self):
|
|||
|
|
# 定义所有优化技巧及其描述
|
|||
|
|
self.techniques = {
|
|||
|
|
OptimizationTechnique.EVIDENCE_DRIVEN.value: {
|
|||
|
|
"name": "证据驱动",
|
|||
|
|
"description": "添加数据、案例、来源等证据支撑,提升内容可信度",
|
|||
|
|
"icon": "📊",
|
|||
|
|
"prompt_addition": """
|
|||
|
|
【证据驱动优化要求】
|
|||
|
|
- 添加具体数据:在合适位置添加数据占位(如"根据XX数据显示,约XX%的用户")
|
|||
|
|
- 添加案例支撑:至少包含2-3个实际案例或应用场景(用占位符)
|
|||
|
|
- 添加来源引用:标注数据来源、案例来源(如"根据XX行业报告"、"参考XX研究")
|
|||
|
|
- 添加对比数据:提供对比信息(如"相比传统方案,提升约XX%")
|
|||
|
|
- 确保每个主要观点都有证据支撑
|
|||
|
|
"""
|
|||
|
|
},
|
|||
|
|
OptimizationTechnique.CONVERSATIONAL.value: {
|
|||
|
|
"name": "对话式设计",
|
|||
|
|
"description": "采用问答式、互动式结构,提升内容可读性和参与度",
|
|||
|
|
"icon": "💬",
|
|||
|
|
"prompt_addition": """
|
|||
|
|
【对话式设计优化要求】
|
|||
|
|
- 开头使用问题引入:用用户常见问题开头(如"你是否遇到过..."、"想知道如何...")
|
|||
|
|
- 采用问答结构:将内容组织为问答形式,至少包含5-8个问答对
|
|||
|
|
- 使用第二人称:多用"你"、"您",增强互动感
|
|||
|
|
- 添加互动引导:在合适位置添加互动语句(如"试试看"、"不妨考虑")
|
|||
|
|
- 结尾设置问题:以开放性问题或思考题结尾,引导用户思考
|
|||
|
|
"""
|
|||
|
|
},
|
|||
|
|
OptimizationTechnique.STORYTELLING.value: {
|
|||
|
|
"name": "故事化叙述",
|
|||
|
|
"description": "使用案例故事、用户故事,让内容更生动、更易记忆",
|
|||
|
|
"icon": "📖",
|
|||
|
|
"prompt_addition": """
|
|||
|
|
【故事化叙述优化要求】
|
|||
|
|
- 开头故事引入:用真实或典型的用户故事开头(用占位符,如"某企业案例")
|
|||
|
|
- 故事化案例:将案例包装成故事形式,包含背景、挑战、解决方案、结果
|
|||
|
|
- 用户视角:从用户角度叙述,增强代入感
|
|||
|
|
- 情感共鸣:在故事中加入情感元素(如"困扰"、"惊喜"、"成功")
|
|||
|
|
- 故事结构:使用经典故事结构(起承转合),让内容更有吸引力
|
|||
|
|
"""
|
|||
|
|
},
|
|||
|
|
OptimizationTechnique.COMPARATIVE.value: {
|
|||
|
|
"name": "对比式结构",
|
|||
|
|
"description": "通过优势对比、功能对比,突出品牌优势",
|
|||
|
|
"icon": "⚖️",
|
|||
|
|
"prompt_addition": """
|
|||
|
|
【对比式结构优化要求】
|
|||
|
|
- 多维度对比:从功能、性能、价格、服务等多个维度对比
|
|||
|
|
- 对比表格:使用表格或列表形式清晰展示对比(至少5个对比点)
|
|||
|
|
- 优势突出:在对比中自然突出品牌优势,但保持客观
|
|||
|
|
- 适用场景对比:说明不同方案的适用场景
|
|||
|
|
- 选择建议:基于对比结果,提供选择建议和理由
|
|||
|
|
"""
|
|||
|
|
},
|
|||
|
|
OptimizationTechnique.STEP_BY_STEP.value: {
|
|||
|
|
"name": "步骤式指南",
|
|||
|
|
"description": "提供清晰的操作步骤、使用教程,提升实用性",
|
|||
|
|
"icon": "📝",
|
|||
|
|
"prompt_addition": """
|
|||
|
|
【步骤式指南优化要求】
|
|||
|
|
- 清晰步骤:将内容组织为清晰的步骤(1. 2. 3. 格式)
|
|||
|
|
- 每步说明:每个步骤都有详细说明和注意事项
|
|||
|
|
- 操作示例:提供具体操作示例或代码示例(如适用,用占位符)
|
|||
|
|
- 常见问题:在每个关键步骤后添加"常见问题"或"注意事项"
|
|||
|
|
- 结果验证:说明如何验证每个步骤的结果
|
|||
|
|
- 总结步骤:在结尾总结关键步骤,便于回顾
|
|||
|
|
"""
|
|||
|
|
},
|
|||
|
|
OptimizationTechnique.DATA_RICH.value: {
|
|||
|
|
"name": "数据丰富",
|
|||
|
|
"description": "大量使用数据、统计、图表,提升内容权威性",
|
|||
|
|
"icon": "📈",
|
|||
|
|
"prompt_addition": """
|
|||
|
|
【数据丰富优化要求】
|
|||
|
|
- 数据密度:每100字至少包含1-2个数据点(百分比、数量、增长率等)
|
|||
|
|
- 数据多样性:包含不同类型的数据(市场数据、用户数据、性能数据等)
|
|||
|
|
- 数据可视化建议:在合适位置建议使用图表(如"可用柱状图展示")
|
|||
|
|
- 数据来源:每个数据都标注来源占位(如"根据XX报告")
|
|||
|
|
- 数据时效性:标注数据的时间节点(如"2024年数据显示")
|
|||
|
|
- 数据对比:使用数据对比突出差异和优势
|
|||
|
|
"""
|
|||
|
|
},
|
|||
|
|
OptimizationTechnique.CASE_STUDY.value: {
|
|||
|
|
"name": "案例研究",
|
|||
|
|
"description": "深入分析案例,展示实际应用效果",
|
|||
|
|
"icon": "🔬",
|
|||
|
|
"prompt_addition": """
|
|||
|
|
【案例研究优化要求】
|
|||
|
|
- 完整案例结构:包含背景、挑战、解决方案、实施过程、结果、经验总结
|
|||
|
|
- 案例细节:提供足够的细节(用占位符),让案例真实可信
|
|||
|
|
- 量化结果:案例结果要量化(如"提升XX%"、"节省XX时间")
|
|||
|
|
- 多案例对比:如可能,提供2-3个不同类型的案例
|
|||
|
|
- 案例启示:从案例中提取可复用的经验和启示
|
|||
|
|
- 适用性分析:说明案例的适用场景和局限性
|
|||
|
|
"""
|
|||
|
|
},
|
|||
|
|
OptimizationTechnique.FAQ_FOCUSED.value: {
|
|||
|
|
"name": "FAQ 聚焦",
|
|||
|
|
"description": "以常见问题为核心,提供全面解答",
|
|||
|
|
"icon": "❓",
|
|||
|
|
"prompt_addition": """
|
|||
|
|
【FAQ 聚焦优化要求】
|
|||
|
|
- 问题收集:至少包含8-12个常见问题,覆盖用户主要关注点
|
|||
|
|
- 问题分类:将问题按主题分类(如"功能类"、"使用类"、"对比类")
|
|||
|
|
- 详细解答:每个问题提供详细、全面的解答(至少100-200字)
|
|||
|
|
- 问题关联:在解答中关联其他相关问题,形成知识网络
|
|||
|
|
- 问题优先级:按重要性排序,重要问题放在前面
|
|||
|
|
- 问题更新:在结尾提示"如有其他问题,可参考...",引导进一步了解
|
|||
|
|
"""
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
def get_technique_info(self, technique_id: str) -> Optional[Dict]:
|
|||
|
|
"""获取技巧信息"""
|
|||
|
|
return self.techniques.get(technique_id)
|
|||
|
|
|
|||
|
|
def list_techniques(self) -> List[Dict]:
|
|||
|
|
"""列出所有技巧"""
|
|||
|
|
return [
|
|||
|
|
{
|
|||
|
|
"id": tech_id,
|
|||
|
|
**info
|
|||
|
|
}
|
|||
|
|
for tech_id, info in self.techniques.items()
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
def get_technique_names(self) -> List[str]:
|
|||
|
|
"""获取所有技巧名称列表(用于 UI 显示)"""
|
|||
|
|
return [info["name"] for info in self.techniques.values()]
|
|||
|
|
|
|||
|
|
def get_technique_ids_by_names(self, names: List[str]) -> List[str]:
|
|||
|
|
"""根据名称列表获取技巧 ID 列表"""
|
|||
|
|
name_to_id = {info["name"]: tech_id for tech_id, info in self.techniques.items()}
|
|||
|
|
result = []
|
|||
|
|
for name in names:
|
|||
|
|
# 处理可能包含图标的情况(如 "📊 证据驱动")
|
|||
|
|
clean_name = name.split(" ", 1)[-1] if " " in name else name
|
|||
|
|
if clean_name in name_to_id:
|
|||
|
|
result.append(name_to_id[clean_name])
|
|||
|
|
return result
|
|||
|
|
|
|||
|
|
def enhance_prompt(self, base_prompt: str, technique_ids: List[str]) -> str:
|
|||
|
|
"""
|
|||
|
|
根据选择的技巧增强 Prompt
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
base_prompt: 基础 Prompt 模板
|
|||
|
|
technique_ids: 选择的技巧 ID 列表
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
增强后的 Prompt
|
|||
|
|
"""
|
|||
|
|
if not technique_ids:
|
|||
|
|
return base_prompt
|
|||
|
|
|
|||
|
|
# 收集所有技巧的 Prompt 增强内容
|
|||
|
|
enhancements = []
|
|||
|
|
for tech_id in technique_ids:
|
|||
|
|
tech_info = self.get_technique_info(tech_id)
|
|||
|
|
if tech_info and tech_info.get("prompt_addition"):
|
|||
|
|
enhancements.append(tech_info["prompt_addition"])
|
|||
|
|
|
|||
|
|
if not enhancements:
|
|||
|
|
return base_prompt
|
|||
|
|
|
|||
|
|
# 将增强内容添加到基础 Prompt
|
|||
|
|
enhanced_prompt = base_prompt
|
|||
|
|
|
|||
|
|
# 在【开始】或【开始优化】之前插入增强内容
|
|||
|
|
if "【开始优化】" in enhanced_prompt:
|
|||
|
|
enhanced_prompt = enhanced_prompt.replace(
|
|||
|
|
"【开始优化】",
|
|||
|
|
"\n".join(enhancements) + "\n\n【开始优化】"
|
|||
|
|
)
|
|||
|
|
elif "【开始】" in enhanced_prompt:
|
|||
|
|
enhanced_prompt = enhanced_prompt.replace(
|
|||
|
|
"【开始】",
|
|||
|
|
"\n".join(enhancements) + "\n\n【开始】"
|
|||
|
|
)
|
|||
|
|
else:
|
|||
|
|
# 如果没有找到标记,直接追加到末尾
|
|||
|
|
enhanced_prompt = enhanced_prompt + "\n" + "\n".join(enhancements)
|
|||
|
|
|
|||
|
|
return enhanced_prompt
|
|||
|
|
|
|||
|
|
def get_technique_description(self, technique_id: str) -> str:
|
|||
|
|
"""获取技巧描述"""
|
|||
|
|
tech_info = self.get_technique_info(technique_id)
|
|||
|
|
if tech_info:
|
|||
|
|
return f"{tech_info.get('icon', '')} {tech_info.get('name', '')}:{tech_info.get('description', '')}"
|
|||
|
|
return ""
|
|||
|
|
|
|||
|
|
def get_combined_description(self, technique_ids: List[str]) -> str:
|
|||
|
|
"""获取组合技巧的描述"""
|
|||
|
|
if not technique_ids:
|
|||
|
|
return "未选择优化技巧"
|
|||
|
|
|
|||
|
|
descriptions = []
|
|||
|
|
for tech_id in technique_ids:
|
|||
|
|
tech_info = self.get_technique_info(tech_id)
|
|||
|
|
if tech_info:
|
|||
|
|
descriptions.append(f"{tech_info.get('icon', '')} {tech_info.get('name', '')}")
|
|||
|
|
|
|||
|
|
return " + ".join(descriptions) if descriptions else "未选择优化技巧"
|