Prompt 解剖与工具双轨约束
每份 Prompt 都拆成 systemPrompt(稳定规则)与 userPrompt(动态数据)两段;而"该调什么工具"由 schema 与 Prompt 语义约定双轨共同定义。
system / user 双层 · schema + 软约定

一、Prompt 的两段式结构

systemPrompt · 稳定层 角色定义 / 硬约束 / 否定清单 / 工作流 / 输出模板 —— 可缓存、可被运营改写
userPrompt · 动态层 记忆数据 / 时间戳 / 统计 —— 每次重新组装
动态数据永不进 system:否则提示词缓存失效,运营改写也会被数据污染。

二、区块顺序(以 L2 场景整合为例)

systemPrompt —— 11 个区块
1输出语言 2角色定义 3架构模型 4场景上限(参数注入) 5文件操作约束(7 条) 6文件命名规范(正反例) 7工作流 阶段 0–3 8撰写准则 9热度管理 10输出规范(META + 模板) 11主动触发信号
L3 结构同源:文件操作约束 → 严格禁止 → 核心运作逻辑(四层深扫)→ 输出模板。L1 则是"任务一 / 二 / 三"三段式。
userPrompt —— 动态区块
1输出语言 2New Memories List 3Existing Scene Blocks Summary 4Current Timestamp 5已有场景文件清单(read 白名单) 6场景数量警告(运行时分档)
L3 的 user 段更重:已把现有 persona.md 全文预加载进来,所以 Prompt 明确写"无需 read 工具"——用输入换调用次数。

三、工具是怎么"告诉"LLM 的:双轨并行

轨一 · 工具 schema(硬约束,走 API 字段)

read : { path } write : { path, content } edit : { path, edits:[{ oldText, newText }] } tools: { allow: ["read","write","edit"] } disableTools: !enableTools stopWhen: stepCountIs(20) resolveSandboxedPath() // 越界即拒绝
参数名 / 必填项 / 类型由 inputSchema 定义,这就是模型看到的函数签名。白名单之外的工具(exec / browser / cron)不可见。

轨二 · Prompt 语义约定(软约束)

  • 声明有哪些工具:明确点名 write / edit,并限定 read 的可用范围
  • 说明何时用哪个:整体重写用 write,局部替换用 edit,结构性变更建议 read + write
  • 说明参数语义:path = 相对文件名、content = 完整内容、edits = [{oldText, newText}]
  • 刻意缺省 delete:改由 write(path, "[DELETED]") 软删除,工程侧扫描真删
Prompt 里不重复 schema,只做"有哪些、何时用、参数什么意思"的语义约定 —— 硬软分工,各管一层。
L2 · workspaceDir = scene_blocks/
checkpoint、scene_index、persona.md 对 LLM 物理不可见 —— 靠隔离。
L3 · workspaceDir = dataDir
能看到文件树,因此 Prompt 必须显式禁止从路径 / 目录结构推断用户信息 —— 靠禁令。
来源:MemoryCore/src/core/prompts/{l1-extraction,l1-dedup,scene-extraction,persona-generation}.ts 与 src/utils/clean-context-runner.ts、src/adapters/standalone/llm-runner.ts。同一套 runner 只换 workspaceDir,就得到"物理隔离"与"显式禁令"两种可见性模型。