Skip to content

5 层架构

A 股投研 Agent 的整体架构分为 5 层,外加一个跨层的 Citation ProtocolVerifier 机制。

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 / Feature

L4 与 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
Embeddingbge-m3 / OpenAI

部署演进

  • MVP:本地单进程 (Python),JS Skills 通过 Node 子进程调用
  • 生产:每个 service 独立容器化

关键纪律:MVP 阶段就把所有跨层调用按"如同已经跨网络"来设计 —— JSON 序列化、无共享内存状态。这样从 MVP 到生产是部署配置变化,不是重写。

进一步阅读

Internal documentation