Files
ChouJuGEO/modules/optimization_techniques.py
刘国栋 8f7f082c3d feat: 重构项目结构并添加平台同步基础架构
- 重构项目目录结构,将功能模块移至 modules/ 目录
- 创建平台同步基础架构,包括发布器基类和 GitHub 发布器
- 新增 UI 状态管理模块 (modules/ui/state.py) 统一管理会话状态
- 更新依赖配置,添加平台同步所需依赖 (httpx, pyperclip)
- 整理文档结构,将所有文档分类移至 docs/ 目录
- 添加 .cursorrules 文件定义项目开发规范
- 清理根目录重复文件,保持项目结构整洁
2026-01-30 10:21:29 +08:00

229 lines
10 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
高级优化技巧选择器模块
支持多种优化技巧,动态调整 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 "未选择优化技巧"