大模型幻觉控制的提示词策略
AI 导读
大模型幻觉控制的提示词策略 通过提示词工程降低 LLM 幻觉率:接地、引用、自检与多模型交叉验证 幻觉的本质 LLM 的幻觉(Hallucination)是指模型生成看似合理但实际上不准确或完全虚构的内容。理解幻觉的本质是有效控制它的前提。 幻觉分类 ┌──────────────────────────────────────────────────────────────┐ │ LLM...
大模型幻觉控制的提示词策略
通过提示词工程降低 LLM 幻觉率:接地、引用、自检与多模型交叉验证
幻觉的本质
LLM 的幻觉(Hallucination)是指模型生成看似合理但实际上不准确或完全虚构的内容。理解幻觉的本质是有效控制它的前提。
幻觉分类
┌──────────────────────────────────────────────────────────────┐
│ LLM 幻觉分类 │
├───────────────────┬──────────────────────────────────────────┤
│ 事实性幻觉 │ 生成与真实世界不符的事实 │
│ (Factual) │ 例:"爱因斯坦获得 1922 年物理诺贝尔奖" │
│ │ (实际是 1921 年) │
├───────────────────┼──────────────────────────────────────────┤
│ 忠实性幻觉 │ 生成与输入上下文不符的内容 │
│ (Faithfulness) │ 例:摘要中包含原文没有的信息 │
├───────────────────┼──────────────────────────────────────────┤
│ 一致性幻觉 │ 模型自我矛盾 │
│ (Consistency) │ 例:前面说 A 是对的,后面又说 A 是错的 │
├───────────────────┼──────────────────────────────────────────┤
│ 捏造性幻觉 │ 完全虚构不存在的实体、事件或引用 │
│ (Fabrication) │ 例:编造不存在的论文、API、库名 │
└───────────────────┴──────────────────────────────────────────┘
幻觉产生的根因
训练数据 ──→ 统计模式学习 ──→ 概率性生成
│
不区分"事实"和"模式"
│
v
模型学到了"看起来像对的"的文本模式
而不是"实际上是对的"的事实知识
一、接地策略(Grounding)
接地(Grounding)是将 LLM 的输出"锚定"到可信的信息源上,而不是让它自由发挥。
策略一:提供参考材料
<system>
你是一个严谨的信息分析助手。
你只能基于提供的参考材料回答问题。
如果参考材料中没有相关信息,必须明确说明"根据提供的材料,无法回答此问题"。
严禁使用参考材料以外的知识。
</system>
<reference_materials>
<document id="doc1" source="annual_report_2025.pdf">
{document_content_1}
</document>
<document id="doc2" source="market_analysis_q4.xlsx">
{document_content_2}
</document>
</reference_materials>
<task>
基于以上参考材料,回答以下问题:
{user_question}
</task>
<constraints>
1. 所有结论必须引用具体的文档来源(使用 [doc_id] 格式)
2. 如果答案需要推理,标明推理依据和推理过程
3. 对不确定的信息标注置信度
4. 不得编造参考材料中不存在的数据或事实
5. 如果不同文档的信息矛盾,指出矛盾并列出两方说法
</constraints>
策略二:RAG + 接地提示
class GroundedRAGPrompt:
"""RAG + 接地提示词模板"""
TEMPLATE = """<system>
你是一个基于知识库的问答助手。
你的回答必须严格基于检索到的文档片段。
</system>
<retrieved_context>
{context_with_sources}
</retrieved_context>
<question>
{question}
</question>
<answer_rules>
1. 仅使用上述检索结果中的信息回答
2. 每个关键陈述后附加来源引用 [source_N]
3. 如果检索结果不包含足够信息,回答"根据现有信息无法确定"
4. 如果检索结果包含矛盾信息,列出所有说法并标注来源
5. 区分"文档明确陈述的事实"和"基于文档的合理推断"
6. 推断部分必须标记为"推断"并说明推理依据
</answer_rules>
<output_format>
## 回答
[基于文档的回答,每句关键信息附 [source_N] 引用]
## 来源
- [source_1]: {文档标题} - {相关段落摘要}
- [source_2]: {文档标题} - {相关段落摘要}
## 置信度
- 高:文档明确陈述
- 中:基于文档的合理推断
- 低:信息不足,仅为推测
</output_format>"""
def build(self, question: str,
retrieved_docs: list[dict]) -> str:
context = self._format_docs(retrieved_docs)
return self.TEMPLATE.format(
context_with_sources=context,
question=question
)
def _format_docs(self, docs: list[dict]) -> str:
parts = []
for i, doc in enumerate(docs, 1):
parts.append(
f"[source_{i}] ({doc['title']}, "
f"relevance: {doc['score']:.2f})\n"
f"{doc['content']}"
)
return "\n\n---\n\n".join(parts)
策略三:知识边界声明
<knowledge_boundary>
以下是你可以可靠回答的范围:
- 截至训练数据截止日期的公开知识
- 本次对话中提供的参考材料
- 代码和技术文档中的信息
以下是你不应该回答的范围:
- 实时数据(股价、天气、新闻等)
- 个人隐私信息
- 未经验证的医学/法律建议
- 训练数据截止日期之后的事件
当问题落在不可靠范围内时,你必须:
1. 明确说明你的知识可能不是最新的
2. 建议用户通过权威来源验证
3. 不要编造看似合理的答案
</knowledge_boundary>
二、引用策略(Citation)
强制引用格式
<citation_rules>
你的每个回答都必须遵循以下引用规范:
1. 直接引用:用 [ref:N] 标注来源编号
例:"全球 AI 市场规模预计达到 X 亿美元 [ref:3]"
2. 间接推断:用 [inferred from ref:N] 标注推断依据
例:"这意味着增长率约为 15% [inferred from ref:3, ref:5]"
3. 无法引用:用 [no source] 标注
例:"一般认为... [no source - 常识性判断]"
4. 引用链:如果结论依赖多个来源的组合
例:"综合 [ref:2] 和 [ref:4] 的数据... [combined: ref:2, ref:4]"
每个回答结尾必须包含引用列表:
## References
- [ref:1]: {来源描述}
- [ref:2]: {来源描述}
</citation_rules>
引用验证
class CitationValidator:
"""引用验证器:检查 LLM 输出的引用是否正确"""
def validate(self, output: str,
source_documents: list[dict]) -> ValidationResult:
"""验证输出中的引用是否有据可查"""
citations = self._extract_citations(output)
claims = self._extract_claims(output)
results = []
for claim in claims:
cited_refs = claim.get("references", [])
if not cited_refs:
results.append({
"claim": claim["text"],
"status": "uncited",
"severity": "warning"
})
continue
# 检查引用的来源是否支持这个声明
for ref in cited_refs:
source = self._get_source(ref, source_documents)
if source:
supports = self._check_support(
claim["text"], source["content"]
)
results.append({
"claim": claim["text"],
"reference": ref,
"status": "supported" if supports else "unsupported",
"severity": "error" if not supports else "ok"
})
else:
results.append({
"claim": claim["text"],
"reference": ref,
"status": "source_not_found",
"severity": "error"
})
return ValidationResult(
total_claims=len(claims),
cited_claims=sum(1 for c in claims if c.get("references")),
supported_claims=sum(
1 for r in results if r["status"] == "supported"
),
issues=[r for r in results if r["severity"] != "ok"]
)
def _check_support(self, claim: str, source_text: str) -> bool:
"""用 LLM 检查来源是否支持声明"""
response = judge_llm.generate(f"""
判断以下来源文本是否支持给出的声明。
声明:{claim}
来源文本:{source_text}
仅回答 "SUPPORTS" 或 "DOES_NOT_SUPPORT"。
""")
return "SUPPORTS" in response
三、自检策略(Self-Verification)
策略一:生成后自检
<task>
{original_task}
</task>
<self_verification>
在给出最终答案之前,请执行以下自检步骤:
1. 事实核查:检查你回答中的每个具体事实(日期、数字、名称)
- 对每个事实标注:[verified] 或 [uncertain]
2. 逻辑一致性:检查回答的各部分之间是否自洽
- 是否有前后矛盾?
3. 完整性检查:是否回答了问题的所有部分?
- 列出可能遗漏的方面
4. 来源可追溯性:每个关键陈述是否可以追溯到来源?
5. 幻觉检测:是否存在你不确定的"看似合理但未经验证"的信息?
- 如果有,明确标注为"未验证"
</self_verification>
策略二:Chain-of-Verification (CoVe)
<task>
{question}
</task>
<cove_process>
请按以下步骤回答:
Step 1: 给出初始回答
[你的初始回答]
Step 2: 针对初始回答中的每个关键事实,生成验证问题
例如:如果你说"X 公司成立于 2015 年",验证问题是"X 公司的确切成立时间是什么?"
Step 3: 独立回答每个验证问题
(不要参考 Step 1 的回答,独立回忆/推理)
Step 4: 对比 Step 1 和 Step 3 的答案
- 一致:标记为 [confirmed]
- 不一致:标记为 [conflict],给出修正
Step 5: 给出最终修正后的回答
</cove_process>
策略三:置信度标注
<confidence_rules>
对你回答中的每个陈述,请标注置信度等级:
[HIGH] - 你非常确定这是正确的(基于明确的训练数据或提供的文档)
[MEDIUM] - 你比较确定,但存在不确定性
[LOW] - 你不太确定,这可能是基于模式推断而非确切知识
[UNSURE] - 你不确定,建议用户通过其他来源验证
标注格式:在陈述后用方括号标注
例如:"Python 3.12 引入了类型参数语法 [HIGH]"
例如:"该 API 的速率限制约为 1000 请求/分钟 [LOW]"
当整体置信度低于 MEDIUM 时,必须在回答开头声明:
"NOTE: 以下回答包含不确定信息,建议通过权威来源验证。"
</confidence_rules>
四、多模型交叉验证(MoA)
Mixture-of-Agents 策略
class MoAVerifier:
"""多模型交叉验证"""
def __init__(self, models: list[str]):
self.models = models # 例如 ["claude-opus", "gpt-4o", "gemini-pro"]
def verify(self, question: str,
context: str = None) -> VerificationResult:
"""多模型独立回答 + 交叉验证"""
# Step 1: 多模型独立回答
responses = {}
for model in self.models:
prompt = self._build_prompt(question, context)
responses[model] = self._call_model(model, prompt)
# Step 2: 提取各模型的关键事实
facts_by_model = {}
for model, response in responses.items():
facts_by_model[model] = self._extract_facts(response)
# Step 3: 交叉对比
consensus = self._find_consensus(facts_by_model)
conflicts = self._find_conflicts(facts_by_model)
# Step 4: 仲裁
final_answer = self._arbitrate(
question, responses, consensus, conflicts
)
return VerificationResult(
individual_responses=responses,
consensus_facts=consensus,
conflicting_facts=conflicts,
final_answer=final_answer,
confidence=len(consensus) / (len(consensus) + len(conflicts))
)
def _find_consensus(self, facts_by_model: dict) -> list:
"""找出所有模型一致认同的事实"""
all_facts = []
for facts in facts_by_model.values():
all_facts.extend(facts)
consensus = []
for fact in set(all_facts):
agreeing_models = sum(
1 for model_facts in facts_by_model.values()
if self._fact_matches(fact, model_facts)
)
if agreeing_models >= len(self.models) * 0.7:
consensus.append({
"fact": fact,
"agreement_rate": agreeing_models / len(self.models)
})
return consensus
def _find_conflicts(self, facts_by_model: dict) -> list:
"""找出模型之间矛盾的事实"""
conflicts = []
# 用 LLM 检测不同模型回答之间的矛盾
for model_a, facts_a in facts_by_model.items():
for model_b, facts_b in facts_by_model.items():
if model_a >= model_b:
continue
contradictions = self._detect_contradictions(
facts_a, facts_b
)
conflicts.extend(contradictions)
return conflicts
def _arbitrate(self, question, responses, consensus, conflicts):
"""仲裁:综合多模型结果给出最终答案"""
prompt = f"""以下是多个 AI 模型对同一问题的回答。
请综合分析,给出最可靠的答案。
问题:{question}
各模型回答:
{json.dumps(responses, ensure_ascii=False, indent=2)}
共识事实:{json.dumps(consensus, ensure_ascii=False)}
冲突事实:{json.dumps(conflicts, ensure_ascii=False)}
请:
1. 采用共识事实作为高置信度内容
2. 对冲突事实,分析哪个更可能正确
3. 明确标注不确定的部分
"""
return self._call_model(self.models[0], prompt)
五、特定场景的幻觉控制
代码生成场景
<anti_hallucination_for_code>
在生成代码时,严格遵守以下规则:
1. API 存在性验证
- 不要编造不存在的库、函数或方法
- 如果你不确定某个 API 是否存在,使用注释标注:
# NOTE: Verify this API exists in version X.Y
2. 版本兼容性
- 明确标注代码适用的语言/框架版本
- 不要混用不同版本的 API
3. 参数准确性
- 不确定函数参数时,提供参数的查询方式:
# See: https://docs.python.org/3/library/...
4. 导入验证
- 每个 import 都必须对应真实存在的包
- 标注需要安装的第三方包:pip install package_name
5. 错误处理
- 不要假设 API 的错误返回格式
- 使用通用异常处理,除非你确定具体的异常类型
</anti_hallucination_for_code>
数据分析场景
<anti_hallucination_for_data>
在分析数据时,严格遵守以下规则:
1. 数据来源声明
- 每个数据点必须标注来源(提供的数据 vs 外部知识 vs 计算得出)
2. 计算透明
- 展示计算过程,不要只给结论
- 例如:"增长率 = (120 - 100) / 100 = 20%"
3. 不编造数据
- 如果缺少数据,说明缺失
- 不要用"大约"、"估计"来掩盖你在编造数字
4. 统计严谨
- 相关性不等于因果
- 小样本不支持强结论
- 标注样本量和置信区间
5. 可视化忠实
- 图表数据必须与文字描述一致
- 坐标轴标注必须准确
</anti_hallucination_for_data>
六、幻觉检测工具链
class HallucinationDetector:
"""幻觉检测器"""
def detect(self, output: str,
context: str = None,
question: str = None) -> list[HallucinationFlag]:
"""检测输出中的潜在幻觉"""
flags = []
# 1. 引用验证
if context:
unsupported = self._check_unsupported_claims(
output, context
)
flags.extend(unsupported)
# 2. 内部一致性
contradictions = self._check_internal_consistency(output)
flags.extend(contradictions)
# 3. 已知事实核查(针对常见的高频幻觉模式)
known_errors = self._check_known_hallucination_patterns(output)
flags.extend(known_errors)
# 4. 数值合理性
number_issues = self._check_number_plausibility(output)
flags.extend(number_issues)
# 5. 实体存在性
entity_issues = self._check_entity_existence(output)
flags.extend(entity_issues)
return flags
def _check_known_hallucination_patterns(self, text):
"""检查已知的高频幻觉模式"""
patterns = [
# 虚构的论文引用
(r'\(\w+\s+et\s+al\.,?\s+\d{4}\)',
"potential_fake_citation"),
# 过于精确的统计数据
(r'\d{1,3}\.\d{3,}%',
"suspiciously_precise_number"),
# 虚构的 URL
(r'https?://[^\s]+(?:arxiv|doi|github)',
"potential_fake_url"),
]
flags = []
for pattern, flag_type in patterns:
matches = re.findall(pattern, text)
for match in matches:
flags.append(HallucinationFlag(
type=flag_type,
content=match,
severity="medium",
suggestion="Verify this reference exists"
))
return flags
幻觉控制清单
幻觉控制检查清单:
- [ ] 提供了充分的参考材料(接地)
- [ ] 要求所有陈述附带引用
- [ ] 要求标注置信度等级
- [ ] 加入自检步骤(CoVe)
- [ ] 声明了知识边界
- [ ] 禁止编造不存在的实体/引用/数据
- [ ] 对关键结论使用多模型交叉验证
- [ ] 配置了幻觉检测后处理
- [ ] 用户可见的不确定性标注
- [ ] 提供了验证建议(告诉用户如何核实)
参考资料
- Anthropic 关于 Claude 幻觉控制的技术文档
- "Chain-of-Verification Reduces Hallucination in LLMs" (Meta, 2023)
- "FActScore: Fine-grained Atomic Evaluation of Factual Precision"
- Vectara 幻觉排行榜(Hallucination Leaderboard)
- RAGAS:RAG 系统的幻觉评估框架
Maurice | [email protected]
深度加工(NotebookLM 生成)
基于本文内容生成的 PPT 大纲、博客摘要、短视频脚本与 Deep Dive 播客,用于多场景复用
PPT 大纲(5-8 张幻灯片) 点击展开
大模型幻觉控制的提示词策略 — ppt
以下是基于您提供的文章《大模型幻觉控制的提示词策略》生成的 7 张 PPT 大纲。已按照您的要求采用 Markdown 格式输出,每张幻灯片包含标题和核心要点,并附上了参考来源的对应标号:
幻灯片 1:大模型幻觉的本质与分类
- 幻觉的定义:大语言模型(LLM)的幻觉是指其生成看似合理但实际上不准确或完全虚构的内容 [1]。
- 核心根因:模型在训练阶段学习的是统计模式和“看起来像对的”文本模式,而不区分确切的事实知识,导致概率性生成出错 [1]。
- 幻觉的四大分类:包括事实性幻觉(生成与现实不符的事实)、忠实性幻觉(与输入上下文不符)、一致性幻觉(前后自我矛盾)以及捏造性幻觉(虚构实体或引用) [1]。
幻灯片 2:接地策略(Grounding)
- 核心理念:将大模型的输出“锚定”到可信的信息源上,通过提供参考材料限制其自由发挥 [1]。
- 系统规则约束:在提示词中强制模型仅基于提供的参考材料回答,若信息不足则必须明确说明无法回答,严禁使用材料外知识 [1]。
- RAG 接地提示:在检索增强生成中,要求每个关键陈述后附加来源引用,并明确区分“文档明确陈述的事实”与“基于文档的合理推断” [2]。
- 知识边界声明:明确界定模型可回答的可靠范围(如参考材料、公开知识)和不可回答的范围(如实时数据、未验证建议),并在超界时提醒用户 [3]。
幻灯片 3:引用策略(Citation)
- 强制引用规范:回答必须遵循严格的标注格式,例如直接引用标注
[ref:N],间接推断标注[inferred from ref:N],并在结尾提供引用列表 [3]。 - 透明的引用链:对于依赖多个来源组合得出的结论,要求提供完整的引用链,即使是常识性判断也需明确标注
[no source][3]。 - 引用自动化验证:引入引用验证器(CitationValidator),通过代码自动化检查模型输出的声明是否有据可查,评估其是否被原文档支持 [3]。
幻灯片 4:自检策略(Self-Verification)
- 生成后多维自检:要求模型在给出最终答案前,检查事实准确性、逻辑前后一致性、回答完整性以及来源的可追溯性 [3]。
- 验证链机制(CoVe):引导模型采用分步策略:给出初始回答 -> 生成验证问题 -> 独立回答验证问题 -> 对比并修正冲突,从而降低幻觉率 [3, 4]。
- 细粒度置信度标注:要求模型对输出的每个陈述标注置信度等级(HIGH、MEDIUM、LOW、UNSURE),并在整体置信度低时主动提示用户核实 [4]。
幻灯片 5:多模型交叉验证(MoA)
- 多模型独立生成:调用多个不同的主流大模型(如 Claude、GPT、Gemini)对同一问题独立生成回答并提取其中的关键事实 [4, 5]。
- 共识与冲突识别:通过程序比对,找出所有模型高度一致认同的“共识事实”,并使用 LLM 检测出不同模型回答之间的“冲突事实” [6]。
- 综合仲裁机制:将共识与冲突信息再次输入模型进行分析,采用共识事实作为高置信度内容,并对冲突点进行合理推断,最终输出最可靠的答案 [6, 7]。
幻灯片 6:特定场景的幻觉控制
- 代码生成场景:严禁模型编造不存在的库或 API,要求验证版本兼容性,不确定的参数需提供查询链接,并提供通用的异常处理建议 [7]。
- 数据分析场景:要求每个数据点必须标注来源,公开展示计算过程(如展示具体公式),严禁使用“大约”、“估计”等词汇掩盖数据编造 [7]。
- 严谨的统计原则:强调小样本不支持强结论,相关性不等于因果,且生成的可视化图表数据必须与文字描述和坐标轴完全一致 [7]。
幻灯片 7:幻觉检测工具链与检查清单
- 自动化幻觉检测:部署检测器扫描生成的文本,排查引用不支持、内部逻辑矛盾、数值合理性问题及虚构实体 [7, 8]。
- 高频幻觉模式拦截:利用正则表达式等技术,重点排查并拦截虚构的论文引用、过于精确的伪造统计数据以及虚假的 URL 链接 [8]。
- 系统上线检查清单:提供了一套标准化 Check-list,涵盖接地材料提供、强制引用、置信度标注、CoVe 自检及多模型验证等步骤,确保幻觉控制闭环 [9]。
博客摘要 + 核心看点 点击展开
大模型幻觉控制的提示词策略 — summary
大模型幻觉如何彻底控制?本文深度解析了通过提示词工程降低 LLM 幻觉率的实用指南[1]。在拆解幻觉分类与生成根因后[1],文章系统提出了四大抗幻觉方案:利用接地策略(RAG)锚定可信信息源[1, 2],建立强制引用规范[3],引入**思维链自检(CoVe)强化内在逻辑一致性[4],并利用多模型交叉验证(MoA)**提取共识事实[5]。结合针对代码和数据场景的专属控制规则及幻觉检测工具链[6, 7],本文干货将助您打造高可靠的 AI 应用!
核心看点:
- 锚定可信信源:利用接地策略与引用机制,将输出绑定参考材料以杜绝捏造[1, 3]。
- 模型深度自检:采用 CoVe 策略促使模型自查关键事实,并强制标注置信度[4]。
- 多模型交叉验证:利用 MoA 策略提取多个模型的回答共识,智能仲裁事实冲突[5, 8]。
60 秒短视频脚本 点击展开
大模型幻觉控制的提示词策略 — video
钩子开场:
大模型总胡说?三招解决!
核心解说:
- 第一招接地引用。让AI只看给定资料回答,强制标注来源 [1, 2]。
- 第二招生成自检。让AI输出前核查事实逻辑,主动标注置信度 [2, 3]。
- 第三招多模型交叉。让多个AI独立回答对比,只提取共识事实 [4, 5]。
收束:
用好这些提示词策略,轻松让大模型告别幻觉![1, 6]
课后巩固
与本文内容匹配的闪卡与测验,帮助巩固所学知识
延伸阅读
根据本文主题,为你推荐相关的学习资料