Skip to content

提示词与上下文拼装

这一页解释一条消息从你按发送到真正出站时,ETOS 给模型塞了什么、按什么顺序拼、什么情况下哪一层会缺席。

结论先说:ETOS 不是把所有内容揉成一坨字符串,而是按职责分层拼装,按固定顺序送进模型请求。理解这套层级 = 你能精确预测某次回答是被哪些上下文塑造的。

读这一页之前

建议先大致看过 聊天与模型记忆与世界书,否则下面提到的"全局提示词""话题提示词""世界书""画像"等概念会比较抽象。

为什么要分层

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

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

所以 ETOS 把它拆成八个语义清晰的块。

发送链路总览

一条用户消息发送时的处理顺序:

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

下面把八个上下文块逐个讲清楚——什么时候出现 / 什么时候缺席 / 适合放什么内容

八个上下文块

1. 全局提示词 <system_prompt>

整个 App 最长期的一层,承担"AI 的人格"。

  • 适合放:整体身份设定、默认语言、长期稳定的输出规范、通用安全边界
  • 不适合放:当前会话的短期任务(会污染所有会话)
  • 何时缺席:你设置的"当前选用的全局提示词"为空时

入口:设置 → 对话行为 → 偏好设置 → 全局系统提示词。可以建多条命名独立的全局提示词,每次新会话选一条。

2. 话题提示词 <topic_prompt>

会话级约束,告诉模型"这个会话到底在干什么"。

  • 适合放:某个项目的固定背景、某段时间内持续有效的工作目标、这个会话专用的写作风格或技术边界
  • 不适合放:通用人格(应该在 1)
  • 何时缺席:当前会话没有显式设置话题提示词时

全局提示词和话题提示词不互斥,是上下两层叠加。

3. 系统时间 <time>

当前本地时间 + ISO 8601 时间戳,作为独立块附给模型。

  • 目的 1:让模型处理"今天 / 明天 / 上午 / 刚刚"等相对时间时有锚点
  • 目的 2:避免模型在时间相关任务上瞎猜
  • 何时缺席:偏好设置里"发送系统时间"关闭

这一块每轮都动态更新,不会写死在会话创建时刻。

4. 长期记忆 <memory>

定位是"长期可复用事实",不是会话缓存。

发送时会附带两条明确约束告诉模型:

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

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

注入逻辑(关键)

状态行为
记忆系统关闭完全不注入
开启 + Top K > 0向量检索取最相关的 Top K 条
开启 + Top K = 0全量注入所有未归档记忆(不是"关闭检索")

Top K = 0 ≠ 关闭

许多用户以为「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中部 outlet 位置

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

这让世界书不只是"附一段 lore",而是可以精确控制自己出现在哪一层

8. 增强提示词 <enhanced_prompt>

特别注意:增强提示词不并入前面的总 system prompt,而是在消息序列最后追加为一条独立 system 消息

设计原因:

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

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

聊天历史不是无限带

上面是 system 层。还有聊天历史本身要处理:

机制作用
maxChatHistory 截断只保留最后 N 条消息(默认 30)
周期性时间地标按间隔在历史里插入时间锚点
atDepth 世界书按深度把世界书条目插入历史

截断 vs 地标 / 深度插入

两套机制目的不同

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

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

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

会送的

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

不会送的

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

这就是为什么工具中心里会出现「配置已启用,但当前会话不可用」的状态——因为这个会话开了世界书隔离。

详细机制见 世界书与工具治理

一张速查表:哪一层适合放什么

你想让 AI 知道放到
"你是某某 AI 助手"全局提示词
"本次会话讨论 ETOS 项目"话题提示词
"现在是 2026 年 5 月"系统时间(开 Toggle 自动注入)
"我用 Swift 工作"长期记忆
"上次我们聊到了 React 性能问题"跨会话摘要(自动)
"我偏好简洁回答"用户画像(自动 + 手动可编辑)
"角色 X 出现时该知道她的背景"世界书(关键词触发)
"本轮工具调用前先做 X"增强提示词

为什么这套设计重要

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

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

下一步