第四章 提示词进阶优化技巧
4.1 思维链(Chain of Thoughts, CoT)
-
核心原理 :
人类在解决复杂数学题或逻辑推理时,不会直接给出答案,而是会一步步写下解题过程。思维链(CoT)正是模仿了这一过程。它通过在Prompt中明确要求模型"一步一步地思考 "或"让我们先分解问题...",引导模型在生成最终答案前,先输出其内部的推理步骤。
这种方法的核心在于丰富上文。当模型需要生成"下一步"时,其上下文不仅包含原始问题,还包含了自己刚刚写下的推理步骤。这极大地约束了模型的概率空间,使其更倾向于沿着正确的逻辑路径前进,从而显著提升在计算、逻辑推理等复杂任务上的准确性。
-
实战场景:客服质检(产品信息准确性判断)
-
质检项定义:在电信客服场景中,"产品信息准确性"是一个关键质检项。判定规则通常包括:
- 完整性:是否提及了套餐名称、月费价格、月流量总量?
- 准确性:所提及的信息是否与官方知识库完全一致?(例如,不能将"60元/40GB"说成"60元/50GB")
-
CoT 落地 :
我们可以设计如下的Prompt,强制模型进行分步验证:
你是一名专业的客服质检员。请根据以下官方套餐信息,严格检查客服回复的准确性。 【官方信息】 - 畅享卡: 60元/月, 40GB通用流量 【客服回复】 "您可以考虑我们的畅享卡,每月60元,有50个G的流量。" 请一步一步分析: 1. 客服是否提到了套餐名称?是什么? 2. 客服提到的价格是多少? 3. 客服提到的流量是多少? 4. 将客服提到的信息与【官方信息】逐项对比。 5. 最终结论:信息是否准确?(是/否) 只输出最终结论。效果:没有CoT时,模型可能因为"60元"这个正确信息而忽略"50G"这个错误,直接判断为"是"。而有了CoT,模型会清晰地走完每一步,最终得出正确的"否"的结论。
-
4.2 自洽性(Self-Consistency)
-
核心逻辑 :
大模型的输出具有随机性,同一个问题多次提问可能会得到不同的答案,其中一些甚至是"幻觉"(编造的事实)。自洽性(Self-Consistency)是一种对抗这种不稳定的策略。它的思想很简单:既然一次回答不可靠,那就让它多回答几次,然后看哪个答案出现得最多! 这就像让一个学生做同一道题三次,如果两次答案一样,那这个答案很可能是对的。
-
实现方法:
- 相同 Prompt 多轮生成 :使用相同的Prompt,但设置较高的
temperature(如0.7),以鼓励模型生成多样化的推理路径。 - 投票选结果:从每次生成的完整回复中,提取出最终的答案(例如,通过正则表达式或另一个小模型),然后统计所有答案的出现频率,选择票数最高的作为最终结果。
- 相同 Prompt 多轮生成 :使用相同的Prompt,但设置较高的
-
实战验证:客服质检场景的多轮输出一致性验证
在上述客服质检的例子中,我们可以运行5次CoT推理。假设结果如下:
- 第1次: 否
- 第2次: 否
- 第3次: 是 (幻觉)
- 第4次: 否
- 第5次: 否
通过多数投票(4票"否" vs 1票"是"),系统可以非常自信地判定最终结果为"否",有效过滤掉了那次由随机性导致的错误判断。
4.3 思维树(Tree-of-Thought, ToT)
-
核心逻辑 :
思维链(CoT)是一条单线的思考路径,一旦早期出错,后面就全错了。思维树(ToT)则是CoT的分支扩展 。它将问题解决过程建模为一棵搜索树:
- 根节点:初始问题。
- 中间节点:代表一个部分解决方案或一个思考步骤。
- 子节点 :代表从当前节点出发,可以采取的多种不同思路或行动。
在每个节点,ToT会生成多个候选分支 ,然后通过一个评估函数(可以是另一个Prompt)给每个分支打分,判断其"有希望"程度,最后决定是继续深入探索(深度优先)还是横向尝试更多可能性(广度优先)。
-
关键步骤:
- 分支采样:在每个思考步骤,不是只生成一个想法,而是生成N个(如3-5个)不同的想法。
- 任务完成度判断:设计一个评估Prompt,用于判断一个部分解决方案是否有效、是否有潜力。例如:"这个运动建议是否同时考虑了用户的速度和耐力需求?(是/否/部分)"。
- 搜索算法设计 :根据任务特性选择策略。对于需要快速找到可行解的问题,用广度优先 ;对于需要深入挖掘最优解的问题,用深度优先。
-
实战场景:运动项目推荐(速度 / 耐力 / 力量素质的分层分析与剪枝)
假设我们要为一位用户推荐运动项目,已知他速度快、耐力一般、力量强。
- 第一步(根节点) :生成多个初步方向。
- 分支A: 侧重速度的运动 (短跑、羽毛球)
- 分支B: 侧重力量的运动 (举重、攀岩)
- 分支C: 综合性运动 (篮球、足球)
- 第二步(评估与剪枝) :评估每个分支。
- 分支A: 高度匹配"速度快",但对"力量强"利用不足。得分:7/10。
- 分支B: 完美匹配"力量强",但忽略了"速度快"的优势。得分:6/10。
- 分支C: 能同时发挥速度和力量优势,虽然对耐力有要求,但可以通过位置选择(如前锋)来规避。得分:9/10。
- 第三步(深入探索) :选择得分最高的分支C,继续细化。
- 子分支C1: 篮球 -> 推荐打快攻型前锋。
- 子分支C2: 足球 -> 推荐打边锋。
- 最终决策:综合评估后,推荐"篮球(快攻型前锋)"。
- 第一步(根节点) :生成多个初步方向。
用户: 速度快, 耐力一般, 力量强
初步方向
分支A: 速度型
分支B: 力量型
分支C: 综合型
评估: 7/10
评估: 6/10
评估: 9/10
细化推荐
篮球: 快攻前锋
足球: 边锋
三种技术整合
下面我们将上述三种技术整合到一个示例中。
python
from openai import OpenAI
from collections import Counter
import re
client = OpenAI(api_key="your-api-key")
# === 1. 思维链 (CoT) 实现 ===
def cot_check_accuracy(customer_service_reply: str) -> str:
"""使用CoT检查客服回复的准确性"""
official_info = "畅享卡: 60元/月, 40GB通用流量"
prompt = f"""
你是一名专业的客服质检员。请根据以下官方套餐信息,严格检查客服回复的准确性。
【官方信息】
{official_info}
【客服回复】
"{customer_service_reply}"
请一步一步分析:
1. 套餐名称?
2. 价格?
3. 流量?
4. 与官方信息对比。
5. 结论:(是/否)
只输出最终结论。
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
temperature=0.0 # CoT通常用低温保证逻辑稳定
)
return response.choices[0].message.content.strip()
# === 2. 自洽性 (Self-Consistency) 实现 ===
def self_consistency_check(reply: str, n_samples: int = 5) -> str:
"""通过多次采样和投票实现自洽性检查"""
answers = []
for _ in range(n_samples):
# 使用稍高的温度以引入多样性
answer = cot_check_accuracy(reply)
# 提取最终的"是"或"否"
match = re.search(r'(是|否)', answer)
if match:
answers.append(match.group(1))
else:
answers.append("未知")
# 投票
vote_result = Counter(answers).most_common(1)[0][0]
print(f"投票详情: {Counter(answers)} -> 最终结果: {vote_result}")
return vote_result
# === 3. 思维树 (ToT) 核心逻辑演示 (简化版) ===
def tot_evaluate_branch(user_profile: str, branch_idea: str) -> int:
"""评估一个运动推荐分支的得分 (0-10)"""
prompt = f"""
用户身体素质: {user_profile}
运动推荐方向: {branch_idea}
请从0到10分,评估此方向对用户需求的匹配度。只输出一个数字。
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
temperature=0.3
)
try:
return int(response.choices[0].message.content.strip())
except:
return 0
def recommend_sport_tot(user_profile: str) -> str:
"""使用ToT思想为用户推荐运动"""
# 第一步:生成初始分支
initial_prompt = f"""
用户身体素质: {user_profile}
请生成3个不同的运动大类推荐方向,每个方向一行。
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": initial_prompt}]
)
branches = [b.strip() for b in response.choices[0].message.content.split('\n') if b.strip()]
# 第二步:评估并选择最佳分支
scores = [(branch, tot_evaluate_branch(user_profile, branch)) for branch in branches]
best_branch = max(scores, key=lambda x: x[1])
print(f"各分支得分: {scores}")
# 第三步:细化最佳分支
refine_prompt = f"""
用户身体素质: {user_profile}
已选定方向: {best_branch[0]}
请给出一个具体的运动项目和玩法建议。
"""
final_response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": refine_prompt}]
)
return final_response.choices[0].message.content
# === 使用示例 ===
if __name__ == "__main__":
# 场景1: 客服质检
bad_reply = "您可以考虑我们的畅享卡,每月60元,有50个G的流量。"
print("=== CoT 单次检查 ===")
single_result = cot_check_accuracy(bad_reply)
print(f"结果: {single_result}")
print("\n=== Self-Consistency 多次投票 ===")
final_result = self_consistency_check(bad_reply)
print(f"最终质检结论: {'准确' if final_result == '是' else '不准确'}")
# 场景2: 运动推荐
print("\n=== ToT 运动推荐 ===")
user_profile = "速度快, 耐力一般, 力量强"
recommendation = recommend_sport_tot(user_profile)
print(f"推荐: {recommendation}")