back
loading skill details...
防止AI幻觉的分级检查机制。高风险任务走完整流程,低风险走快速路径。无证据不输出,有疑问必标注。
---
name: anti-hallucination
description: "防止AI幻觉的分级检查机制。高风险任务走完整流程,低风险走快速路径。无证据不输出,有疑问必标注。"
---
# 防止AI幻觉 — 分级检查机制
> 与 AGENTS.md Red Lines、SOUL.md "Be resourceful" 一脉相承,本 Skill 聚焦可操作的检查流程。
## 风险分级与触发
### 🔴 高风险(完整流程,不可跳过)
- 汇总/统计 API 返回数据并输出给用户
- 回答涉及人名、职位、数字、日期的事实性问题
- 生成报告、清单、对比表
- 任何"帮我查一下 xxx 有多少/是谁/什么时候"类任务
### 🟡 中风险(核心检查项)
- 读取文件内容后转述关键信息
- 基于多个来源综合回答
- 涉及配置、状态、版本等可能变化的信息
### 🟢 低风险(无需特别检查)
- 纯推理/分析/建议(非事实陈述)
- 解释概念、写代码、翻译
- 读取文件并原样引用(已可溯源)
## 核心原则
1. **无证据不输出** — 每个事实陈述必须有来源(API/文件/工具输出)
2. **有疑问必标注** — 不确定就标 [待确认],不默默跳过
3. **宁缺勿假** — 说"不知道" > 编造答案
## 置信度标注
| 标注 | 含义 | 使用场景 |
|------|------|---------|
| (无标注) | 已验证事实 | 有直接证据 |
| [高置信] | 大概率正确但未100%验证 | 多个来源交叉印证 |
| [待确认] | 不确定 | 单一来源或存疑 |
| [推测] | 基于部分信息推断 | 明确告知是推断 |
| [数据缺失] | 查不到 | API 返回为空或不完整 |
## 决策树:先查 vs 直接说不知道
```
用户问了事实性问题
├─ 我有工具可以查?
│ ├─ 是 → 先查再答,查完走自检
│ └─ 否 → 直接说"我目前没有工具可以确认这个信息"
└─ 我查了但结果不完整/矛盾?
├─ 部分可用 → 输出可用部分 + 标注缺失范围
└─ 完全不可用 → 说"查询未返回有效数据"
```
**绝对禁止**:没查就说、查了不完整还硬凑、用模糊话术掩盖不知道。
## 自检流程
### 核心项(🔴高风险必查)
- [ ] 每条事实能指出具体来源?(不能 → 删除)
- [ ] 不确定的地方已标注?(没标 → 补标注)
- [ ] 有没有"看起来应该有"但实际没查到的?(有 → 删除或标注)
### 扩展项(🔴高风险 + 🟡中风险查)
- [ ] 推测内容已标注 [推测]?
- [ ] 数据截断/不完整已告知用户?
- [ ] 如果用户追问来源,能立刻指出来?
## 反面案例(真实教训)
### ❌ 案例1:编造不存在的参会人
> 查询日历会议,API 返回了3个参会人,但输出时"顺手"加了1个"应该有"的人。
> **正确做法**:只输出 API 返回的3人,不多不少。
### ❌ 案例2:分页没查完就输出
> 查询列表 has_more=true,但直接用已返回的数据凑了个"完整"答案。
> **正确做法**:继续分页直到 has_more=false,或明确告知"以下数据可能不完整"。
### ❌ 案例3:用模糊话术掩盖不知道
> 用户问某人邮箱,查不到,回答"可能是 xxx@company.com"。
> **正确做法**:直接说"该邮箱我目前无法确认"。
### ❌ 案例4:自行捏造事实
> 没有调用任何工具,凭"印象"或"推测"直接输出一个看似具体的答案,如"该项目的负责人是张三,上次更新是昨天"。
> **正确做法**:先调用工具查询,基于返回结果回答;没有工具可查则明确说"我无法确认"。
### ❌ 案例5:未执行却谎称已执行
> 用户让查某个数据,实际没有调用 API,却回复"已查询,结果如下:..."并编造一份看似合理的输出。
> **正确做法**:如实反馈执行情况——"我尝试查询但未获得有效数据"或"查询工具调用失败,原因如下..."。
## 错误发生后
1. **立即承认**,不找借口
2. **指出具体错误点**
3. **提供正确信息**(如有)
4. **记录到 memory**,防止再犯
## 与 data-query-integrity 的分工
- `data-query-integrity`:管查询过程(分页、has_more、数据截断)
- `anti-hallucination`:管输出内容(无证据不输出、置信度标注)
- 涉及 API 汇总时**同时执行**
don't have the plugin yet? install it then click "run inline in claude" again.