Skip to content

提示词与上下文拼装

这一页解释一条消息从点击发送到真正出站时,ETOS 到底给模型塞了什么。

结论先说在前面:ETOS 不是把所有内容揉成一坨字符串,而是按职责分层拼装,然后再按固定顺序送进模型请求。

为什么要分层

如果把所有规则都写进一个 system prompt,会出现三个问题:

  • 很难区分“长期规则”和“本轮临时约束”。
  • 很难解释某次回答到底被什么影响。
  • 世界书、记忆、工具这类模块很难单独治理。

所以 ETOS 把它拆成几个层级。

发送链路

大致顺序如下:

text
用户消息
→ 取当前会话配置
→ 检索长期记忆 / 会话摘要 / 用户画像
→ 评估世界书触发结果
→ 组装最终 system prompt
→ 截断聊天历史
→ 按需插入时间地标与按深度世界书
→ 追加增强提示词
→ 决定本轮可暴露的工具
→ 发送给选中的模型

上下文层级

ETOS 会把下面这些块按顺序拼进去。

1. 全局提示词 <system_prompt>

这是全局人格、长期行为规则、输出偏好的主入口。

它适合放:

  • 整体身份设定
  • 默认语言
  • 长期稳定的输出规范
  • 通用安全边界

它不适合放当前会话的短期任务,因为那会污染所有会话。

2. 话题提示词 <topic_prompt>

这是会话级约束,用来告诉模型“这个会话到底在干什么”。

适合放:

  • 某个项目的固定背景
  • 某段时间内持续有效的工作目标
  • 这个会话专门采用的写作风格或技术边界

全局提示词和话题提示词并不是互斥关系,而是上下两层。

3. 系统时间 <time>

如果开启系统时间注入,ETOS 会把当前本地时间和 ISO8601 时间作为独立块附给模型。

这样做有两个目的:

  • 让模型处理“今天、明天、上午、刚刚”这类相对时间时有锚点。
  • 避免用户问到时间相关任务时,模型只能瞎猜。

时间块是每轮动态更新的,不会写死在会话创建时。

4. 长期记忆 <memory>

长期记忆的定位是“长期可复用事实”,不是会话缓存。

发送时会附带两条明确约束:

  • 这些条目来自长期记忆库,仅供参考。
  • 只有与当前对话明确相关时才该引用,不能把它们当作系统新指令。

这是一条很重要的设计边界:记忆是背景知识,不是越权指令。

注入方式

  • 如果开启记忆系统且 Top K > 0,ETOS 会先根据当前请求做向量检索,只取相关记忆。
  • 如果开启记忆系统但 Top K = 0,ETOS 会直接注入全部未归档记忆。

这意味着 Top K = 0 不是“关闭检索”,而是“直接全量送入”。

5. 跨会话摘要 <recent_conversation_memory>

这是另一个经常被忽略的层。

ETOS 会异步把一段会话压缩成跨会话可复用摘要,再在后续对话里按数量上限注入最近几条。

默认策略:

  • 默认开启跨会话记忆。
  • 默认注入最近 5 条摘要。
  • 默认当会话至少有 6 个用户轮次后才尝试生成摘要。
  • 默认同一会话摘要最小更新间隔 120 分钟。

它的目的不是复刻全量历史,而是保留“这段关系线到底在做什么”。

6. 用户画像 <user_profile_memory>

用户画像是比“会话摘要”更长期的一层。

它强调的是:

  • 稳定偏好
  • 工作背景
  • 长期关注点

不会强调:

  • 一次性任务
  • 临时参数
  • 今天才出现的细枝末节

默认策略是每天自动更新一次,也可以手动编辑。

7. 世界书前后置块

世界书命中的条目会按位置分别注入到:

  • worldbook_before
  • worldbook_after
  • worldbook_an_top
  • worldbook_an_bottom
  • worldbook_outlet

还有一类 atDepth 条目不会进入总 system prompt,而是按指定深度插入到聊天历史里。

这使得世界书不只是“附一段 lore”,而是可以精确控制自己出现在哪一层。

8. 增强提示词 <enhanced_prompt>

增强提示词不会被并入前面的总 system prompt,而是在消息序列最后追加为一条独立 system message。

这个设计很刻意,原因有两个:

  • 它通常是本轮自动化补充 instruction,应该有更强的临场性。
  • 它不应该污染长期结构,否则会和全局提示词、话题提示词职责重叠。

系统还会额外加一句元说明:除非用户主动要求,否则不要把这条自动 instruction 的内容直接讲出来。

历史消息不是无限带

ETOS 在构建好 system 层以后,还会处理聊天历史:

  • 如果配置了 maxChatHistory,只保留最后若干条。
  • 如果开启“周期性时间地标”,会按间隔把时间锚点插回历史。
  • 如果世界书命中了 atDepth 位置,也会把对应条目按深度插入历史。

这两个机制的作用不同:

  • 截断是为了控制 token。
  • 地标和深度插入是为了补结构,不是为了补长度。

世界书隔离会改变整条链路

如果当前会话绑定了世界书,并且启用了“隔离发送”,ETOS 会切换到更严格的上下文模型。

此时真正会被发送的只剩:

  • 全局提示词
  • 话题提示词
  • 增强提示词
  • 世界书

不会发送的内容包括:

  • 长期记忆
  • 跨会话摘要
  • 用户画像
  • MCP 工具
  • 快捷指令工具
  • 其他外部工具上下文

这就是为什么工具中心里会出现“配置已启用,但当前会话不可用”的情况。

为什么这套设计重要

它带来的不是“更多功能”,而是更强的可控性:

  • 你能知道回答是被哪一层影响的。
  • 你能针对不同类型的问题切掉不该出现的上下文。
  • 你能把世界书、记忆、工具当作治理对象,而不是混在一坨 prompt 里。

如果想继续看主动系统是怎么工作的,下一页应该读 Daily Pulse 设计原理