Technical Guide

07. Prompt 与上下文:系统提示词、项目规则、记忆怎么进上下文

看懂 Hermes 如何组装系统提示词、技能索引、项目规则、记忆和运行环境提示。

这篇解决什么问题

很多人调 Agent 时,第一反应是换模型。

但在 Hermes 里,一个回答是什么样,不只由模型决定,还由上下文决定:系统提示词、persona、skills、memory、项目规则、平台信息、工具列表都会影响模型行为。

这一篇看这些内容从哪里来。

关键文件

先看:

agent/prompt_builder.py
agent/system_prompt.py
agent/memory_manager.py
agent/context_compressor.py
agent/skill_utils.py

其中 prompt_builder.py 文件开头写得很直白:它负责 system prompt assembly,包括 identity、platform hints、skills index、context files。

系统提示词不是一整块硬编码

Hermes 的系统提示词是拼出来的。

常见来源包括:

默认身份
Hermes 自身使用说明
当前平台提示
工具使用规则
用户记忆 / profile
技能索引
项目上下文文件
运行环境信息
安全和执行约束

这也是为什么同一个模型,在 Hermes 里会表现得像“能干活的 Agent”。

项目规则从哪里来

Hermes 会读取项目上下文文件,例如:

.hermes.md / HERMES.md
AGENTS.md
CLAUDE.md
.cursorrules
.cursor/rules/*.mdc

这里要注意:不同文件的发现规则不一样。比如 .hermes.md 会沿目录向上找,直到 git root;而 AGENTS.md 更偏当前目录约定。

这些文件最终会进入系统提示词,影响 Agent 在项目里的行为。

为什么要扫描 prompt injection

prompt_builder.py 里有上下文文件扫描逻辑。

原因很简单:项目里的 AGENTS.md.cursorrules 可能来自外部仓库。如果里面藏了 prompt injection,直接塞进系统提示词很危险。

所以源码里会调用 threat pattern 扫描,把可疑内容替换成 blocked placeholder。

这是 Hermes 和普通“读一个 README 再问模型”的区别之一。

Skills 怎么进入上下文

Skills 不会全部完整塞进去。

通常系统提示词会放 skill 索引和触发条件,真正需要时再通过 skill_view 加载完整内容。

这能避免两个问题:

  • 所有 skill 一次性塞进上下文,太贵;
  • 模型被一堆无关流程干扰。

所以 Hermes 的 skill 设计更像“程序化知识库”:先索引,后按需加载。

Memory 怎么进入上下文

Memory 是跨会话信息。

memory_manager.py 负责把相关记忆构造成 prompt block。它和 session history 不一样:

Memory:长期稳定事实,例如用户偏好、环境约定
Session:过去对话记录,用 session_search 查

这也是为什么系统提示词里会反复强调:不要把临时任务进度写进 memory。

上下文过长怎么办

Hermes 有上下文压缩逻辑。

相关文件包括:

agent/context_compressor.py
agent/conversation_compression.py

主循环会估算请求 token,必要时压缩历史消息或提示用户。

源码阅读时,不要把压缩当成附属功能。长任务、工具调用、多轮修复都依赖它。

如果你要改提示词

先判断要改哪类提示:

默认身份 / 总体规则        → agent/system_prompt.py
项目特定规则              → 项目里的 .hermes.md / AGENTS.md
某类任务流程              → skill
长期用户偏好              → memory
某次临时要求              → 当前用户消息

不要把所有东西都塞进系统提示词。那样会变得不可维护。

下一篇看什么

下一篇看 Tools 原理。

Prompt 决定模型“该怎么想”,Tools 决定模型“能做什么”。