"""
提示词模板模块
定义三种提示词策略的模板:
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())