Claude学院

Claude 提示词怎么避免幻觉?实测有效的 5 个方法

避免 Claude 幻觉的核心只有一句话:不要逼模型在缺乏依据时硬给答案。具体做法是——明确允许它回答"不知道"、用 XML 标签喂给它可靠事实依据、强制它从依据中引用原文、把生成参数调到更保守、再用工具调用去核实关键事实。下面 5 个方法都经过实测,按收益从高到低排列,可以直接套到你的 system 提示词里。

方法一:明确允许模型说"不知道"

幻觉最常见的成因,是提示词隐含地要求模型"必须回答"。模型为了满足指令,会把不确定的内容编得很像真的。解决办法是在 system 提示词里给它一条退路:

你是严谨的技术助手。回答必须基于已知事实。
如果你不确定,或者上下文里没有相关信息,
直接回答"我无法确定",禁止猜测或编造。

这一条往往能消掉一半以上的硬编内容。配合具体场景再加一句"宁可少答,不要答错",效果更稳。如果你还不熟悉 system 提示词的写法,可以先看 Claude 系统提示词怎么设置?完整配置步骤图解 打好基础。

方法二:用 XML 标签提供事实依据

没有依据,再聪明的模型也只能靠"记忆"猜。把可信资料放进上下文,并用 XML 标签清晰隔离,是降低幻觉最有效的结构化手段。Claude 对 XML 标签的边界识别非常准:

<reference>
本产品退款政策:下单 7 天内可全额退款,
超过 7 天不支持退款。
</reference>

只根据 <reference> 中的内容回答用户问题,
依据不足时回答"资料中未提及"。

XML 标签的进阶技巧(如 instructions、example、thinking 的组合用法)可参考 Claude 提示词 XML 标签用法详解:5 个实战示例。如果资料体量大,注意控制上下文长度,详见 Claude 上下文窗口多大?长文档处理实用技巧

方法三:强制引用原文,再作答

有了依据还不够,要让模型"先抄后答"。要求它先从原文中摘出支撑句,再基于摘出的内容回答。这相当于给模型加了一道自检,能逼它放弃没有出处的结论。下面是完整的 Python 示例:

from anthropic import Anthropic

client = Anthropic()  # 读取环境变量 ANTHROPIC_API_KEY

resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    temperature=0,
    system=(
        "只根据 <doc> 中的内容回答。"
        "先在 <quote> 标签里逐字引用支撑你结论的原文,"
        "再在 <answer> 标签里给出回答。"
        "找不到支撑原文时,answer 写'文档中未提及'。"
    ),
    messages=[{
        "role": "user",
        "content": (
            "<doc>服务时间为周一至周五 9:00-18:00,"
            "周末不提供服务。</doc>\n周六能办理业务吗?"
        ),
    }],
)
print(resp.content[0].text)

这种"引用优先"的写法本质上是思维链的一种约束形式,想系统掌握可看 Claude 思维链(CoT)提示词写法:让推理更准确

方法四:调低 temperature,给少量正例

Messages API 的 temperature 控制随机性,范围 0 到 1。做事实问答、抽取、分类这类需要确定性的任务,直接设 temperature=0,模型会更倾向选择高置信度的输出,发散性的瞎编明显减少。需要创意写作时才往上调。

任务类型建议 temperature
事实问答 / 数据抽取0
代码生成0 - 0.3
创意写作 / 头脑风暴0.7 - 1

再配上 2-3 个 Few-shot 正例,告诉模型"遇到无法回答的情况应该怎么答",可以进一步锁定它的行为边界。具体做法见 Claude Few-shot 示例怎么用?3 步提升回答准确率。Messages API 的全部参数说明可查 Claude Messages API 全部参数说明(含代码示例)

方法五:用 Tool Use 让模型去核实

对时效性强或必须精确的事实(实时数据、内部数据库、最新文档),最可靠的做法是不让模型凭记忆答,而是通过 Tool Use(工具调用)去查真实数据源。模型会先返回 tool_use 块说明要调哪个工具、传什么参数,你执行后把结果以 tool_result 回传,模型再据此作答——这样答案就有了可验证的出处。Node.js 调用示例:

import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();

const resp = await client.messages.create({
  model: "claude-sonnet-4-6",
  max_tokens: 1024,
  tools: [{
    name: "get_order_status",
    description: "根据订单号查询真实订单状态",
    input_schema: {
      type: "object",
      properties: { order_id: { type: "string" } },
      required: ["order_id"],
    },
  }],
  messages: [{ role: "user", content: "订单 A1001 发货了吗?" }],
});

console.log(resp.stop_reason); // tool_use 表示模型要求调用工具

Tool Use 的完整往返流程(含 tool_result 回传)见 Claude Tool Use 工具调用怎么用?完整代码实战。如果要让 Claude 连接外部系统作为统一事实来源,可了解 MCP 是什么?一篇讲清 Claude 模型上下文协议

常见问题

把 temperature 设成 0 就不会有幻觉了吗?

不会。temperature=0 只是降低了随机性,让输出更确定,但模型仍然会在缺乏依据时给出错误结论。真正的关键是方法一到方法三:给退路、给依据、强制引用。temperature 是辅助手段,不能单独依赖。

哪个模型幻觉更少,需要换 Opus 4.8 吗?

更强的模型(如 Claude Opus 4.8)在复杂推理上的事实一致性通常更好,但幻觉主要由提示词结构和有无依据决定,而不是单纯堆模型。多数事实问答场景 Claude Sonnet 4.6 配合本文方法已经足够。选型可参考 Claude 模型怎么选?Opus / Sonnet / Haiku 选型指南。具体能力差异以 Anthropic 官网为准。

模型还是编造引用怎么办?

说明它依然在"硬给答案"。检查三点:system 里是否明确允许回答"不知道";依据是否真的放进了上下文(而不是指望模型记忆);是否要求它逐字引用原文。三者齐全时编造引用的概率会大幅下降。若提示词整体不生效,可对照 Claude 提示词不生效?8 个常见原因和修复方法 排查。

提示词工程