System Reminder
System Reminder
定义
Claude Code 提出并实现的一套非常精妙的动态注入机制,在系统运行过程中,动态、结构化且安全地引导模型走向正确的方向。
核心实现
定义了一个关键的包装函数 wrapInSystemReminder(位于 utils/messages.ts),将所有需要注入系统的元信息(如配置文件内容、日期、工具执行结果等)统一包裹在 标签中。
为什么要这么做
因为在多轮对话的用户消息流中,模型极易混淆"用户输入"与"系统指令"。通过这种显式的标签隔离,系统能够向模型清晰地传达:"这部分内容是系统注入的元信息,而非用户的自然语言输入",从而有效避免了模型对上下文的误解或指令跟随的偏移。
应用场景
在 Claude Code 的架构中, 几乎贯穿了 Agent 交互的全生命周期:
1. 用户上下文初始化
在第一条用户消息发送前,系统会自动注入 CLAUDE.md 的项目规范、当前日期等基础信息,为 Agent 设定初始认知框架。
2. 工具结果反馈
当 Agent 调用工具完成后,工具的输出(如文件读取内容、记忆片段)会被包裹进该标签追加到对话历史中,确保模型能基于最新的执行结果进行推理。
3. 钩子(Hook)反馈
在复杂的自动化流程中,Hook 的执行结果同样通过此机制注入,让模型实时感知流程状态。
4. 周期性任务与能力描述
无论是待办任务的状态提醒,还是会话级别的技能列表(Skill List)、可用代理类型(Agent List),都通过这种标准化的方式动态挂载到上下文中。
这种多维度的注入策略,保证了 Agent 在任何时刻拥有的上下文都是完整、即时且结构清晰的。
工程化实践
这一机制被深度集成到了消息规范化流程中。在 normalizeMessagesForAPI 函数(utils/messages.ts)里,系统在将内部消息格式转换为大模型 API 所需的格式时,会自动识别需要注入的内容,并强制调用 wrapInSystemReminder 进行包裹。
这意味着,上下文的组装不再是依赖开发人员手动拼接字符串的"艺术活",而变成了一套标准化的、可复用的"工程流水线"。无论是在钩子系统(utils/hooks.ts)中处理执行反馈,还是在其他模块中动态加载配置,这套机制确保了所有注入数据格式的一致性,极大地降低了因格式混乱导致的模型幻觉风险。
启示
构建一个高可用的 Agent,必须建立一套好用的"提醒引导机制"。通过不断的系统级的提醒,让 Agent 时刻不忘记要做的任务目标和当前阶段。