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 决定模型“能做什么”。