第二章:一条任务在 Hermes 中怎样流转
同样是“整理本周变化”,你可以在命令行中提出,也可以通过消息平台发送。换了入口,系统不应丢掉任务目标;但它必须知道这条消息属于哪个身份、哪段历史,以及能动用哪些能力。
上一章分清了模型与工具。本章再加一层:入口如何把消息交给核心,核心如何组织行动,状态又如何留下。
2.1 先建立四层责任图
不要先背目录名。可以把 Hermes 的这次处理分成四层:
| 层次 | 要回答的问题 | 简报任务中的例子 |
|---|---|---|
| 入口 | 消息从哪里来,怎样回去? | 终端输入或消息平台适配 |
| 会话与配置 | 当前是谁,延续哪段历史? | 使用哪个配置档、模型和已有材料 |
| 核心运行 | 现在需要什么信息和行动? | 组装请求、调用模型、处理工具结果 |
| 外部能力与存储 | 实际访问什么,留下什么? | 读发布记录、保存会话与交付文件 |
这是帮助理解的分层,不是说源码恰好只有四个模块。实际实现还包含认证、流式输出、压缩、取消和错误恢复等横跨多层的事务。
2.2 跟一次请求走完主线
以下过程是教学示意。先收到目标和约束:“只看官方来源,列出三项值得学习的机制变化,不能确认就说明。”入口把消息交入相应会话,而不是随便打开一份全局聊天记录。
核心准备模型这次能读到的内容:目标、已有历史、相关上下文和工具说明。模型可以提出查询发布记录;程序执行工具,将返回的数据或错误补进历史,再准备下一轮。循环持续到形成回答,或被中断、限制和错误处理结束。
最后的文本会通过对应入口返回。会话保存则支持后续追问,例如“第二项为什么不算模型训练”。输出到界面和保存状态不是同一项责任:看到文字不等于已经可靠落盘,恢复也需要存储与生命周期机制配合。
2.3 找源码时,从责任找入口
Hermes 这个版本中的 run_agent.py 是核心对外入口之一。循环主体位于 agent/conversation_loop.py,各轮阶段拆在 agent/turn_*.py 等模块。不能因为看到一个入口文件,就把它当作整个系统的全部逻辑。
提示词准备、模型访问、工具执行和会话存储也分别有专门实现。理解一个行为时,先问它属于哪项责任:检索没发生,可能在模型决策或工具路由;查到了却忘记,可能在上下文或历史处理;第二天重开会话消失,则要看持久化与会话选择。
2.4 同一个核心,不表示状态处处共享
共享行动机制可以减少不同入口之间的行为分叉。但会话、Profile 和平台身份仍然需要明确边界。工作简报的历史不应因为“都经过同一核心”就自动进入另一位用户的对话。
第九章会区分这些身份与状态单位。现在先记住:共享能力与隔离数据可以同时成立。更换界面也不等于换了模型,更不等于自动获得新的权限。
不写代码的小练习
取一条你熟悉的研究请求,写出入口、会话与配置、核心运行、外部能力与存储四项责任。假设最终文件没有留下,指出先查哪一层,以及还缺什么证据才能确定根因。
本章要点
- 按入口、会话与配置、核心运行、外部能力与存储理解一次请求。
- 核心需要不断准备上下文,将工具结果送回后续模型请求。
- 界面显示、状态保存和下次恢复需要分别检查。
- 从具体责任寻找源码,比记住一张庞大目录树更有用。
理解题
1. 终端中能找到昨日简报,消息平台上却没有这段历史,先查什么?
先核对使用的 Profile、会话标识与历史选择,确认它们是否本来就是不同会话。不要先把问题归因于“模型忘性大”,也不要为了方便直接共享所有历史。
2. 工具确实取得了新版本,但回答仍引用旧版本,怎样缩小排查范围?
检查新结果是否进入后续上下文,旧材料是否仍占主导,以及模型最后使用了哪个来源。工具执行成功把问题缩小到了反馈、上下文组织或解释环节,但还不能单凭这一点确定唯一根因。
对照官方实现
下一章聚焦核心运行:它怎样继续,又凭什么停止。