Agent 实践

小龙虾系统提示词研究-虾说蓉城

文章目录
  1. 一、核心设计原则
  2. 二、完整 Prompt 结构
  3. 2.1 各 Section 详解
  4. 2.2 Tooling Section 额外指导
  5. 三、组装流程详解
  6. 3.1 入口点
  7. 3.2 完整组装步骤
  8. 四、系统提示词(System Prompt)构建细节
  9. 4.1 基础构成
  10. 4.2 Skills 处理
  11. 4.3 Bootstrap Files(Project Context)注入
  12. 4.4 Prompt 模式(Prompt Modes)
  13. 五、用户提示词(User Prompt)构建
  14. 5.1 用户消息处理
稳定提示前缀和可刷新内容组合成模型请求
图 1:缓存布局按内容稳定性组织,不代表指令或工具的安全优先级。

原文版本:2026-05-06;本次资料核对:2026-10-13。 源码基线:openclaw/openclaw @ 5584b0ad。以下区分 embedded、CLI 与 native Codex 等运行时,不把五月的实现当成所有版本通用契约。


一、核心设计原则

  1. OpenClaw 管理自己的提示词层:纯渲染器 buildAgentSystemPrompt、配置门面 buildConfiguredAgentSystemPrompt 和运行时适配器分工组装。native Codex 等宿主还会加入自己的上下文,不能把 OpenClaw 输出等同于原始模型请求的全部内容。
  2. Provider contribution 与通用 Hook 分工:Provider 可替换指定 section、贡献稳定前缀和动态后缀;这不等于获得整段提示词的任意替换权。全局 prompt hook 是另一套能力。
  3. 按稳定性分层:缓存边界是传输与缓存优化,不是指令权限边界。当前工具能力、Skills 目录与 Memory Recall 指导也可能在边界下刷新,不再统一归为“稳定层”。
  4. Skills 渐进加载:通常先放名称、描述、路径,模型需要时读取 SKILL.md;列入目录不代表全文已读取。
  5. 磁盘记忆与当前上下文分开:MEMORY.md 有受门控的引导加载;memory/*.md 通常按需检索。native Codex 在记忆工具可用时以按需访问为主,不能一概说全部记忆都外置或全部自动注入。

这些原则对应固定版本的 System Prompt 文档。


二、完整 Prompt 结构

2.1 各 Section 详解

System Prompt 不是永远不变的固定表。以下是当前版本的主要内容组,是否出现受工具、渠道、prompt mode 和运行时影响:

内容组 作用 生命周期
身份、工作空间、Project Context 人格与项目规则 较稳定,仍可刷新或截断
Execution Bias、Promised Work 行动与后续工作责任 通用指导
Provider 稳定前缀 模型家族适配 缓存优化用
Tooling、Skills、Memory Recall 当前可用能力与读取指导 目录/权限变化时可刷新
Care、Documentation、Sandbox 操作注意、资料入口和沙箱事实 根据当前能力渲染
OpenClaw Control、Messaging 配置控制与渠道动作指导 工具与渠道相关
Runtime、Reasoning、UI 等 运行环境与交互约束 易变
单独的 Runtime Context 消息 本地日期、时区、活动任务等 每轮更新,不是动态改写整个 system prompt

原文的 Current Date & Time、独立 Safety、Heartbeats section 与旧表不能直接套到当前版本。尤其是硬权限由工具策略、审批、沙箱和渠道授权执行,不靠安全段落是否排在前面。

缓存稳定前缀能否实际命中,要看具体 provider、传输方式、前缀字节是否一致和缓存策略。当前 OpenClaw 在支持的 Anthropic API-key 与 native OpenAI Responses 路径有相应前缀保持机制,并非只有本地后端缓存。

2.2 Tooling Section 额外指导

长任务的设计仍强调区分“现在运行”和“以后唤醒”:

  • 未来提醒、定时跟进使用调度能力;exec / process 管理当前已启动的工作。
  • 有完成唤醒时,依赖完成路径,不循环查询列表等待。
  • 子代理是否推送完成或需要收集,要看接受的 completion mode;子代理结束不代表用户目标已完成。
  • 是否具备这些工具、是否允许调用,仍以该轮工具策略为准。

三、组装流程详解

输入与有界上下文进入模型,工具请求由运行时处理后回填
图 2:模型与工具形成循环,具体宿主的上下文和门控实现各有差异。

3.1 入口点

Gateway 的 agent 请求、CLI agent 和连接的聊天入口最终都会涉及会话与运行准备;RPC 返回、会话保存及事件顺序要按入口区分,不应把一种入口的 { runId, acceptedAt } 当成所有入口统一返回值。

3.2 完整组装步骤

用户消息
→ 会话路由、请求与身份解析
→ 工作空间 / 沙箱 / Skills / 引导上下文准备
→ Context Engine 组装有限历史与可选提示增量
→ OpenClaw 提示词渲染、Provider contribution 与插件 hook
→ 运行时适配、工具策略与支持的输入门控
→ 模型调用 ↔ 工具执行
→ 回复整理与投递
→ 会话持久化、必要的压缩及后续维护

这张图是职责视图,不是源码函数的严格调用序列。runEmbeddedPiAgent 是嵌入式运行入口,不是与“Prompt 组装”完全分离的一次纯推理调用;native Codex / Copilot 有不同的宿主与历史管理边界。Agent Loop、Context Engine。


四、系统提示词(System Prompt)构建细节

技能目录元数据帮助选择,随后按需读取技能原文
图 3:列出技能不等于读完技能,更不等于授予工具权限。

4.1 基础构成

可以把组装理解为“渲染器接收明确输入,再由运行时提供事实”,而不是五层文本永远按同一顺序叠加:

配置与已解析的运行事实
├── OpenClaw 基础指导
├── Provider contribution
├── 已通过门控的工作空间上下文
├── 当前工具 / Skills / 渠道目录
└── Context Engine / Plugin 增量
        ↓
目标运行时的提示词与消息投影
        ↓
模型实际接收的系统/开发者指导、历史与当前输入

拼接位置不是安全优先级。 同一段 system prompt 内的先后位置可能影响模型注意力,却不能推出“后写规则覆盖前写安全要求”。消息角色、输入来源、运行时工具授权是不同层次;OpenAI 对消息角色的说明也不是按文本先后来决定权限。OpenAI 官方消息角色文档。

4.2 Skills 处理

通常先注入紧凑目录,再按任务读取:

<available_skills>
  <skill>
    <name>example</name>
    <description>任务适用条件</description>
    <location>skills/example/SKILL.md</location>
  </skill>
</available_skills>

Eligibility 包含 metadata gates、环境/config 检查、agent allowlist;bundled skills 还受插件启用状态控制。当前 per-agent 配置采用 agents.entries.<id>,不能继续照抄旧的 agents.list[]。

目录预算 skills.limits.maxSkillsPromptChars 与 agents.entries.<id>.skillsLimits.maxSkillsPromptChars,和实际工具读取内容的预算分开。native Codex 的目录载体还取决于是否有受管理的 inference relay。Skills 文档。

4.3 Bootstrap Files(Project Context)注入

下表描述当前文件职责,不表示每种会话每轮都把全文直接塞进 system prompt:

文件 职责 当前加载边界
AGENTS.md 工作空间/项目指令 引导上下文;native Codex 可走原生项目发现
SOUL.md、IDENTITY.md 人格、身份 配置工作空间来源,受运行时载体约束
USER.md 用户资料与偏好 受用户选择和隐私范围约束
BOOTSTRAP.md 新工作空间引导 新建模板后按存在状态处理,不是所有会话必有
MEMORY.md 精炼长期事实 非 Codex 可受限注入;native Codex 工具可用时按需读
TOOLS.md 本地工具说明 原文的独立 Bootstrap 列表已不适用于该源码版本
心跳材料 定时任务检查上下文 心跳专用,不是普通 turn 的通用 Bootstrap

当前普通 Bootstrap 列表不再把 HEARTBEAT.md 当作通用引导文件。实际执行目录与配置的 agent workspace 不同时,也不能任意加载执行目录里的 persona/用户记忆。

memory/*.md 每日笔记不参加普通引导注入;裸 /new / /reset 首轮可以带入最近每日笔记。

当前默认限制:

参数 默认值 说明
agents.defaults.bootstrapMaxChars 20,000 单文件字符预算
agents.defaults.bootstrapTotalMaxChars 60,000 合计字符预算

原文的 12,000 单文件默认值已更新;bootstrapPromptTruncationWarning 也不应继续作为当前可调示例。当前截断通知内置,诊断可见各文件 raw / injected 大小。截断的是注入副本,不是磁盘原文件。

普通子代理 Bootstrap allowlist 当前只保留 AGENTS.md,不是 AGENTS.md + TOOLS.md。native harness 继承的线程指导还需另行区分。agent:bootstrap 内部 hook 可修改引导文件集合。加载与过滤源码。

4.4 Prompt 模式(Prompt Modes)

模式 说明
full 完整渲染,仍受工具与渠道条件控制
minimal 精简子代理指导;当前可保留提供的 Skills、Care、Tooling 等
none 只返回基础身份行

promptMode 是运行时选项,不是面向用户的普通配置开关。“minimal 一定去掉 Skills”是旧描述。


五、用户提示词(User Prompt)构建

5.1 用户消息处理

消息会经过渠道 envelope、命令/directive、附件及运行时上下文处理。命令是否识别、是否剥离,受渠道和发送者授权影响,不能把任何 /... 都当成已授权控制命令。

图片、音频、文件可能作为多模态输入、提取文本或附件引用进入请求,不统一使用工具结果格式。

5.2 历史消息(Conversation History)

历史是带角色的消息集合,不是全部拼成一个 User Prompt。模型能看到的是经过可见性、修剪、压缩和预算处理的历史。

该版本默认会话与 transcript 存储已转为每 agent 的 ~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite;旧 sessions/<sessionId>.jsonl 路径属于历史实现/导出兼容场景,不宜写成唯一现行存储。Session 文档。

5.3 工具调用与结果

模型请求工具 → 运行时校验/审批 → 执行 → 结果加入后续模型输入

工具结果是资料,不因进入上下文就获得更高指令权限;调用与返回还要保持配对,避免压缩后产生无对应结果的调用。


六、会话历史管理与 Compaction

6.1 Context Engine

生命周期 作用
ingest 摄入单条消息
assemble 返回预算内消息与可选 systemPromptAddition
compact 总结/缩减上下文
afterTurn 等 可选的后处理、维护与子代理生命周期

当前必需接口还包括 info;afterTurn 不是每个插件必须实现的方法。内置 legacy 默认保持既有组装与压缩行为;native Codex 仍拥有原生线程历史与 compactor。

6.2 Compaction(压缩)

通常是旧历史摘要加近期原文,而非“删掉磁盘上的全部旧对话”。当前内置压缩保留 transcript 的原消息,并记录摘要/压缩状态。

自动 memory flush 通常在压缩前提供一次静默保存机会,受启用配置、可写访问和工具策略限制;它不保证关键事实全部保存。可配置专用模型,但本地模型是否更快取决于硬件和模型,不能预设。Compaction、Memory Flush。

6.3 Session Pruning

Pruning 主要修剪模型请求中的旧工具结果,通常不改底层 transcript;Compaction 生成持久化摘要并改变后续有效上下文。两者都不应被描述成模型获得无损、无限的记忆。


七、Provider Hooks 与插件扩展

7.1 Provider 插件可贡献的内容

Provider contribution 可替换 interaction_style、tool_call_style、execution_bias 三个命名 section,添加稳定前缀与动态后缀。模型家族专属调优优先走该接口,真正全局的 prompt 修改再考虑通用 hook。

7.2 Plugin Hooks(OpenClaw 生命周期拦截点)

以下是与本文有关的子集,不是完整 hook 列表:

Hook 作用与限制
before_model_resolve 覆盖本轮 provider/model/fallbacks
agent_turn_prepare 处理已准备消息与排队注入;并非所有 harness 都接线
before_prompt_build 文本增量、系统覆盖与缩小工具面,按运行时支持
before_agent_run 支持的 embedded / CLI 等路径上输入门控,不能泛化到 Codex
before_agent_reply 支持路径上短路返回合成回复
before_agent_finalize 自然答案验收时可请求修订,受额外轮次预算限制
agent_end 完成观察,不等于最终回复一定成功
before_tool_call / after_tool_call 工具参数、策略与结果生命周期

处理器收到 (event, ctx),不是通用的 event.context 包装。访问对话与允许 prompt 注入有分别的插件权限门。工具支持的数据召回可使用 requiresToolAuthority 的授权后阶段。官方 Hook 契约。


八、关键配置参数

以下是局部示例,不是可直接覆盖现有环境的完整配置。部署时应按安装版本 schema 合并校验。

8.1 Bootstrap 控制

{
  agents: {
    defaults: {
      workspace: "~/.openclaw/workspace",
      bootstrapMaxChars: 20000,
      bootstrapTotalMaxChars: 60000
    }
  }
}

8.2 Skills 控制

{
  skills: { limits: { maxSkillsPromptChars: 5000 } },
  agents: {
    defaults: { skills: ["github", "weather"] },
    entries: { docs: { skills: ["docs-search"] } }
  }
}

5,000 是这里人为选择的目录预算,不是官方默认值;技能名称也只是示例,须实际存在且符合 eligibility。

8.3 Compaction 控制

{
  agents: {
    defaults: {
      compaction: {
        memoryFlush: { model: "ollama/qwen3:8b" }
      }
    }
  }
}

此字段对应专用 flush 模型,示例不证明该模型已安装或能够加速。

8.4 Context Engine

{
  plugins: { slots: { contextEngine: "legacy" } }
}

安装并启用其他引擎后,才可改为其注册 ID。配置参考。


九、Inspect 命令

命令 用途
/status 查看当前会话与上下文状态
/context list 查看已注入文件及粗略大小
/context detail 查看更细的文件、工具 schema、目录开销
/usage tokens 开启回复用量显示
/compact 手动请求压缩

原文示例同时写“单文件 12,000”与“注入 20,962”,彼此矛盾,因此不再保留这组伪诊断数字。实际输出随版本、运行时和当前工具而变;本文没有执行上述命令。Context 诊断。


十、完整数据流图

Gateway / CLI / 渠道输入
        ↓
会话路由 + 工作空间 + 身份/可见性
        ↓
上下文引擎 + OpenClaw prompt + 插件/Provider contribution
        ↓
目标 harness(embedded / CLI / native Codex / 其他)
        ↓
模型消息投影 ↔ 已授权工具执行
        ↓
回复整理、投递、状态与 transcript 持久化
        ↓
需要时压缩、记忆保存机会与后台维护

上图保留职责全景,不把不同 harness 的函数名、缓存和存储强行画成同一套实现。


十一、相关文档索引


2026-10-13 资料核对:已浏览官方文档并读取上述固定提交的提示词文档、工作空间过滤源码、Hook 契约和会话/上下文资料;OpenAI 相关先读本地 openai-docs 技能,再查官方消息角色文档。本文未运行 OpenClaw 或任何配置/缓存测试。

记录到这里,判断留给实践。