💻 源码
"""
提示词模板模块
定义三种提示词策略的模板:
1. 无思维链(No CoT)- 基线
2. 零样本思维链(Zero-shot CoT)
3. 少样本思维链(Few-shot CoT)
"""

# ==================== 策略1:无思维链(基线) ====================
NO_COT_PROMPT = """
请直接回答以下问题,不要解释思考过程,只给出最终答案。

问题:{question}
答案:
"""

# ==================== 策略2:零样本思维链 ====================
ZERO_SHOT_COT_PROMPT = """
请回答以下问题。**重要:先详细写出你的思考过程,每一步都要清晰说明,最后再给出最终答案。**

思考过程要求:
1. 分析问题的核心是什么
2. 列出需要用到的信息和公式
3. 逐步推导计算
4. 检查推导是否有错误
5. 得出最终答案

问题:{question}

思考过程:
1. 
2. 
3. 

最终答案:
"""

# ==================== 策略3:少样本思维链 ====================
FEW_SHOT_COT_PROMPT = """
你是一个善于推理的助手。请按照以下示例的格式回答问题:先写出详细的思考过程,再给出最终答案。

--- 示例1 ---
问题:小明有15个苹果,给了小红1/3,又买了6个,现在小明有多少个苹果?
思考过程:
1. 首先计算小明给小红的苹果数量:15 × 1/3 = 5个
2. 然后计算给完小红后剩下的苹果:15 - 5 = 10个
3. 最后加上新买的苹果:10 + 6 = 16个
最终答案:16个

--- 示例2 ---
问题:一个长方形的长是8厘米,宽比长短3厘米,这个长方形的周长是多少厘米?
思考过程:
1. 先计算长方形的宽:8 - 3 = 5厘米
2. 长方形周长公式是:(长 + 宽) × 2
3. 代入数值计算:(8 + 5) × 2 = 13 × 2 = 26厘米
最终答案:26厘米

--- 现在回答以下问题 ---
问题:{question}
思考过程:
1. 
2. 
3. 

最终答案:
"""

# ==================== 提示词模板字典(便于批量处理) ====================
PROMPT_TEMPLATES = {
    "no_cot": {
        "name": "无思维链",
        "description": "直接回答问题,不展示思考过程",
        "template": NO_COT_PROMPT
    },
    "zero_shot_cot": {
        "name": "零样本思维链",
        "description": "要求模型先展示思考过程,再给出答案(无示例)",
        "template": ZERO_SHOT_COT_PROMPT
    },
    "few_shot_cot": {
        "name": "少样本思维链",
        "description": "提供示例,要求模型按照示例格式展示思考过程",
        "template": FEW_SHOT_COT_PROMPT
    }
}


def get_prompt(strategy, question):
    """
    根据策略获取对应的提示词
    
    Args:
        strategy: 策略名称,可选:no_cot, zero_shot_cot, few_shot_cot
        question: 问题内容
        
    Returns:
        str: 格式化后的提示词
        
    Raises:
        ValueError: 如果策略名称不存在
    """
    if strategy not in PROMPT_TEMPLATES:
        raise ValueError(f"未知的策略:{strategy}。可选:{list(PROMPT_TEMPLATES.keys())}")
    
    template = PROMPT_TEMPLATES[strategy]["template"]
    return template.format(question=question)


def get_strategy_info(strategy):
    """
    获取策略的详细信息
    
    Args:
        strategy: 策略名称
        
    Returns:
        dict: 包含名称和描述的字典
    """
    if strategy not in PROMPT_TEMPLATES:
        raise ValueError(f"未知的策略:{strategy}")
    
    return {
        "name": PROMPT_TEMPLATES[strategy]["name"],
        "description": PROMPT_TEMPLATES[strategy]["description"]
    }


def list_strategies():
    """
    列出所有可用的策略
    
    Returns:
        list: 策略名称列表
    """
    return list(PROMPT_TEMPLATES.keys())