185k stars 的 Hermes Agent 到底牛在哪?我拆了个能直接用的「自我进化」提示词
今天 GitHub 上有个项目炸了——NousResearch 的 hermes-agent,一天内新增 185,826 stars。
说实话,这个数字让我怀疑是不是 GitHub 的计数器坏了。但点进去看了一眼 Readme,只有一句话:**"The agent that grows with you"**(与你一同成长的代理)。
这个理念其实很多开发者都想过:让 AI 代理用过一次之后变得更懂你,不需要每次都从头教。但真正能落地的不多。我今天就基于这个思路,拆解一种可操作的实现方式,并给你一个可以直接复制用的提示词模板。
它解决什么问题
传统 AI 代理(比如普通 ChatGPT + 工具调用)的问题是:
- 每次对话都是独立 session,没有长期记忆
- 用户纠正一次之后,下次又犯同样的错误
- 无法积累偏好(比如“我习惯用 Markdown 表格而非列表”)
Hermes Agent 试图打破这个限制。虽然它的代码还没完全公开,但从命名和描述可以推测:它利用了 Hermes 系列模型本身对指令微调的良好泛化能力,配合一种记忆更新的机制。

我的理解是:通过提示词+外部记忆库,让代理在执行完任务后自动反思并更新自己的行为指南。
核心思路:反思-存储-应用三阶段
要让代理“成长”,需要三步:
- 执行:按当前指令完成任务
- 反思:任务结束后,让模型自己评估“哪里做得好,哪里可以改进”
- 存储:把反思结果写入一个可检索的记忆库,下次对话时注入系统指令
这其实类似于 CoT + 外挂知识库 的结合。但关键点在于:反思不是随意的,必须针对用户反馈或结果差异。
差 Prompt vs 好 Prompt 对比
❌ 差 Prompt(只定义了角色,没有成长机制)
你是一个 AI 助手,帮我完成各种任务。请尽量准确、高效。
效果:每次都是白纸一张,你纠正过它“不要用 emoji”,下次它照样用。
✅ 好 Prompt(包含了自我进化指令)
## 角色
你是一个具备成长能力的 AI 代理。你的目标是在每次交互后变得更了解用户偏好,并优化自己的行为。
## 核心机制
1. 每次回答结束后,你必须输出一个 `[REFLECTION]` 块,内容包括:
- 本次交互中用户纠正/不满意的点(如果有)
- 你认为可以改进的地方
- 提取出的一条通用规则(用“用户偏好:”开头)
2. 下次对话开始时,我会把所有历史 `[REFLECTION]` 中的“用户偏好”拼接到你的系统指令里。
3. 当后续任务与某条偏好冲突时,优先遵循偏好规则。
## 示例
用户说:“不要用英文标点,请用中文标点。”
你的回答结束后应输出:
[REFLECTION]
- 用户纠正了标点符号风格
- 改进:检查全文标点是否统一为中文
- 用户偏好:所有文字中的标点符号使用中文全角格式
## 当前存储的用户偏好
(此处会动态插入历史偏好)
请开始回答用户问题。
效果差异:
- 差 Prompt:你花3分钟教会它格式,下次它忘得一干二净
- 好 Prompt:你只需要纠正一次,它就会自己记录规则,并且在下一次自动遵守
原理:为什么这样有效
LLM 的 [REFLECTION] 机制利用了 指令微调模型中“自省”的能力。Hermes 系列(尤其是 Hermes-2 Pro)在训练时包含了大量的反思数据,所以模型能很好地完成“分析自己的输出并进行改进”这类任务。
如果底层模型不支持(比如 GPT-3.5-turbo),你可以将反思单独作为一次 API 调用,用独立的 prompt 让模型对刚才的回答做总结。

完整可复用的提示词模板(Python 示例)
import openai
class GrowingAgent:
def __init__(self, model="gpt-4"):
self.model = model
self.preferences = [] # 存储用户偏好列表
def build_system_prompt(self):
pref_section = "\n".join(self.preferences) if self.preferences else "无历史偏好"
return f"""
## 角色
你是一个具备成长能力的 AI 代理。
## 当前存储的用户偏好
{pref_section}
## 指令
在每次回答后,请输出一个 [REFLECTION] 块,格式如下:
- 用户反馈/纠正(如果有)
- 改进点
- 用户偏好:一条通用规则
"""
def chat(self, user_msg):
messages = [
{"role": "system", "content": self.build_system_prompt()},
{"role": "user", "content": user_msg}
]
response = openai.ChatCompletion.create(model=self.model, messages=messages)
reply = response.choices[0].message.content
# 提取反思内容
if "[REFLECTION]" in reply:
reflection_part = reply.split("[REFLECTION]")[-1].strip()
# 简单解析:找到"用户偏好:"开头的行
for line in reflection_part.split("\n"):
if line.startswith("用户偏好:"):
pref = line[len("用户偏好:"):].strip()
if pref not in self.preferences:
self.preferences.append(pref)
# 从回复中移除 [REFLECTION] 段,只展示给用户
reply_clean = reply.split("[REFLECTION]")[0].strip()
else:
reply_clean = reply
return reply_clean
# 使用示例
agent = GrowingAgent()
print(agent.chat("请用中文回复,并避免使用星号列表"))
print(agent.preferences)
# 第二次对话,偏好已自动加载
print(agent.chat("继续刚才的话题,给我三个建议"))
变体与扩展
变体1:基于向量数据库的记忆增强
当累积的偏好很多时,用列表拼接会让上下文爆掉。更好的做法是把每条偏好向量化存入 Chroma/Supabase,每次只检索最相关的3-5条。
变体2:基于反思的任务分解
如果代理需要完成复杂的多步骤任务,可以让它在每一步后做反思,逐步修正方向。这类似于 ReAct 模式但加入了长期记忆。
变体3:触发微调
对于 Hermes 这类开源模型,你可以定期收集用户反馈数据,用 LoRA 微调模型本身。这时候“反思”就成了训练数据的来源。但注意:这需要用户授权和计算资源,不适合实时场景。
注意事项
- 偏好冲突:当用户多次纠正且规则互相矛盾时(比如先让用 Markdown 表格,后让用列表),你需要引入优先级或时间戳,最近的规则优先。
- 知识漂移:长时间运行的代理可能会积累大量奇怪偏好,导致行为偏离核心目标。建议设置偏好上限(比如20条),超过后自动丢弃最久未被使用的。
- 成本控制:每次对话都让模型反思会有额外 token 消耗。对于高频任务,可以只在对回答有重大调整时才触发反思。
这个思路不依赖 Hermes Agent 的具体实现,你可以直接套用到任何 LLM API 上。核心就是让模型自己总结规则,然后你负责存和取。真正的成长不在于模型本身,而在于你帮它记住了什么。