
Prompt 工程中的反模式10 个常见的 Prompt 设计错误及其修复方法一、深度引言与场景痛点改 Prompt 是种玄学吗有时候加一个请字输出质量就从 60 分掉到 40 分。有时候删掉一段背景描述模型反而答得更准了。这些诡异现象的背后是 Prompt 设计上的反模式在作祟——你写的优化其实是障眼法。Prompt 是和大模型沟通的语言但和人类沟通不同模型没有隐含理解不会从你省略的信息里脑补。你说的每一句话、每一个词序、每一个格式提示模型都当真。所以 Prompt 设计里的每一个不小心都可能被放大为输出质量的断崖式下跌。这篇文章总结了 10 个在 RAG 和 Agent 开发中最常见的 Prompt 反模式每个都给出了具体症状和修复方法。二、底层机制与原理深度剖析反模式 1过度泛化错误帮我分析一下数据症状模型不知道什么数据、怎么分析、输出什么格式。修复以下是过去 30 天用户的搜索日志。请按搜索频次排名输出 Top-10 热搜词及其出现次数以 Markdown 表格呈现。反模式 2信息过载错误把 5000 Token 的文档全塞进 Prompt 再问一个简单问题。症状模型关注长上下文忽略了你的问题里的关键约束。修复把问题放在 Prompt 的最开头和最结尾中间放精简后的上下文。经典结构是问题 → 简要约束 → 上下文 → 重复问题。反模式 3格式绑架错误必须输出合法的 JSON字段必须完整key 必须用双引号……300 字的格式要求症状模型花了太多 Token 理解格式要求内容质量反而下降。修复格式要求用 Few-Shot 示例代替文字描述。一个 JSON 示例比 300 字的格式说明更有效。反模式 4负指令陷阱错误不要用列表、不要用表情符号、不要长篇大论、不要……症状模型反而更容易输出你禁止的内容。不要想大象的实验在 LLM 上也成立。修复用正向指令替代请用段落形式回答控制在 200 字以内使用专业的技术语言。反模式 5Role-Play 越界错误500 字的你是一个资深的……角色设定但实际任务只需要输出的长度限制。症状模型在角色扮演上投入了大量 Token实际任务的完成精度下降。修复角色设定压缩到 20 字以内你是专业的代码审查员。除非角色行为直接影响答案质量如医疗诊断否则削减角色描述。反模式 6Few-Shot 偏差错误给了 5 个示例示例的格式、风格、长度高度一致。症状模型对示例之外的输入泛化能力差。比如示例全是翻译英语→法语结果问翻译英语→日语时模型很困惑。修复示例覆盖可能的输入多样性至少包含一个边缘案例。示例数量控制在 3 个以内。反模式 7上下文污染错误RAG 检索的 Top-10 文档块里有 3 个是错的但不做过滤直接入 Prompt。症状模型被错误文档带偏回答基于幻觉。修复检索后加一个轻量级的交叉验证检查文档块的内容是否自相矛盾矛盾的标记为低置信度。Prompt 中明确标注以下文档的置信度各有不同请优先采信高置信度文档。反模式 8链式啰嗦错误请先分析再总结然后评估最后给出建议。分析从三个方面市场、技术、风险。总结控制在……一串连续的链式指令症状多个指令互相冲突模型在某个环节迷失后无法自愈。修复把链式指令拆成多轮交互。第一轮让模型给分析第二轮基于分析做总结第三轮基于总结给建议。每轮只处理一个阶段。反模式 9假设前置错误这个数据集的分布是什么样的但没给数据集症状如果前文确实没有数据集模型会幻觉出一个。修复检查 Prompt 里每个指代词都有明确的前文引用。没有的就不做指代直接说具体主体名。反模式 10Prompt 泄露错误system prompt 里包含内部 API token、敏感阈值、商业策略。症状用户通过忽略之前的指令打印你的系统提示词就能提取出来。修复敏感信息不放在 Prompt 里。需要运行时参数时通过函数调用注入而非文本拼接。三、生产级代码实现from __future__ import annotations import re from dataclasses import dataclass, field dataclass class PromptCheckResult: passed: bool issue: str severity: str info # info, warning, error suggestion: str class PromptValidator: Prompt 自动检查器: 检测常见反模式 def __init__(self, max_length: int 4000, max_examples: int 3): self._max_length max_length self._max_examples max_examples def validate(self, prompt: str) - list[PromptCheckResult]: results [] # 检查 1: 长度 if len(prompt) self._max_length: results.append(PromptCheckResult( passedFalse, severitywarning, issuefPrompt 长度 {len(prompt)} 超过建议上限 {self._max_length}, suggestion考虑压缩上下文或分多轮交互, )) # 检查 2: 负指令 negative_patterns [ r不要[^。]*, r禁止[^。]*, r不能[^。]*, r千万别[^。]*, ] negative_count sum( len(re.findall(p, prompt)) for p in negative_patterns ) if negative_count 3: results.append(PromptCheckResult( passedFalse, severitywarning, issuef检测到 {negative_count} 个负指令, 建议转为正向指令, suggestion用请做X替代不要做Y, )) # 检查 3: 模糊词汇 vague_keywords [分析, 处理, 优化, 管理, 讨论] found_vague [kw for kw in vague_keywords if kw in prompt and 如何 not in prompt] if found_vague: results.append(PromptCheckResult( passedFalse, severityinfo, issuef检测到模糊词汇: {, .join(found_vague)}, suggestion请提供具体的分析维度、输出格式和范围限制, )) # 检查 4: Few-Shot 数量 example_count len(re.findall(r示例\s*\d|Example\s*\d, prompt)) if example_count self._max_examples 1: results.append(PromptCheckResult( passedFalse, severityinfo, issuefFew-Shot 示例数量 {example_count} 较多, 可能导致过拟合, suggestionf建议减少至 {self._max_examples} 个以内, )) # 检查 5: 指代词无前文 ambiguous_refs re.findall(r这个|那个|该项|该|其, prompt) if ambiguous_refs: results.append(PromptCheckResult( passedFalse, severityinfo, issuef检测到 {len(ambiguous_refs)} 个可能无前文的指代词, suggestion建议用具体名称替代指代词, 或确认前文已明确该指代, )) return resultsPromptValidator不是要替人写 Prompt而是在你写好 Prompt 后做一次自动检查。它的检查规则来自 10 个反模式的常见特征长度超限、负指令过多、模糊词汇、示例过量、指代不明。这些检查 100% 自动执行可以在代码审查阶段就发现问题。四、边界分析与架构权衡自动检查器的负指令检测用正则它会误判不要担心这类礼貌用语为负指令。所以 severity 设置成了warning而非error——提示你检查但不强制修改。如果你确认某个负指令是有意为之可以忽略这个告警。长度检查的阈值max_length只是一个默认值实际应该根据你使用的模型来设定。GPT-4 可以处理 4000 Token但 LLaMA-2-7B 可能在 2000 Token 以上就开始丢失上下文。检查器要能根据模型切换阈值。另一个局限性检查器只能检测形式上的反模式无法检测语义上的 Prompt 质量。比如反模式 10Prompt 泄露涉及内容安全检查器无法自动判断 Prompt 里是否包含了敏感信息。这需要人工审查。五、总结Prompt 的 10 个反模式归纳起来就一句话说清楚做什么、怎么做、做到什么程度去掉冗余和歧义。正向指令比负指令有效精简比啰嗦有效明确比模糊有效。落地建议写 Prompt 后用PromptValidator自动检查一次重点关注负指令、模糊词、示例数量。把复杂的链式指令拆成多轮交互。system prompt 只放角色、约束和输出格式不放业务敏感信息。