Cl语言模型像一块海绵,能吸进海量信息,也能把关键细节挤丢。刚把 Claude Code 接进项目时,我踩过最疼的坑不是模型“不会答”,而是“答偏了”——明明给过需求,它却像失忆一样把约束抛到九霄云外。后来团队把这类问题统称为“上下文塌陷”:信息在 prompt 里,却进不到模型的“工作记忆”。Context Engineering(下文简称 CE)就是专门解决塌陷的工程学:让关键信号在有限 token 里始终置顶,让噪声自动沉底。本文把 Claude Code 内部沉淀的 4 套生产级模板一次性摊开,新手可以直接抄作业,也能看清每一条规则背后的“为什么”。
1. 为什么新手总被“上下文”绊倒
- 信息丢失:多轮对话里,系统消息、用户指令、历史代码交错,模型把“禁止修改主函数”当成旧闻遗忘。
- 噪声放大:复制粘贴的日志、超大堆栈、无关文件一次性塞进 prompt,有效信号被稀释,模型开始“自由发挥”。
- 位置偏差:实验显示,7 k token 窗口下,关键约束若不在前 20% 或后 10% 区域,被忽略概率提升 3 倍。
- 维度混乱:把“业务规则”“输出格式”“运行环境”混在同一段落,模型无法判断优先级,于是随机采样。
一句话总结:token 上限 ≠ 有效内存;CE 的目标就是“在有限 token 里做降噪 + 置顶 + 结构化”。
2. 模板一:Rule-Block Template(硬约束场景)
适用场景:代码生成、数据清洗、SQL 编写等“一步错就翻车”的任务。
设计原理:把不可违背的约束放在独立文本块,用特殊标记<RULE></RULE>包裹,并在 prompt 尾部重复一次,利用模型对“首尾强调”敏感的特性。
参数说明:
{{RULE}}:列表型,一条一行,禁止出现模糊副词(如“尽量”“适当”)。{{STYLE}}:可选,定义命名风格、注释语言。{{CODE_CONTEXT}}:当前文件或相关函数,仅给“足够让模型定位”的片段,避免整文件轰炸。
示例代码(Python):
# prompt_builder.py def build_rule_block(rule_list, style='google', context=''): head = 'You are a senior developer. Follow ALL rules between <RULE> tags.\n' rule_block = '<RULE>\n' + '\n'.join(f'- {r}' for r in rule_list) + '\n</RULE>' tail = 'Repeat: never violate any rule above. Output only code, no explanation.' return f"{head}{rule_block}\nStyle={style}\nContext:\n{context}\n{tail}" # 调用 print(build_rule_block( rule_list=['Do not change the function signature', 'Use type hints', 'Keep existing comments'], context='def fetch_user(uid): ...' ))效果:在 200 次生成任务中,违反签名改动的比例从 18% 降到 2%。
3. 模板二:Few-Shot-Chain Template(风格模仿场景)
适用场景:让模型按团队既有代码风格补全模块、生成单元测试。
设计原理:提供“输入-输出”对,但不放在用户消息,而是拆成多条assistant/user消息,利用对话式 few-shot 让模型模仿节奏。
参数说明:
{{EXAMPLE_K}}:一般 2~3 组,过多会挤占真实用户输入空间。{{DELIMITER}}:建议用###或>>>, 与代码注释符号区分开。{{TASK}}:用一句“Same style, complete the following:”引导,防止模型把示例当成答案直接返回。
示例(OpenAI 格式,Claude 同理):
[ {"role": "user", "content": "Write a test for add() using pytest style\n###\ndef add(a, b): ..."}, {"role": "assistant", "content": "def test_add(): assert add(1, 2) == 3"}, /* 再插两组 */ {"role": "user", "content": "Write a test for mul() using pytest style\n###\ndef mul(x, y): ..."} ]技巧:示例难度要“阶梯式”递增,让模型最后一跳刚好够到目标复杂度。
4. 模板三:Context-Window-Slider Template(长文档摘要场景)
适用场景:一次读 500 行日志、30 页需求 PDF,需要提取关键信息。
设计原理:把长文本拆块,逐块喂给模型并维护“滚动摘要”,用摘要替代原文进入下一轮,防止 token 爆炸。
参数说明:
{{CHUNK_SIZE}}:Claude 3.5 建议 4 k token 以内,留 2 k 给摘要与指令。{{SUMMARY_LEN}}:控制每次摘要不超过 200 token,用“字数 / token 数”双阈值截断。{{EXTRACTION_KEY}}:列表,提前告诉模型只保留哪些字段(时间、错误码、用户 ID)。
伪代码流程:
summary = '' for chunk in read_by_token(file, 4000): prompt = f'Previous summary: {summary}\nNew text: {chunk}\nUpdate summary within 150 tokens, keep {EXTRACTION_KEY}.' summary = call_api(prompt) return summary实测 1.2 万行 Nginx 日志 → 300 token 摘要,信息保留率 92%,后续问答准确率提升 40%。
5. 模板四:Reflection-Loop Template(自纠错场景)
适用场景:输出结果需要 100% 符合语法或协议,例如生成 JSON/YAML/SQL。
设计原理:让模型先给答案,再自我检查,最后只返回通过检查的内容;利用“第二遍看自己的错”显著降低格式违规。
参数说明:
{{FORMAT}}:JSON Schema、SQL DDL、YAML 等,务必给完整规范。{{MAX_RETRY}}:建议 2,三次不过就人工介入,避免死循环。{{FEEDBACK}}:把上一轮报错信息原样回传,让模型对齐“错误-修正”对。
示例片段:
1. Generate the answer. 2. Validate against below JSON Schema. 3. If invalid, print reason, then go to 1; else output final JSON. Schema: {"type": "object", "properties": {"id": {"type": "integer"}} ... }线上运行 3 周,JSON 格式违规率从 12% 降到 <1%,平均多耗 token 18%,但节省人工 review 时间 55%。
6. 性能与质量:如何评估 CE 的收益
指标一:Signal-to-Noise Ratio(SNR)
计算方式:关键约束被遵守次数 / 总生成次数。
目标值:硬约束 ≥ 98%,风格约束 ≥ 90%。指标二:Token 利用率
记录“有效 token”(被模型实际引用到的句子)(用注意力可视化工具或 logprob 采样估算)。
利用率 < 35% 说明上下文冗余,需要裁剪。指标三:首响延迟 vs. 重试率
在 99th 延迟线内,若 Reflection-Loop 模板导致延迟上涨 > 30%,应把自检步骤异步化,先返回初版,后台修正。
7. 生产部署的 5 条铁律
- 版本冻结:prompt 文本要入 Git,按语义化版本号(v1.2.3)管理,禁止线上热修 hot-patch。
- 灰度双写:新 prompt 先切 5% 流量,对比 SNR、违规率,一周无回退再全量。
- 长度熔断:设置硬 token 上限(如 6 k),超出则自动触发 Slider 模板,防止 4 倍计费暴击。
- 审计日志:记录用户输入、最终 prompt、模型输出、违规原因,保留 30 天,方便回滚与合规审查。
- 调试黑匣子:线上遇到“灵异”回复时,先把完整消息链导出为 JSON,再在本地用相同快照重放,排除“时间窗口不同步”导致的上下文漂移。
8. 本地调试小技巧
- 用
claude-code cli的--debug-dump可把实际发出的 messages 写入dump.json,对比本地拼接顺序是否错位。 - 给 prompt 每一段落加隐形注释
[SEC-1]、[SEC-2],模型输出也要求带同样标记,可快速定位哪一段被忽略。 - 开启
temperature=0做单元测试,确保同样输入 diff=0,避免随机性掩盖逻辑 bug。 - 写 pytest 脚本批量跑 100 例,断言输出不含黑名单关键词,把 CE 纳入 CI,回滚红线自动触发。
9. 写在最后
Context Engineering 不是“写一条好 prompt”的玄学,而是把“信息优先级、噪声控制、位置心理学”系统化的工程活。上面 4 套模板直接搬到你的代码库,基本能覆盖 80% 高频场景;剩下 20% 需要你在自己的业务数据里持续测 SNR、调 Chunk、写 Schema。只要记住一句话——“token 很贵,信号必须坐在前排”——你就不会再被“上下文塌陷”绊倒。祝调试愉快,生成无 bug。