诊断意外输出
对失败模式进行分类:答案错误、格式错误、偏离主题和幻觉
诊断意外输出 是 CoddyKit 上的免费 AI Prompt Engineering 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Prompt Engineering 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Prompt Engineering 课程共包含 4 节课。
提示词失效时
即使经过精心设计的提示词也可能产生错误结果。诊断失败需要一套分类体系,用于判断发生了哪种类型的失败。没有分类,调试就只能靠猜测。四种主要失败类别是:答案错误、格式错误、偏离主题的响应和幻觉。
失败类型 1:答案错误
答案错误是事实性错误——模型以正确的格式回答了正确的主题,但内容不正确。
示例包括:日期、统计数据、姓名,以及存在逻辑错误的代码。这是最难自动检测的失败类型,因为输出表面上看起来是正确的。
- 原因:训练数据截止时间、罕见事实或多步骤推理错误
- 检测:与标准答案比较、人工审核或使用验证用的 LLM 调用
# Example: wrong answer failure
prompt = 'What year was Python first released?'
response = 'Python was first released in 1994.' # Wrong — it was 1991
# Ground truth check
GROUND_TRUTH = '1991'
correct = GROUND_TRUTH in response
print(f'Correct: {correct}') # False失败类型 2:格式错误
当模型使用正确的信息回答了正确的问题,却忽略了格式要求时,就会发生格式错误。
示例包括:要求返回 JSON 时却返回纯文本,要求纯文本时却添加了 Markdown,以及要求单个值时却返回了列表。
- 原因:格式要求隐藏在较长的提示词中、指令相互冲突,或模型忽略了低优先级指令
- 检测:JSON 解析错误、正则表达式不匹配或模式验证失败
import json
response_text = 'Sure! Here is the result: {"name": "Alice", "age": 30}'
try:
data = json.loads(response_text)
print('Format OK:', data)
except json.JSONDecodeError as e:
print(f'FORMAT FAILURE: {e}')
# 'Sure! Here is the result:' prefix broke JSON parsing失败类型 3:偏离主题的响应
偏离主题意味着模型回答的是另一个问题,而不是用户提出的问题。响应可能在事实和格式上都正确,但没有回应用户的真实意图。
示例包括:要求编写 Python 函数,却收到 JavaScript 函数;要求一行回答,却收到一篇完整的文章;要求修复错误,却收到对错误的解释,而不是修复方案。
- 原因:指令含糊、上下文冲突,以及长对话中的任务漂移
# Off-topic example
prompt = 'Write a Python function that reverses a list.'
response = '''
In JavaScript, you can reverse an array like this:
const reversed = arr.reverse();
'''
# Detection: check that output contains the correct language keyword
def check_language(response, expected_lang='def '):
if expected_lang not in response:
print(f'OFF-TOPIC FAILURE: expected {expected_lang} in response')
return False
return True
check_language(response) # False — no Python def失败类型 4:幻觉
幻觉是最危险的失败类型:模型编造了并不存在的事实。这些内容看起来合理且语气自信,因此很难被发现。
示例包括:捏造的引用(论文标题听起来真实,但实际上并不存在)、虚构的应用程序接口端点、虚假的统计数据,以及不存在的人物。
- 原因:模型通过模式匹配生成看似合理的文本,以填补知识空白
- 检测:与权威来源进行事实核查、交叉核对引用,以及测试应用程序接口调用
# Hallucination detection via external verification
import requests
def verify_doi(doi):
url = f'https://doi.org/{doi}'
resp = requests.head(url, allow_redirects=True, timeout=5)
return resp.status_code == 200
# Model claimed this paper exists:
fabricated_doi = '10.1234/fake.paper.2023.99999'
if not verify_doi(fabricated_doi):
print('HALLUCINATION DETECTED: DOI does not exist')实际应用中的失败分类体系
发现失败时,请先进行分类,再尝试修复。失败类型决定修复策略:
- 答案错误:添加上下文、使用检索,或切换到能力更强的模型
- 格式错误:强化格式要求、添加输出示例,或使用结构化输出/函数调用
- 偏离主题:将指令改写得更具体,简化提示词
- 幻觉:添加有依据的上下文,指示模型说“我不知道”,并启用引用
结构化失败记录
请记录每次失败及其分类。随着时间推移,您会发现其中的规律:提示词中的某个部分导致了大多数格式错误,或者某个特定主题频繁触发幻觉。结构化日志能够支持基于数据的调试。
import json
from datetime import datetime
def log_failure(prompt, response, failure_type, details=''):
entry = {
'timestamp': datetime.utcnow().isoformat(),
'failure_type': failure_type, # wrong_answer | wrong_format | off_topic | hallucination
'prompt_hash': hash(prompt),
'response_snippet': response[:200],
'details': details
}
with open('prompt_failures.jsonl', 'a') as f:
f.write(json.dumps(entry) + '\n')
log_failure(
prompt=my_prompt,
response=bad_response,
failure_type='wrong_format',
details='JSON prefix text broke parsing'
)自动化失败分类
对于大规模测试,请使用分类器 LLM 调用自动为每个响应标注失败类型。这样就能对数百个测试用例进行批量评估。
def classify_failure(prompt, expected, actual):
classification_prompt = (
f'You are a QA evaluator for LLM outputs.\n'
f'Prompt: {prompt}\n'
f'Expected behavior: {expected}\n'
f'Actual output: {actual}\n\n'
'Classify the failure as one of: CORRECT, WRONG_ANSWER, WRONG_FORMAT, OFF_TOPIC, HALLUCINATION.\n'
'Reply with only the label.'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': classification_prompt}]
)
return resp.choices[0].message.content.strip()严重性矩阵
并非所有失败的影响都相同。严重性矩阵有助于确定修复优先级:
- 医疗/法律场景中的幻觉:严重——立即修复
- 内部工具中的格式错误:高——会破坏下游解析
- 罕见边界情况下的答案错误:中——监控发生频率
- 含糊输入导致的偏离主题:低——只要发生频率不高即可接受
按失败类型逐周跟踪失败率。任何类别出现激增,都说明发生了需要关注的回归问题。
构建失败仪表盘
一个简单的失败仪表盘会读取失败日志,并按类型和提示词部分报告数量:
import json
from collections import Counter
def failure_report(log_path='prompt_failures.jsonl'):
entries = []
with open(log_path) as f:
for line in f:
entries.append(json.loads(line))
counts = Counter(e['failure_type'] for e in entries)
total = len(entries)
print(f'Total failures: {total}')
for ftype, count in counts.most_common():
pct = 100 * count / total
print(f' {ftype}: {count} ({pct:.1f}%)')
failure_report()主动预防失败
在各类失败发生之前主动减少它们的策略:
- 答案错误:在提示词中提供参考文本(RAG);要求模型引用来源
- 格式错误:使用 JSON 模式或函数调用;在提示词中提供格式示例
- 偏离主题:将任务放在第一句;避免使用会淡化意图的冗长前置说明
- 幻觉:指示“只能使用下方提供的信息”;添加“如果不确定,请说我不知道”
知识检查
当模型编造并不存在的事实(例如捏造引用或不存在的应用程序接口端点)时,属于哪种失败类型?
回顾:诊断异常输出
LLM 的四种失败类型及其主要特征:
- 答案错误:格式正确、主题正确,但内容错误——与标准答案进行事实核查
- 格式错误:内容正确,却忽略了格式要求——模式验证可以检测到这种错误
- 偏离主题:格式正确,却回答了另一个问题——检查语言与任务是否匹配
- 幻觉:编造事实——与外部来源进行验证
记录并分类每次失败。随着时间推移,按类型跟踪失败率。下一课:根因分析,用于找出提示词中的哪一部分导致了失败。
用 AI 导师学习 AI Prompt Engineering — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 53
- 课程
- 199
常见问题解答
「诊断意外输出」课时是免费的吗?
是的 — 「诊断意外输出」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Prompt Engineering 课程的其余内容,请升级到 CoddyKit PRO。 AI Prompt Engineering 课程共包含 4 节课。
「诊断意外输出」这节课中我会学到什么?
对失败模式进行分类:答案错误、格式错误、偏离主题和幻觉 你通过在浏览器中直接运行的动手代码来练习 AI Prompt Engineering,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AI Prompt Engineering 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AI Prompt Engineering 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「诊断意外输出」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AI Prompt Engineering 课中编写并运行代码吗?
能。每节 AI Prompt Engineering 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。