主题
5 层架构
A 股投研 Agent 的整体架构分为 5 层,外加一个跨层的 Citation Protocol 与 Verifier 机制。
L5 Orchestrator Hermes agent loop (existing)
L4 Skills Hermes Skills — verbs the Agent can DO
L4' Competences Hermes Competences — nouns/knowledge with provenance
L3 Tools Convention layer; Skills delegate data ops here
L2 Data Access JSON-serializable query interface over L1
L1 Storage Raw / Normalized / Curated / FeatureL4 与 L4' 是兄弟关系,不是上下层 —— Skills 在推理时引用 Competences。
每层职责
L5 — Orchestrator (Hermes)
- 已有,不重新设计
- 负责 agent loop、tool dispatch、turn lifecycle
- 增加:Model Router(~20 LOC,让任务可路由到 Hermes / Claude / GPT)
L4 — Skills
- Hermes 原语,Python 或 JavaScript
- 每个 Skill = 一个工作流(如"做估值分析"、"出投研日报")
- Skills 不直接调数据源,统一通过 L3 Tools
L4' — Competences
- Hermes 原语,知识 + 来源 的最小单元
- 例:「A 股财年 12 月 31 日结束 — 来源:CSRC 会计准则」
- LLM 不能编造 Competence — 只有注册的 Competence 才能被引用
- Citation 的
kind: "competence"锚定到这里
L3 — Tools (约定层)
- 纯数据操作,不含 LLM、不含推理
- Python / JavaScript 函数,输入输出 JSON 可序列化
- 例:
get_price(code, start, end),get_fundamentals(code, period) - Skills 之间可复用,可单元测试
L2 — Data Access
- 屏蔽 L1 的存储细节
- 接口稳定(即使换源也不影响 L3 之上)
- 跨边界不传 pandas DataFrame,传路径或序列化数据
L1 — Storage
详见 01 — 数据层。分 4 子层:
- Raw — 原始抓取,按源分区,永不修改
- Normalized — 字段标准化、单位统一、复权口径统一
- Curated — 跨源对账后的 truth
- Feature — 派生指标(ratios、滚动估值、行业分位数)
跨层机制
Citation Protocol
每个声明(数值或知识)都带 cite,是一个 tagged union:
kind: "tool"— 数据来源是 Tool 调用kind: "competence"— 数据来源是注册的 Competence
详见 Citation 协议。
Verifier
确定性代码(不是另一个 LLM)校验:
- 每个声明都有合法
cite tool_call_id在 trace 里真实存在- 引用的值与 Tool 实际返回值一致
competence_id已注册- 数值类声明在 staleness budget 内
失败处理:带反馈重试一次 → 仍失败则直接报告给用户,不静默 fallback。
Model Router
让 Hermes 不被硬编码:
| 任务类 | 默认模型 |
|---|---|
| Routing / planning / 简单工具调用 | Hermes (Nous) |
| 长 PDF 研报解析 | Claude Sonnet / GPT-4o |
| 最终综合写作 | Claude Opus / GPT-4 |
| Embedding | bge-m3 / OpenAI |
部署演进
- MVP:本地单进程 (Python),JS Skills 通过 Node 子进程调用
- 生产:每个 service 独立容器化
关键纪律:MVP 阶段就把所有跨层调用按"如同已经跨网络"来设计 —— JSON 序列化、无共享内存状态。这样从 MVP 到生产是部署配置变化,不是重写。