共计 1968 个字符,预计需要花费 5 分钟才能阅读完成。
糟糕提示词设计的灾难现场
刚接触 Claude 开发时,我遇到过两个典型翻车案例:

-
客服对话突然飙车:当用户问 ” 如何退订服务 ” 时,系统突然开始推荐会员升级套餐。后来发现是提示词中 ” 退订 ” 关键词触发了营销模板的优先级错乱
-
多轮对话失忆症:在预订酒店场景中,用户明明说过 ” 要双床房 ”,但三句话后就变成默认大床房。检查发现对话历史被截断,关键信息没注入新请求
这些坑让我明白:提示词不是随便写的字符串,而是需要系统化设计的对话编程。下面分享我的实战经验。
Claude 提示词解剖课
角色分工三件套
Claude 的消息结构包含三个关键角色:
system: "你是一个专业客服助手,用简体中文回答,保持友好但专业" # 设定 AI 人格
user: "怎么重置密码?" # 实际用户输入
assistant: "请打开 www.example.com/password..." # 期望 AI 回答示例
- System:相当于 AI 的 ” 人格配置文件 ”,建议包含:
- 身份定位(如客服 / 导师 / 伙伴)
- 回答风格(专业 / 幽默 / 简洁)
-
语言要求(方言 / 术语级别)
-
User/Assistant:构成对话的 ” 一问一答 ” 基本单元,可用于:
- 提供示例对话(few-shot learning)
- 引导特定回答格式
- 注入对话历史上下文
提示策略三选一
根据业务需求选择提示方式:
- 零样本(Zero-shot)
- 适用场景:简单明确的指令(如 ” 翻译这句话 ”)
-
示例:直接提问 ” 请用 Python 写一个快速排序函数 ”
-
小样本(Few-shot)
- 适用场景:需要风格一致的场景(如客服话术)
-
示例:
用户:我要退款 助理:请问订单号是多少?--- 用户:质量太差 助理:具体是哪个产品有问题? -
思维链(Chain-of-thought)
- 适用场景:复杂推理问题(如数学计算)
- 示例:
问题:小明有 5 个苹果,吃掉 2 个又买了 4 个,现在有几个?思考:首先 5 -2=3,然后 3 +4=7 答案:7 个
工业级模板管理实战
用 YAML 管理提示词模板更利于维护:
# prompts/customer_service.yaml
templates:
password_reset:
system: |
你是一名 {{level}} 客服,使用 {{language}} 回答,必须验证用户身份后才能提供帮助
examples:
- user: "我忘了密码"
assistant: "为保障安全,请先提供注册手机号后 4 位"
variables:
level:
type: string
enum: [初级, 高级]
default: 初级
language:
type: string
default: "礼貌的简体中文"
关键设计点:
- 变量插值 :用{{}} 包裹动态参数,运行时注入
- 类型校验:定义变量约束条件,避免非法值
- 示例隔离:不同场景的样本分开存放,防止污染
性能与安全关键点
成本控制公式
提示词长度直接影响 API 成本:
API 费用 ≈ (输入 token 数 + 输出 token 数) × 单价
实测数据:
- 每 1000 个 token 约 $0.02(Claude Instant)
- 中文平均 1token≈2 个汉字
- 建议单个提示词控制在 3000token 内
敏感词过滤架构
推荐三层过滤方案:
- 预处理层:在调用 API 前过滤明显违规词(如脏话)
- 模型层:在 system 提示中加入 ” 拒绝回答违法内容 ” 的指令
- 后处理层:对 AI 输出进行二次筛查
最佳实践是把核心过滤放在预处理层,可以节省无效 API 调用。
避坑指南
防幻觉设计
这些词容易导致 AI 瞎编:
RISKY_WORDS = [
"根据内部消息", "据可靠人士透露",
"我可以确定", "100% 保证"
]
应对策略:
- 在 system 提示中明确要求 ” 只回答确认的事实 ”
- 对包含不确定性的回答自动添加免责声明
历史压缩算法
用 TF-IDF 裁剪对话历史:
from sklearn.feature_extraction.text import TfidfVectorizer
def compress_history(dialogs, keep_ratio=0.6):
tfidf = TfidfVectorizer().fit_transform(dialogs)
word_scores = np.array(tfidf.sum(axis=0))[0]
important_words = set(np.argsort(word_scores)[-int(len(word_scores)*keep_ratio):])
return [d for d in dialogs if important_words.intersection(d.split())]
留给你的思考题
- 当用户故意输入乱码时,应该直接终止对话还是尝试理解意图?
- 多语言混输的场景下(如中英文夹杂),如何保证提示词稳定性?
- 对于需要查数据库的问题,应该让 AI 直接回答还是先验证数据真实性?
提示词工程就像教 AI 说话,既要给足上下文,又要防止它放飞自我。希望这些实战经验能帮你少走弯路。
正文完
