Day5—深入大模型探索提示工程:幻觉抑制与反思机制(基于通义千问)

摘要:本文聚焦于提示工程中的幻觉抑制与反思机制,以通义千问模型为例,详细阐述如何运用这两种技巧优化模型回答。通过学习,读者将掌握如何引导模型避免产生幻觉,以及利用反思机制提升回答的准确性和可靠性。

一、引言

在使用大语言模型过程中,幻觉现象(模型生成看似合理但实际错误或无依据的内容)时有发生,同时模型回答可能存在一些潜在错误。幻觉抑制和反思机制能够有效应对这些问题,使模型输出更加可靠、准确。接下来我们基于通义千问模型深入探讨这两种技巧。

二、核心任务

(一)幻觉抑制技巧

幻觉抑制旨在引导模型避免产生无根据的内容,确保回答基于可靠信息。常见的方法是明确要求模型 “不知道就说不知道” 以及 “引用可靠来源”。

  1. “不知道就说不知道”:在构建提示时,清晰告知模型,如果对于问题没有确切答案,需如实表明。例如,对于一些缺乏明确信息的问题,如 “2050 年人类是否已经实现火星大规模移民?”,提示可以设计为 “请你回答这个问题,如果不知道确切答案,请明确表述‘不知道’。问题是:2050 年人类是否已经实现火星大规模移民?”。这样一来,通义千问若确实不清楚相关信息,就会回答 “不知道”,避免编造内容。

  2. “引用可靠来源”:当模型能够回答问题时,要求其引用可靠来源以增强回答的可信度。比如对于问题 “地球的直径是多少?”,提示可以是 “请回答地球的直径是多少,并引用可靠来源。” 通义千问可能回答 “地球的平均直径约为 12742 千米,该数据来源于科学研究及众多天文学相关资料。” 通过这种方式,我们可以判断模型回答的依据是否可靠。

(二)反思机制

反思机制是让模型对自身回答进行检查,发现并修正可能存在的错误。我们可以在提示中引导模型从不同角度审视自己的回答。例如,对于一个数学问题的回答,提示可以设计为 “请先回答这个数学问题:567 + 345 =? 回答完成后,请仔细检查你的答案,思考计算过程是否合理,是否存在计算错误,如果有,请修正并给出正确答案。” 通义千问首先会给出答案,如 “567 + 345 = 912”,然后进入反思环节,可能会进一步确认 “经过再次检查,个位 7 + 5 = 12,向十位进 1,十位 6 + 4 + 1 = 11,向百位进 1,百位 5 + 3 + 1 = 9,答案 912 计算过程合理,没有错误。”

三、补充任务

(一)编写带幻觉抑制和反思机制的 Prompt

  1. 示例一:一般性知识问题
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回答结果:

我们来逐条分析这个逻辑推理题。

有三人:ABC  
他们的陈述如下:

- A说:“B在说谎。” → 即 A 声称 **B 为假话者**(¬B- B说:“C在说谎。” → 即 B 声称 **C 为假话者**(¬C- C说:“AB都在说谎。” → 即 C 声称 **A 为假话者 且 B 为假话者**(¬A ∧ ¬B)

我们用布尔变量表示每人是否说真话(即命题为真):
-A = True 表示 A 说的是真话;A = False 表示 A 在说谎(即其陈述为假)  
同理定义 BC{True, False}

注意:**每人说的话是一个命题,其真假取决于该命题的逻辑值,而该命题的真假必须与说话者本人的真假性一致**。  
即:  
-A 说真话(A = T),则其陈述“B在说谎”为真 ⇒ B = F  
-A 说假话(A = F),则其陈述“B在说谎”为假 ⇒ “B在说谎”为假 ⇒ B 实际上**没说谎**B = T  

所以,A 的陈述是 “B = F”,因此:  
✅ A = TB = FA = FB = T  
即:**AB 的真假性相反**A ⇔ ¬B  (等价于 AB = True)

同理分析 B 的陈述:“C在说谎” → 即 “C = F”  
⇒ B = TC = FB ⇔ ¬C  
即:**BC 相反**B = ¬C

C 的陈述:“AB 都在说谎” → 即 “A = FB = F”  
⇒ C = T  (A = FB = 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      | FF?TC=F, ¬A∧¬B=F)→ T | ❌(第一项假) |
| T | F | T | T      | F      | T(FT)=F?F ||
| T | F | F | T      | T      | F(FT)=F?T | ✅ 检查:A=T, B=FA⇔¬B: TT ✔;B=F, C=FB⇔¬C? FT? ❌ 等等!B=F, C=F ⇒ ¬C = TB⇔¬CFT = **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        | TF = F         ||
| T | T | F | F  | F     | T  | T      | F  | F  | F        | FF = T         | ❌(第一项假) |
| T | F | T | T  | T     | F  | F      | F  | T  | F        | TF = F         ||
| T | F | F | T  | T     | T  | T      | F  | T  | F        | FF = T         | ✅?检查:A=T, B=FA⇔¬B = TT = T ✔;B=F, C=FB⇔¬C = FT = **F** ❌ → 错!因为 ¬C = ¬F = TB=F,所以 FT = False。所以第2条不满足。 |

继续:

| A | B | C | ¬B | A⇔¬B | ¬C | B⇔¬C | ¬A | ¬B | ¬A∧¬B | C(¬A∧¬B) |
|---|---|---|----|-------|----|--------|----|----|----------|----------------|
| F | T | T | F  | FF=T | F  | TF=F | T  | F  | F        | TF=F         ||
| F | T | F | F  | FF=T | T  | TT=T | T  | F  | F        | FF=T         | ✅?检查:A=F, B=TA⇔¬B: FF = T ✔;B=T, C=FB⇔¬C: TT = T ✔;C=F,¬A∧¬B = TF = FC(¬A∧¬B) = FF = 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  | FT=F | F  | FF=T | T  | T  | T        | TT=T         | ❌(第一项假) |
| F | F | F | T  | FT=F | T  | FT=F | T  | T  | T        | FT=F         ||

所以**唯一满足全部约束的是:A = False, B = True, C = False**

即:
- A 在说谎  
- B 在说真话  
- C 在说谎  

---

**验证原始陈述是否自洽:**

- A说:“B在说谎。” → 但B实际说真话,所以A这句话是**假的** → 符合 A 在说谎 ✔  
- B说:“C在说谎。” → C确实在说谎(见下),所以B这句话为**** → 符合 B 说真话 ✔  
- C说:“AB都在说谎。” → 实际是 A说谎(T)、B说真话(F),所以“AB都撒谎”为****(因为B没撒谎)→ C说了假话 → 符合 C 在说谎 ✔  

✅ 完全自洽,无矛盾。

---

**逻辑关系再审视(关键闭环检验):**  
我们有:  
- A ⇔ ¬B  
- B ⇔ ¬C  
- C  (¬A ∧ ¬B)  

由前两式可得:  
A ⇔ ¬B¬(¬C)C**AC**AC 同真或同假。

但我们刚才解出 A=F, C=F → 满足 AC ✔

再代入第三式:C  (¬A ∧ ¬B)  
左边 C = F  
右边 ¬A ∧ ¬B = TF = FFF = T ✔

若强行假设 A=T,则由 A⇔¬BB=F;由 B⇔¬CF⇔¬C ⇒ ¬C=FC=T;  
再看 C(¬A∧¬B):左边 C=T,右边 ¬A∧¬B = FT = FTF = F ❌ 不成立。

其他假设均导致矛盾,仅 A=F, B=T, C=F 成立。

---**最终结论:**  
- **A 在说谎**  
- **B 在说真话**  
- **C 在说谎**  

无矛盾,逻辑自洽。

对比无反思机制的Prompt回答结果:

我们来逐个分析这个逻辑推理题。

有三人:ABC  
他们的陈述如下:

- **A**:“B在说谎。” → 即 A 声称 **B 说假话**  
- **B**:“C在说谎。” → 即 B 声称 **C 说假话**  
- **C**:“AB都在说谎。” → 即 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说“AB都在说谎” → 即 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说“AB都在说谎”:但A说假话(T),B说真话(F),所以“AB都在说谎”是**假的**(因为B没说谎)→ C说了假话,符合C说假话 ✔️

全部一致!

---**答案:**  
- **A 在说谎**(说假话)  
- **B 在说真话**  
- **C 在说谎**(说假话)

即:**只有 B 说真话,AC 都在说谎。**

(二)分析结果

  1. 一般性知识问题

    • 带幻觉抑制和反思机制:通义千问回答 “不知道。反思:由于蓬莱仙岛是传说中的地方,并无确切资料表明其具体位置,回答‘不知道’是合理的,无需修正。”

    • 无反思机制:通义千问直接回答 “不知道”。对比发现,带反思机制的回答增加了对答案合理性的思考过程,虽然在这个例子中结论相同,但在一些复杂问题上,反思机制有助于模型更深入地审视答案。

  2. 逻辑推理问题

    • 带幻觉抑制和反思机制:通义千问先给出推理过程和答案,如 “假设 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 地址和密钥。实际使用时,需根据通义千问的官方文档对请求参数和提示内容进行适当调整。

欢迎大家在评论区分享学习心得和遇到的问题,我们一起探讨,共同进步。感谢阅读!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐