Files
ChouJuGEO/modules/optimization_techniques.py
T

229 lines
10 KiB
Python
Raw Permalink Normal View History

"""
高级优化技巧选择器模块
支持多种优化技巧,动态调整 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 "未选择优化技巧"