模块 3 / 10

系统提示词与人格 (Persona)

定义 Agent 的"灵魂"——名字、性格、说话方式、工作原则。这决定了它是冷冰冰的工具,还是一个贴心的伙伴。

预计阅读时间:20 分钟 · 前置:模块 1 · 模块 2

📑 本模块目录

  1. Persona 是什么?为什么重要?
  2. Persona 的完整结构
  3. SOUL.md —— 全局人格文件
  4. Project Context —— 项目级规则
  5. System Prompt 加载优先级
  6. Profile —— 多身份系统
  7. 实战:编写你的第一个 Persona
  8. 常见疑问
1 Persona 是什么?为什么重要?

Persona(人格)是 Hermes Agent 的角色定义——它告诉 LLM「你是谁」「你怎么说话」「你该怎么做」。没有 Persona,Agent 就是一张白纸,冷冰冰没有个性。

❌ 没有 Persona

LLM 按默认风格回答。可能过于啰嗦、不停道歉、不敢做决定。像一个没有培训过的新员工。

✅ 有 Persona

Agent 有名字、有性格、有工作原则。干练直接、不废话、知道什么该做什么不该做。像一个磨合好的老搭档。

Persona 是 System Prompt 的 Layer 1——优先级最高。它在所有其他内容之前注入到 LLM 的上下文中,是 Agent 行为的「底层操作系统」。

Layer 1 · Persona名字、身份、性格、工作原则 ← 你在这里
Layer 2 · SOUL.md全局身份
Layer 3 · User Profile用户画像 (Memory)
Layer 4 · Agent MemoryAgent 笔记 (Memory)
Layer 5 · Skills加载的技能
Layer 6 · Project Context.hermes.md / AGENTS.md
Layer 7 · Environment HintsOS · Shell · CWD
Layer 8 · Toolstool schemas
📌 要点
  • Persona 是 System Prompt 的第一层,优先级最高
  • 它决定了 Agent 的行为底线——不会做的事永远不会做
  • 好的 Persona 让你和 Agent 的协作效率提升数倍

2 Persona 的完整结构
一个完整的 Persona 由六个部分组成
flowchart TD A["👤 Persona 六大模块"] --> B["1. 名字
Agent 叫什么"] A --> C["2. 身份
定位是什么角色"] A --> D["3. 性格与说话方式
语气、语言、风格"] A --> E["4. 工作原则
怎么做事的底线"] A --> F["5. 绝对不做的事
硬约束"] A --> G["6. 能力范围
能干什么"]

真实的 Persona 示例

# 身份
名字:小bu
定位:万能机器人助手,什么任务都能接、都能干。

# 性格与说话方式
语言:简体中文交流
风格:干练、直接、有底气——能做就做,不绕弯子
底线:不确定的事说"不确定",不编造

# 工作原则
规则:先想清楚再动手。最小改动,刚好够用。
规则:手术刀式修改——只动必须动的地方
规则:目标驱动,闭环验证

# 绝对不做的事
不编造:不确定的 API、不存在的参数、猜测的命令输出
不过度工程:用户要一把螺丝刀,不给一套工具箱
不偷偷重构:没被要求的"顺便优化"是风险

# 能力范围
写代码 / 调试 / 重构 / 设计架构 / 读源码 / 跑脚本 /
操作终端与文件 / 查资料 / 数据分析 / 自动化流程

1. 名字

Agent 叫什么。看似简单,但对 LLM 来说是身份锚点——Agent 会用它自称,用户也用它称呼。

2. 身份

Agent 是什么角色。定位决定行为边界。全栈开发?客服助手?数据分析师?不同定位会让 LLM 调用不同的"知识区域"。

3. 性格与说话方式

语气、语言、风格偏好。这是最直接影响用户体验的部分。简洁 vs 详细、直接 vs 委婉、中文 vs 英文。

4. 工作原则

做事的方法论。比如「先想清楚再动手」「最小改动原则」「目标驱动闭环验证」。这些是 Agent 的工作哲学。

5. 绝对不做的事

硬约束。不编造、不伪装成功、不过度工程。这些指令比「应该做」的优先级更高——LLM 必须遵守。

6. 能力范围

Agent 能做什么。不是实际功能限制,而是引导 LLM 的思维方向。告诉它"你擅长这些",它会优先用这些方向解决问题。


3 SOUL.md —— 全局人格文件
独立于任何项目,始终加载的 Agent 身份定义

SOUL.md 位于 $HERMES_HOME/SOUL.md。它是所有会话共享的全局人格——无论你在哪个目录下启动 Hermes,这个文件都会被加载。

📁 位置

~/.hermes/SOUL.md(默认)
或 $HERMES_HOME/SOUL.md

每个 Profile 可以有自己的 SOUL.md

⚡ 加载时机

每次新会话启动时自动注入到 System Prompt 的 Layer 2。

修改 SOUL.md 后需要 /reset 或新会话生效

💡 SOUL.md vs Persona:
SOUL.md 是独立文件,Persona 是 System Prompt 中的 Layer 1 文本块。两者可以共存——SOUL.md 适合放通用身份信息,Persona 适合放具体的任务级行为指令。优先级:Persona > SOUL.md。

SOUL.md 示例

# Hermes Soul

## 身份
我是一个 AI Agent,名字叫 Hermes。我由 Nous Research 开发。

## 核心信念
- 诚实 > 讨好用户
- 实用 > 花哨
- 行动 > 描述

## 说话风格
- 简洁直接,不绕弯子
- 不编造信息,不确定就说"不确定"
- 用工具做事,不只用嘴说

4 Project Context —— 项目级规则
让 Agent 了解当前项目的约定、风格和约束

Project Context 文件让 Agent 在特定项目目录下自动加载项目专属的规则和知识。这是让 Agent 从"通用助手"变成"项目专家"的关键。

文件发现方式何时用
.hermes.md / HERMES.md向上遍历到 git rootHermes 专属规则,支持根目录 + 子目录层级继承
AGENTS.md仅当前目录跨 Agent 可移植(Claude Code / Codex 都认)
CLAUDE.md仅当前目录Claude Code 风格,功能同 AGENTS.md
.cursorrules仅当前目录从 Cursor IDE 迁移时使用
⚠ 先到先得,不叠加:按上表优先级,找到第一个就停止。如果你同时有 .hermes.md 和 AGENTS.md,只有 .hermes.md 会加载。单个文件上限 20,000 字符。

.hermes.md 示例

# 我的 Python 项目

## 构建
- 使用 uv run,不要用 pip install
- 提交前必须跑 make test

## 代码风格
- 用 pathlib.Path 而不是 os.path
- 函数不超过 50 行
- 不要 print(),用 logger

## 测试
- 每个新功能必须有对应测试
- 用 pytest,不要用 unittest

5 System Prompt 加载优先级
理解各层的加载顺序和覆盖关系,避免"我明明写了规则为什么不生效"
🥇 Layer 1 · Persona最高优先级 — Agent 行为的最底层约束
🥈 Layer 2 · SOUL.md全局身份 — 跨项目共享
🥉 Layer 3 · User ProfileMemory 用户画像 — 偏好、环境
4 · Agent MemoryMemory Agent 笔记 — 经验、约定
5 · Active Skills加载的技能文档
6 · Project Context.hermes.md / AGENTS.md — 项目级
7 · Environment HintsOS · Shell · CWD — 自动检测
8 · Tools + Enforcement可用工具列表
覆盖规则:上层指令覆盖下层。如果你在 Persona 里写了「不要说谢谢」,即使 Skill 里建议说谢谢,Agent 也不会说。
但下层可以补充上层没有涉及的领域。比如 Persona 定义了说话风格,Project Context 可以补充"这个项目用 pytest 而不是 unittest"。

⏫ 改 Layer 1 (Persona)

影响所有会话。适合改 Agent 的核心性格、说话方式、底线规则。

📂 改 Layer 6 (Project Context)

只影响特定项目目录。适合加项目构建命令、代码风格、测试框架。

📝 改 Layer 5 (Skills)

按会话按需加载。适合复杂工作流、API 参考、平台专属知识。


6 Profile —— 多身份系统
一套机器,多个人格——工作用严肃的,个人用轻松的

如果你同时在多个项目(或不同身份)下使用 Hermes,Profile 让你可以为每个场景配置独立的 Persona、Skills、Memory 和配置。

# 创建新 Profile
hermes profile create work      # 工作用
hermes profile create personal  # 个人用

# 切换 Profile
hermes --profile work       # 以 work 身份启动
hermes --profile personal   # 以 personal 身份启动

# 管理 Profile
hermes profile list        # 列出所有
hermes profile use work    # 设为默认

🧩 每个 Profile 独立拥有

  • 自己的 config.yaml(不同模型、不同 Provider)
  • 自己的 .env(不同 API Key)
  • 自己的 SOUL.md(不同人格)
  • 自己的 skills/(不同技能集)
  • 自己的 Memory(不同记忆库)

💼 典型场景

  • work:连团队 GitLab,用企业模型,加载内部 Skills
  • personal:连个人 GitHub,用个人 Key,轻松性格
  • opensource:专门维护开源项目的 Profile
💡 Profile 彼此完全隔离。两个 Profile 之间的 Memory、Skills、配置互不影响。切换 Profile 就像换了一个全新的 Hermes 实例。

7 实战:编写你的第一个 Persona

假设你要创建一个「代码审查助手」的 Persona。它应该:

把这个 Persona 写在 ~/.hermes/SOUL.md:

# 代码审查助手

## 身份
你叫 CodeCat,是一个代码审查助手。你专注于代码质量和安全。

## 性格与说话方式
- 用简体中文交流,代码、技术术语保留原文
- 直接但不刻薄——指出问题给建议,不人身攻击
- 会说"这段代码不错"——不只是挑刺

## 工作原则
- 先理解代码意图,再给出建议
- 问题分级:🔴必须改 / 🟡建议改 / 🟢可选
- 每个建议都要给理由和示例

## 绝对不做的事
- 不自己改代码——只给建议
- 不评价代码风格除非影响可读性
- 不为"可能用到"的功能加代码

## 能力范围
代码审查 / 安全检查 / 性能分析 / 最佳实践建议 / 测试建议
📌 编写 Persona 的黄金法则
  • 具体 > 抽象:"不编造 API 参数"比"要诚实"有效 10 倍
  • 反面清单 > 正面清单:"不要做的事"比"应该做的事"更不容易被忽略
  • 例子 > 描述:给出具体场景的行为示例
  • 测试 → 迭代:写完后实际用几次,观察哪里不符合预期,再改

8 常见疑问
Q: Persona 写多长合适?
200-800 词最佳。太短约束不够,太长 LLM 可能忽略后半部分。核心约束放前面。
Q: Persona 和 SOUL.md 有什么区别?
Persona 是配置里的文本块(Layer 1),SOUL.md 是独立文件(Layer 2)。Persona 优先级更高,适合放任务级行为指令;SOUL.md 放通用身份信息。
Q: 改 Persona 后要重启吗?
需要 /reset 或新会话。Persona 是 System Prompt 的一部分,会话内不变(支持 Prompt Caching)。
Q: 怎么确认 Persona 生效了?
最直接的方法:问 Agent「你是谁?」「你叫什么名字?」。如果它按你定义的回答,就说明加载成功。
Q: 多个 Project Context 文件能共存吗?
不能。先到先得,不叠加。优先级:.hermes.md > AGENTS.md > CLAUDE.md > .cursorrules。找到一个就停。