2.4 其他高级方法
📌 本节目标
学完这一节,你将掌握两种强大的高级提示技术:自一致性 和 生成知识提示。你将理解它们如何提升模型回答的准确性和可靠性,并能独立编写提示词来应用这些方法,解决更复杂的推理问题。
1. 核心概念讲解
在前面的课程中,我们已经学习了零样本、少样本和思维链(Chain-of-Thought,简称 CoT)提示。这些方法非常有效,但有时模型可能会“想偏了”——比如在数学题上,虽然步骤看起来合理,但最终结果却错了。为了解决这个问题,我们需要更高级的技巧。
1.1 自一致性(Self-Consistency)
核心思想: “三个臭皮匠,顶个诸葛亮”。对于同一个复杂问题,我们不让模型只回答一次,而是让它多次推理(比如用不同的随机性生成多条思维链),然后从这些答案中选取出现频率最高的那个作为最终答案。
通俗解释: 想象你让一个学生做一道数学题。如果只做一次,他可能因为粗心算错。但如果让他独立做 5 遍,并且每次都写出详细的解题步骤,最后你会发现,正确的答案往往会出现 3 次或 4 次,而错误的答案各不相同。我们最终就采纳那个出现次数最多的答案。
比如:
- 普通提示: “小明有 5 个苹果,妈妈又给了他 3 个,然后他吃掉了 2 个,还剩几个?” 模型可能回答:“6 个。”(正确)
- 自一致性提示: 我们让模型“请用不同的思路计算 3 次,然后给出最终答案”。模型可能会生成:
- 路径 1:5 + 3 = 8,8 - 2 = 6 → 答案:6
- 路径 2:5 - 2 = 3,3 + 3 = 6 → 答案:6
- 路径 3:3 - 2 = 1,5 + 1 = 6 → 答案:6 最终,答案“6”出现了 3 次,我们选择它作为最终输出。如果某次模型算错了(比如路径 3 算成了 5+1=7),那么“7”只出现 1 次,不会被采纳。
技术实现: 在调用 API 时,我们通常设置 n 参数(表示生成几条路径)和较高的 temperature 参数(比如 0.7,增加推理的多样性)。
1.2 生成知识提示(Generated Knowledge Prompting)
核心思想: 在让模型回答一个需要特定领域知识的问题之前,先让模型自己“生成”或“回忆”相关的背景知识。这相当于先给模型一个“预习”或“知识热身”的步骤。
通俗解释: 就像你问一位专家一个问题前,先让他翻翻书回顾一下相关理论,然后再回答。这样他的回答会更准确、更有依据。
比如:
- 普通提示: “为什么天空是蓝色的?” 模型可能会直接回答:“因为瑞利散射。”
- 生成知识提示:
- 第一步(生成知识): 你先问模型:“关于光的散射,有哪些关键知识?请列出 3 条。”
- 模型回答:
- 知识 1:光是一种电磁波,不同颜色的光波长不同。
- 知识 2:当光穿过大气层时,会与气体分子发生相互作用,产生散射。
- 知识 3:瑞利散射的强度与波长的四次方成反比,波长越短,散射越强。蓝光波长比红光短,因此被散射得更多。
- 第二步(回答问题): 你接着问:“基于上述知识,请解释为什么天空是蓝色的?”
- 模型回答: “因为太阳光中的蓝光波长较短,根据瑞利散射原理,它被大气分子散射得更强烈,所以我们看到的天空呈现蓝色。”
通过先“生成知识”,模型的回答会更有条理、更深入,并且减少了胡编乱造的可能性。
2. 深入理解
2.1 为什么要用这些高级方法?
- 提升确定性: 大语言模型本质上是概率模型,同一个问题问两次,答案可能不同。自一致性通过“投票”机制,极大地削弱了随机性带来的错误,让输出更稳定可靠。这在数学、逻辑推理等需要精确答案的场景中尤其重要。
- 弥补知识短板: 模型虽然训练数据庞大,但对于一些冷门或需要精确回忆的知识,它的内部表示可能不够清晰。生成知识提示相当于一个“外部记忆激活器”,强制模型在回答前整理相关知识点,从而提升回答质量。
- 减少“幻觉”: 模型有时会自信地给出错误答案(即“幻觉”)。自一致性通过多次推理,让“幻觉”答案难以形成多数派;生成知识提示则通过结构化知识的引导,让模型在更坚实的知识基础上推理,减少凭空捏造。
2.2 初学者常见的误区
| 误区 | 解释 | 正确做法 |
| :--- | :--- | :--- |
| 自一致性 = 重复问同一个问题 | 重复问同一个问题(temperature=0)会得到完全一样的答案,没有意义。 | 必须设置较高的 temperature(如 0.5-0.8),让模型每次推理的路径略有不同。 |
| 生成知识提示太啰嗦 | 认为多了一步生成知识,提示词变长,调用成本变高。 | 对于复杂或需要专业知识的任务,这一步的收益远大于成本。对于简单问题(如“今天天气如何?”),则完全不需要。 |
| 自一致性只用于数学题 | 认为它只对计算题有效。 | 自一致性可以应用于任何需要“推理路径”的任务,比如逻辑谜题、代码生成、甚至创意写作中的“最佳情节选择”。 |
| 生成的知识可以不用管 | 直接让模型生成知识,然后接着问,但不对生成的知识做任何引导。 | 最好对生成的知识进行结构化引导,比如“请列出 3 个关键点”、“请用一句话概括核心原理”。这样生成的知识质量更高,更有利于后续的回答。 |
3. 实战演示
让我们通过一个具体的案例,演示如何编写自一致性提示。我们将使用一个经典的逻辑推理问题。
问题: “一个房间里有三个人,分别总是说真话、总是说假话、以及有时说真话有时说假话(随机)。你只能问两个是/否问题,来确定谁是谁。请给出解决方案。”
这是一个典型的逻辑难题。我们会先用普通提示,再用自一致性提示,看看效果差异。
3.1 普通提示(对比基准)
# 普通提示,只问一次
prompt = """
一个房间里有三个人,分别总是说真话、总是说假话、以及有时说真话有时说假话(随机)。
你只能问两个是/否问题,来确定谁是谁。请给出解决方案。
"""
# 假设调用模型,可能得到一个复杂但未必正确的方案。
3.2 自一致性提示(实战步骤)
我们将编写一个完整的提示,要求模型生成 3 条不同的推理路径,并最终汇总答案。
# 自一致性提示
prompt = """
你是一位逻辑推理专家。请解决以下问题。
问题:一个房间里有三个人,分别总是说真话、总是说假话、以及有时说真话有时说假话(随机)。
你只能问两个是/否问题,来确定谁是谁。请给出解决方案。
要求:
1. 请用三种不同的思路或策略来推理这个问题。
2. 对于每种思路,请写出完整的推理步骤和最终答案(谁是说真话的,谁是说假话的,谁是随机的)。
3. 在最后,请汇总三种思路的结果,并给出出现次数最多的最终答案。
请开始你的推理。
"""
# 假设模型返回的内容如下(模拟输出):
model_output = """
**思路一:利用“固定”角色提问**
1. 先问第一个人:“如果我问第二个人‘第一个人是说真话的吗?’,他会怎么回答?”
2. 分析:如果第一个人是真话者,他会如实转述假话者的谎言...
最终推理结果:A是真话者,B是假话者,C是随机者。
**思路二:利用“否定之否定”**
1. 问第一个人:“你是说真话的吗?” 如果他说“是”,他可能是真话者或假话者...
最终推理结果:A是真话者,B是随机者,C是假话者。
**思路三:利用“随机者”的不可预测性**
1. 先问第一个人一个已知答案的问题,比如“1+1=2吗?”...
最终推理结果:A是真话者,B是假话者,C是随机者。
**汇总结果:**
- 思路一:A真,B假,C随机
- 思路二:A真,B随机,C假
- 思路三:A真,B假,C随机
最终答案:A是总是说真话的人,B是总是说假话的人,C是随机说话的人。
"""
print(model_output)
要点分析:
- 明确要求多样性: 我们在提示词中明确要求“用三种不同的思路”,这比单纯依赖
temperature更直接有效。 - 结构化输出: 要求写出“推理步骤”和“最终答案”,方便后续汇总。
- 强制汇总: 最后要求“汇总三种思路的结果”,并“给出出现次数最多的最终答案”。这模拟了自一致性的核心机制。
- 对比普通提示: 如果只用普通提示,模型可能只给出一种方案,并且可能包含逻辑漏洞。而自一致性提示通过汇聚多个推理路径,得出的答案往往更稳健。即使某条路径有错(比如思路二),只要多数路径指向同一答案,最终结果就是可靠的。
4. 关键要点
- 自一致性通过“多次推理 + 多数投票”提升答案的鲁棒性,特别适合数学、逻辑等有确定答案的任务。关键在于设置较高的
temperature并生成多条推理路径。 - 生成知识提示通过“先回忆知识,再回答问题”的两步法,有效减少模型幻觉,提升回答的深度和准确性。适用于需要专业知识的问答。
- 两种方法可以结合使用:例如,先用生成知识提示让模型回忆相关公式,再用自一致性提示进行多次计算并投票,效果会更好。
- 不要滥用高级方法:对于简单问题(如“法国的首都是哪里?”),直接提问即可。高级方法会增加计算成本和响应时间,应在复杂问题上“精准投放”。
- 提示词的结构化至关重要:在自一致性提示中,明确要求“列出不同思路”和“汇总结果”;在生成知识提示中,要求“列出关键知识点”。清晰的结构能引导模型产出高质量的输出。
✏️ 练习任务
任务 1:自一致性解决数学应用题
练习方向: 尝试自一致性提示并比较结果。
输入: 使用以下数学应用题,编写一个自一致性提示(要求模型用 3 种不同方法求解并投票)。
问题: “一个农场里,鸡和兔子共有 35 个头,94 只脚。请问鸡和兔子各有多少只?”
期望输出格式:
- 方法一(如:假设法):... 步骤 ... 答案:鸡 X 只,兔 Y 只。
- 方法二(如:方程法):... 步骤 ... 答案:鸡 X 只,兔 Y 只。
- 方法三(如:抬腿法):... 步骤 ... 答案:鸡 X 只,兔 Y 只。
- 汇总结果: 多数方法得出的答案一致,最终答案是:鸡 23 只,兔 12 只。
提示: 可以手动模拟模型输出,或者使用任何你方便调用的 AI 模型(如 ChatGPT、文心一言等)来完成这个练习。重点在于体验“多次推理 + 投票”的流程。
任务 2(选做):生成知识提示解决专业问题
进阶挑战: 选择一个你熟悉的专业领域(如编程、医学、法律),设计一个生成知识提示。
- 第一步: 让模型生成 3 条关于该领域某个概念的核心知识。
- 第二步: 基于这些知识,让模型回答一个具体问题。
示例(编程领域):
- 第一步提示: “请列出关于 Python 中‘装饰器’的 3 个关键知识点。”
- 第二步提示: “基于上述知识,请解释为什么下面的代码会输出 'Hello, World!':”
@my_decorator def say_hello(): print("Hello!") say_hello()
目的: 感受“生成知识”如何让模型在回答时更有条理和深度。
💡 下一节我们将学习相关的进阶内容,探索如何将这些高级方法组合起来,构建更强大的提示链(Prompt Chaining),以应对复杂的工作流。
本节由 StudyAI8 AI 课程团队生成并审核。