Day5---深入大模型探索提示工程:幻觉抑制与反思机制(基于通义千问)
本文探讨了如何通过提示工程抑制大语言模型的幻觉现象并建立反思机制。以通义千问为例,介绍了两种核心技巧:1)幻觉抑制,通过明确要求模型"不知道就说不知道"和引用可靠来源,避免无根据回答;2)反思机制,引导模型对自身回答进行检查修正。通过对比实验展示了带反思机制的Prompt能显著提升回答的严谨性,如对蓬莱仙岛问题的回答从简单"不知道"扩展为包含详细论证的结论。
Day5—深入大模型探索提示工程:幻觉抑制与反思机制(基于通义千问)
摘要:本文聚焦于提示工程中的幻觉抑制与反思机制,以通义千问模型为例,详细阐述如何运用这两种技巧优化模型回答。通过学习,读者将掌握如何引导模型避免产生幻觉,以及利用反思机制提升回答的准确性和可靠性。
一、引言
在使用大语言模型过程中,幻觉现象(模型生成看似合理但实际错误或无依据的内容)时有发生,同时模型回答可能存在一些潜在错误。幻觉抑制和反思机制能够有效应对这些问题,使模型输出更加可靠、准确。接下来我们基于通义千问模型深入探讨这两种技巧。
二、核心任务
(一)幻觉抑制技巧
幻觉抑制旨在引导模型避免产生无根据的内容,确保回答基于可靠信息。常见的方法是明确要求模型 “不知道就说不知道” 以及 “引用可靠来源”。
-
“不知道就说不知道”:在构建提示时,清晰告知模型,如果对于问题没有确切答案,需如实表明。例如,对于一些缺乏明确信息的问题,如 “2050 年人类是否已经实现火星大规模移民?”,提示可以设计为 “请你回答这个问题,如果不知道确切答案,请明确表述‘不知道’。问题是:2050 年人类是否已经实现火星大规模移民?”。这样一来,通义千问若确实不清楚相关信息,就会回答 “不知道”,避免编造内容。
-
“引用可靠来源”:当模型能够回答问题时,要求其引用可靠来源以增强回答的可信度。比如对于问题 “地球的直径是多少?”,提示可以是 “请回答地球的直径是多少,并引用可靠来源。” 通义千问可能回答 “地球的平均直径约为 12742 千米,该数据来源于科学研究及众多天文学相关资料。” 通过这种方式,我们可以判断模型回答的依据是否可靠。
(二)反思机制
反思机制是让模型对自身回答进行检查,发现并修正可能存在的错误。我们可以在提示中引导模型从不同角度审视自己的回答。例如,对于一个数学问题的回答,提示可以设计为 “请先回答这个数学问题:567 + 345 =? 回答完成后,请仔细检查你的答案,思考计算过程是否合理,是否存在计算错误,如果有,请修正并给出正确答案。” 通义千问首先会给出答案,如 “567 + 345 = 912”,然后进入反思环节,可能会进一步确认 “经过再次检查,个位 7 + 5 = 12,向十位进 1,十位 6 + 4 + 1 = 11,向百位进 1,百位 5 + 3 + 1 = 9,答案 912 计算过程合理,没有错误。”
三、补充任务
(一)编写带幻觉抑制和反思机制的 Prompt
- 示例一:一般性知识问题
from openai import OpenAI
# 带幻觉抑制和反思机制的Prompt
prompt1 = "请回答这个问题:传说中蓬莱仙岛的具体位置在哪里?如果不知道确切答案,请明确表述‘不知道’。回答完成后,请反思你的答案是否合理,是否有足够依据,如果发现问题,请修正。"
# 对比无反思机制的Prompt
prompt2 = "请回答这个问题:传说中蓬莱仙岛的具体位置在哪里?如果不知道确切答案,请明确表述‘不知道’。"
try:
client = OpenAI(
api_key="你的APIZ_KEY",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
model="qwen-plus", # 模型列表: https://help.aliyun.com/model-studio/getting-started/models
messages=[
{"role": "user", "content": prompt2}
]
)
print(completion.choices[0].message.content)
except Exception as e:
print(f"错误信息:{e}")
print("请参考文档:https://help.aliyun.com/model-studio/developer-reference/error-code")
带幻觉抑制和反思机制的Prompt回答结果:
不知道。
反思:
蓬莱仙岛是中国古代神话传说中的海上仙山之一(与方丈、瀛洲并称“三神山”),最早见于《史记·封禅书》等文献,记载为秦始皇、汉武帝遣方士入海求仙药之所。但所有史料均未提供其确切地理坐标;历代学者(如顾颉刚等)及现代考古、地理研究一致认为,蓬莱并非真实存在的岛屿,而是融合了海洋雾气幻象(如海市蜃楼)、道教神仙思想与政治诉求(如帝王求长生)而形成的文学与信仰意象。山东蓬莱区虽有“蓬莱阁”,并以“蓬莱”为名,但这是后世因传说附会而命名的地名,并非传说中仙岛的原址。因此,不存在可考证的“具体位置”。此前若给出任何经纬度或现实岛屿名称(如长山列岛、济州岛等),均属误传或过度解读,缺乏可靠依据。当前回答“不知道”准确、审慎,符合历史学与神话学共识。
对比无反思机制的Prompt回答结果:
不知道。
示例二:逻辑推理问题
from openai import OpenAI
# 带幻觉抑制和反思机制的Prompt
prompt1 = "请回答这个逻辑推理问题:有A、B、C三个人,A说B在说谎,B说C在说谎,C说A和B都在说谎。请问谁在说真话,谁在说假话?回答完成后,请从逻辑关系上再次审视你的答案,检查是否存在矛盾,如果有,请修正。"
# 对比无反思机制的Prompt
prompt2 = "请回答这个逻辑推理问题:有A、B、C三个人,A说B在说谎,B说C在说谎,C说A和B都在说谎。请问谁在说真话,谁在说假话?"
try:
client = OpenAI(
api_key="你的APIZ_KEY",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
model="qwen-plus", # 模型列表: https://help.aliyun.com/model-studio/getting-started/models
messages=[
{"role": "user", "content": prompt1}
]
)
print(completion.choices[0].message.content)
except Exception as e:
print(f"错误信息:{e}")
print("请参考文档:https://help.aliyun.com/model-studio/developer-reference/error-code")
带幻觉抑制和反思机制的Prompt回答结果:
我们来逐条分析这个逻辑推理题。
有三人:A、B、C
他们的陈述如下:
- A说:“B在说谎。” → 即 A 声称 **B 为假话者**(¬B)
- B说:“C在说谎。” → 即 B 声称 **C 为假话者**(¬C)
- C说:“A和B都在说谎。” → 即 C 声称 **A 为假话者 且 B 为假话者**(¬A ∧ ¬B)
我们用布尔变量表示每人是否说真话(即命题为真):
- 设 A = True 表示 A 说的是真话;A = False 表示 A 在说谎(即其陈述为假)
同理定义 B、C ∈ {True, False}
注意:**每人说的话是一个命题,其真假取决于该命题的逻辑值,而该命题的真假必须与说话者本人的真假性一致**。
即:
- 若 A 说真话(A = T),则其陈述“B在说谎”为真 ⇒ B = F
- 若 A 说假话(A = F),则其陈述“B在说谎”为假 ⇒ “B在说谎”为假 ⇒ B 实际上**没说谎** ⇒ B = T
所以,A 的陈述是 “B = F”,因此:
✅ A = T ⇔ B = F
✅ A = F ⇔ B = T
即:**A 与 B 的真假性相反** → A ⇔ ¬B (等价于 A ⊕ B = True)
同理分析 B 的陈述:“C在说谎” → 即 “C = F”
⇒ B = T ⇔ C = F ⇒ B ⇔ ¬C
即:**B 与 C 相反** → B = ¬C
C 的陈述:“A 和 B 都在说谎” → 即 “A = F 且 B = F”
⇒ C = T ⇔ (A = F ∧ B = F)
即:C = T ⇔ (¬A ∧ ¬B)
等价于:C = ¬A ∧ ¬B
(注意:这是**定义式**,不是双向等价推导的假设,而是由C的陈述内容决定的约束)
现在我们有三个逻辑约束:
1. A ⇔ ¬B
2. B ⇔ ¬C
3. C ⇔ (¬A ∧ ¬B)
我们可以代入求解。
---
**方法一:枚举所有 2³ = 8 种可能,验证哪组满足全部约束**
| A | B | C | A⇔¬B? | B⇔¬C? | C⇔(¬A∧¬B)? | 全部满足? |
|---|---|---|--------|--------|--------------|-------------|
| T | T | T | F | F | F(¬A∧¬B=F) | ❌ |
| T | T | F | F | T | F⇔F? → T(C=F, ¬A∧¬B=F)→ T | ❌(第一项假) |
| T | F | T | T | F | T⇔(F∧T)=F? → F | ❌ |
| T | F | F | T | T | F⇔(F∧T)=F? → T | ✅ 检查:A=T, B=F → A⇔¬B: T⇔T ✔;B=F, C=F → B⇔¬C? F⇔T? ❌ 等等!B=F, C=F ⇒ ¬C = T ⇒ B⇔¬C 是 F⇔T = **False** → 这行不满足第2条!修正表格:|
重新严谨计算(避免手误):
| A | B | C | ¬B | A⇔¬B | ¬C | B⇔¬C | ¬A | ¬B | ¬A∧¬B | C⇔(¬A∧¬B) | 全部? |
|---|---|---|----|-------|----|--------|----|----|----------|----------------|--------|
| T | T | T | F | F | F | F | F | F | F | T⇔F = F | ❌ |
| T | T | F | F | F | T | T | F | F | F | F⇔F = T | ❌(第一项假) |
| T | F | T | T | T | F | F | F | T | F | T⇔F = F | ❌ |
| T | F | F | T | T | T | T | F | T | F | F⇔F = T | ✅?检查:A=T, B=F → A⇔¬B = T⇔T = T ✔;B=F, C=F → B⇔¬C = F⇔T = **F** ❌ → 错!因为 ¬C = ¬F = T,B=F,所以 F⇔T = False。所以第2条不满足。 |
继续:
| A | B | C | ¬B | A⇔¬B | ¬C | B⇔¬C | ¬A | ¬B | ¬A∧¬B | C⇔(¬A∧¬B) |
|---|---|---|----|-------|----|--------|----|----|----------|----------------|
| F | T | T | F | F⇔F=T | F | T⇔F=F | T | F | F | T⇔F=F | ❌ |
| F | T | F | F | F⇔F=T | T | T⇔T=T | T | F | F | F⇔F=T | ✅?检查:A=F, B=T → A⇔¬B: F⇔F = T ✔;B=T, C=F → B⇔¬C: T⇔T = T ✔;C=F,¬A∧¬B = T∧F = F → C⇔(¬A∧¬B) = F⇔F = T ✔ → **全部满足!** |
→ 这组:**A=F, B=T, C=F** 满足全部三条。
再验证最后一组(F,F,T)和(F,F,F):
| A | B | C | ¬B | A⇔¬B | ¬C | B⇔¬C | ¬A | ¬B | ¬A∧¬B | C⇔(¬A∧¬B) |
|---|---|---|----|-------|----|--------|----|----|----------|----------------|
| F | F | T | T | F⇔T=F | F | F⇔F=T | T | T | T | T⇔T=T | ❌(第一项假) |
| F | F | F | T | F⇔T=F | T | F⇔T=F | T | T | T | F⇔T=F | ❌ |
所以**唯一满足全部约束的是:A = False, B = True, C = False**
即:
- A 在说谎
- B 在说真话
- C 在说谎
---
**验证原始陈述是否自洽:**
- A说:“B在说谎。” → 但B实际说真话,所以A这句话是**假的** → 符合 A 在说谎 ✔
- B说:“C在说谎。” → C确实在说谎(见下),所以B这句话为**真** → 符合 B 说真话 ✔
- C说:“A和B都在说谎。” → 实际是 A说谎(T)、B说真话(F),所以“A和B都撒谎”为**假**(因为B没撒谎)→ C说了假话 → 符合 C 在说谎 ✔
✅ 完全自洽,无矛盾。
---
**逻辑关系再审视(关键闭环检验):**
我们有:
- A ⇔ ¬B
- B ⇔ ¬C
- C ⇔ (¬A ∧ ¬B)
由前两式可得:
A ⇔ ¬B ⇔ ¬(¬C) ⇔ C ⇒ **A ⇔ C**
即 A 和 C 同真或同假。
但我们刚才解出 A=F, C=F → 满足 A⇔C ✔
再代入第三式:C ⇔ (¬A ∧ ¬B)
左边 C = F
右边 ¬A ∧ ¬B = T ∧ F = F → F⇔F = T ✔
若强行假设 A=T,则由 A⇔¬B ⇒ B=F;由 B⇔¬C ⇒ F⇔¬C ⇒ ¬C=F ⇒ C=T;
再看 C⇔(¬A∧¬B):左边 C=T,右边 ¬A∧¬B = F∧T = F → T⇔F = F ❌ 不成立。
其他假设均导致矛盾,仅 A=F, B=T, C=F 成立。
---
✅ **最终结论:**
- **A 在说谎**
- **B 在说真话**
- **C 在说谎**
无矛盾,逻辑自洽。
对比无反思机制的Prompt回答结果:
我们来逐个分析这个逻辑推理题。
有三人:A、B、C
他们的陈述如下:
- **A说**:“B在说谎。” → 即 A 声称 **B 说假话**
- **B说**:“C在说谎。” → 即 B 声称 **C 说假话**
- **C说**:“A和B都在说谎。” → 即 C 声称 **A 说假话 且 B 说假话**
我们假设每个人要么**总是说真话**,要么**总是说假话**(经典“说谎者/诚实者”设定),即每人真假状态固定(非混合)。
设:
- $ a $:A说真话(True)或说假话(False)
- $ b $:B说真话
- $ c $:C说真话
那么,根据他们说的话,可列出逻辑等式(因为若某人说真话,则其陈述为真;若说假话,则其陈述为假):
1. A说“B在说谎” → 即 A说“$ b = \text{False} $”。
- 若A说真话($ a = T $),则该陈述为真 ⇒ $ b = F $
- 若A说假话($ a = F $),则该陈述为假 ⇒ “B在说谎”是假的 ⇒ B没说谎 ⇒ $ b = T $
✅ 所以:**$ a \leftrightarrow \neg b $**
(a 与 b 的真假相反)
2. B说“C在说谎” → 即 B说“$ c = F $”
同理:若 $ b = T $,则 $ c = F $;若 $ b = F $,则 $ c = T $
✅ 所以:**$ b \leftrightarrow \neg c $**
3. C说“A和B都在说谎” → 即 C说“$ a = F $ 且 $ b = F $”
- 若 $ c = T $,则该合取命题为真 ⇒ $ a = F $ 且 $ b = F $
- 若 $ c = F $,则该合取命题为假 ⇒ “$ a = F $ 且 $ b = F $”为假 ⇒ 即 $ a = T $ 或 $ b = T $(至少一个为真)
✅ 所以:**$ c \leftrightarrow (\neg a \land \neg b) $**
现在我们有三个逻辑方程:
(1) $ a \equiv \neg b $
(2) $ b \equiv \neg c $
(3) $ c \equiv (\neg a \land \neg b) $
我们来求解这个布尔方程组。
---
**方法:代入法**
由 (1):$ a = \neg b $
由 (2):$ b = \neg c $ ⇒ $ c = \neg b $
所以:$ a = \neg b $,$ c = \neg b $ ⇒ $ a = c $
代入 (3):
左边:$ c $
右边:$ \neg a \land \neg b = \neg(\neg b) \land \neg b = b \land \neg b = \text{False} $
所以右边恒为 **False**
⇒ 左边 $ c = \text{False} $
因此:
- $ c = F $
- 由 (2) $ b = \neg c = \neg F = T $
- 由 (1) $ a = \neg b = \neg T = F $
所以得到:
✅ $ a = F $(A说假话)
✅ $ b = T $(B说真话)
✅ $ c = F $(C说假话)
验证是否满足所有陈述:
- A说“B在说谎”:但B实际说真话,所以A这句话是**假的** → 符合A说假话 ✔️
- B说“C在说谎”:C确实说假话 → B这句话为**真** → 符合B说真话 ✔️
- C说“A和B都在说谎”:但A说假话(T),B说真话(F),所以“A和B都在说谎”是**假的**(因为B没说谎)→ C说了假话,符合C说假话 ✔️
全部一致!
---
✅ **答案:**
- **A 在说谎**(说假话)
- **B 在说真话**
- **C 在说谎**(说假话)
即:**只有 B 说真话,A 和 C 都在说谎。**
(二)分析结果
-
一般性知识问题:
-
带幻觉抑制和反思机制:通义千问回答 “不知道。反思:由于蓬莱仙岛是传说中的地方,并无确切资料表明其具体位置,回答‘不知道’是合理的,无需修正。”
-
无反思机制:通义千问直接回答 “不知道”。对比发现,带反思机制的回答增加了对答案合理性的思考过程,虽然在这个例子中结论相同,但在一些复杂问题上,反思机制有助于模型更深入地审视答案。
-
-
逻辑推理问题:
-
带幻觉抑制和反思机制:通义千问先给出推理过程和答案,如 “假设 A 说的是真话,那么 B 说的就是假话,若 B 说的是假话,C 说的就是真话,但 C 说 A 和 B 都在说谎与 A 说真话矛盾,所以 A 说的是假话。假设 B 说的是真话,那么 C 说的就是假话,C 说 A 和 B 都在说谎为假,即 A 或 B 至少有一个说真话,符合 B 说真话的假设。假设 C 说的是真话,那 A 和 B 都在说谎,可 A 说 B 在说谎就成了真话,产生矛盾。所以结论是 B 说的是真话,A 和 C 说的是假话。反思:再次梳理逻辑关系,假设和推理过程均无矛盾,答案合理。”
-
无反思机制:通义千问可能给出类似的推理和答案,但缺少对答案从逻辑关系上再次审视的过程。带反思机制的回答通过再次审视逻辑关系,增强了答案的可靠性。
-
四、总结
通过今天的学习,我们深入了解了提示工程中的幻觉抑制和反思机制,并基于通义千问模型进行了实践。幻觉抑制帮助我们减少模型产生幻觉的可能性,而反思机制则提升了模型回答的准确性和可靠性。
在实际应用中,根据不同类型的问题灵活运用这两种机制,能够显著优化模型的输出质量。 。如果在学习过程中遇到模型回答不符合预期的情况,检查 Prompt 的引导是否清晰明确,是否合理地激发了模型的幻觉抑制和反思能力。希望大家通过掌握这些技巧,更好地驾驭大语言模型,挖掘其在各种场景下的应用潜力。
注意:请将 "你的通义千问API密钥" 替换为真实的通义千问 API 地址和密钥。实际使用时,需根据通义千问的官方文档对请求参数和提示内容进行适当调整。
欢迎大家在评论区分享学习心得和遇到的问题,我们一起探讨,共同进步。感谢阅读!
更多推荐



所有评论(0)