InvesResearch DocsWeb工程 PRD · 分层 + 契约
Engineering PRD · web/docs/engineering-prd.md · v2.0

契约先行 · 验收即测试 · Harness 与 Agent 解耦

这份工程 PRD 服务工程师而非利益相关方, 回答"怎么把它造出来 / 各部分契约是什么 / 什么算做完了"。三条写作原则: 契约先行(Pydantic schema)、验收即测试(Given-When-Then)、Harness 与 Agent 解耦(2025-2026 agent 工程最重要范式转变)。

§2.1 三层解耦

Harness / Agent / Capability

整个系统的最高层抽象是三个解耦的层。理解这三层的边界, 是理解后续所有设计决策的前提。

3
L3 · 最上层

Capability · Skills + MCP 双层

Skills 承载「知识与流程」——DCF 估值 SOP / 研报写作规范 / 竞品对比框架, 相对稳定可以写下来。MCP 承载「数据与计算」——取财务数据 / 跑 DCF / 筛选股票 / 检索新闻, 每次调用结果都变需要实时访问。
Skills
数据稳定到能写下来, 几周内都成立就用 Skill
MCP
结果每次调用都变, 需持有凭证就用 MCP
2
L2 · 中间层

Agent Logic · 可替换业务大脑

每个 agent 的角色定义、提示词、辩论策略、模型选择。这一层会随对投研流程理解加深而频繁迭代, 但被 harness 托管, 不直接触碰底层的状态持久化和工具调用机制。
1
L1 · 最底层

Harness · 工程骨架

模型之外承载 agent 运行的一切: 会话持久化 · 编排循环 · 上下文管理 · 工具路由 · 沙箱 · 凭证边界 · 过程追踪 · 结果评估。关键: 独立于具体模型和 agent 逻辑演进, 模型升级时骨架可加可减。
§2.2 Harness

Harness · 8 个子系统

把 Harness 这一层进一步展开, 它由 8 个职责清晰的子系统组成。这套分层直接来自 2025-2026 年 agent harness 工程的业界共识。每个子系统单一职责、清晰边界, 可独立测试、独立替换。

1

Session · 会话

持久化状态 · LangGraph + Postgres checkpointer · 任何会话可中断可恢复

2

Control · 编排

决定下一步执行哪个节点 · 如何恢复失败的步骤

3

Context · 上下文

接近窗口上限时压缩(compaction) · 工具结果清理 · 子代理上下文隔离

4

Tool Router

把 agent 动作意图分发到正确的 MCP 工具

5

Sandbox · 沙箱

隔离执行不可信代码

6

Credentials

守住凭证边界 · agent 永远看不到数据库密码或 API key

7

Trace · 追踪

记录全过程 · Langfuse 自托管 + OpenLLMetry 埋点

8

Eval · 评估

对结果做评判 · 确定性检查 + LLM-as-judge · 人工校准

§4 数据契约

Pydantic 核心 schema

数据模型是系统的契约基础。Pydantic 既是运行时的校验器, 也是文档, 还是测试的基准。标的标识统一为 MARKET:TICKER, 内部一律用统一 ID, 避免 A 股六位数字、港股五位数字、美股字母代码在系统里混用导致路由错误。

Security · DailyBar · FinancialStatement · ResearchReport

class Security(BaseModel):
    uid: str            # 统一 ID, 如 "SH:600519"
    market: Market
    ticker: str         # 原始代码, 如 "600519"
    name_cn: str | None
    name_en: str | None
    currency: str       # CNY / HKD / USD
    sector_gics: str | None
    sector_sw: str | None   # 申万行业

class FinancialStatement(BaseModel):
    uid: str
    period: str         # "2025A" / "2025Q3"
    revenue: float | None
    net_income: float | None
    operating_cash_flow: float | None
    # 关键指标跨源校验, 差异 > 10% 时打 flag
    data_quality_flag: bool = False
    source: str

class ResearchReport(BaseModel):
    report_id: str
    uid: str
    template: ReportTemplate    # quick_note / deep_dive / sector / earnings_recap
    sections: list[ReportSection]
    rating: Rating | None       # buy / hold / sell
    target_price: float | None
    version: int                # 支持版本 diff
    disclaimer: str             # 强制非空, 免责声明
§10 MVP 里程碑

M1 → M6 · 依赖链条

M1 是地基, 其余全部依赖。任何 M1 延期会向后传导。M3 和 M4 可在 M2 完成后并行。

M1
no deps

数据层 · 地基

统一数据适配器、市场感知路由、优先级 failover、熔断器、Redis 令牌桶限流、四层缓存。A 股: Tushare 主源 + AKShare 备源。
验收单市场单源可用率 > 99% · 缓存命中率 > 80% · 不触发限流封禁
M2
M1

单 Agent + MCP 工具

FastMCP server · get_financials / run_dcf 两个核心工具 · 公司基本面调研 Skill · Pydantic 结构化输出 · Langfuse 埋点。
验收单 agent 对一个 A 股标的产出符合 schema 的结构化结果, Langfuse 中可追踪
M3
M2

多 Agent 辩论编排

LangGraph 状态机 · 分析师组并行 fan-out · 多空辩论循环 · 风控官 · PM 节点 · Postgres checkpointer · 估值假设 HITL interrupt。
验收深度调研能跑完完整辩论 · 任意节点失败可恢复 · 人工可在估值假设介入
M4
M2

RAG · 舆情

pgvector 向量库 · 研报与新闻 RAG · search_news / vector_search · 情绪分析 · 量化筛选。
验收语义检索问答 · 情绪分析可追溯到来源
M5
M3 · M4

报告 + 前端

研报生成 Skill(两段式长任务 harness)· 四种模板 · PDF / DOCX 导出 · Next.js 前端 + SSE 实时进度流。
验收Web 上发起调研 · 实时看 agent 进度 · 下载完整研报
M6
all

三市场 + 私有化

港股 + 美股市场感知路由(美股 edgartools)· vLLM 私有部署 · 完整 eval 回归套件 · 安全加固。
验收三地市场全覆盖 · 机构数据不出域 · eval 回归集成 CI
附录 A · ADR

10 项架构决策

每条决策有主要依据和可逆点, 让团队理解"为什么是它" 而非"为什么不是别的"。

编号决策选择主要依据可逆点
ADR-01后端语言Python金融数据库与 agent SDK 生态全在 Python几乎不可逆
ADR-02编排框架LangGraph生产可控、checkpointing、可观测最强退化单 agent 可降级 OpenAI Agents SDK
ADR-03结构化输出Pydantic + 原生事实标准, 生成层强制 schema 最可靠不可逆
ADR-04真相源数据库PostgreSQL / TimescaleDB时序分块 + 列式压缩 + 连续聚合可迁移
ADR-05分析层DuckDB / Parquet进程内 OLAP, 直查 Parquet, 适合回测扫描可替换
ADR-06向量库pgvector → Qdrant小规模同栈起步, 规模化迁 Rust 强过滤库迁移成本=重建索引
ADR-07可观测性Langfuse 自托管 + OpenLLMetry开源、OTel 原生、可气隙、避免锁定可换 backend
ADR-08MCP 框架FastMCP兼容最新 spec、Streamable HTTP、OAuth可替换
ADR-09私有推理vLLM + Qwen/DeepSeekPagedAttention 高吞吐, 数据主权仅机构场景启用
ADR-10能力分层Skills(知识)+ MCP(数据计算)数据会变用 MCP, 知识稳定用 Skill边界可调
附录 B · NFR

11 项非功能指标

这些是设计约束, 也是最终验收的依据。性能用 P95 / P99 而非平均值, 因为 LLM 系统里平均延迟会掩盖让用户抓狂的长尾。

维度指标目标值
性能深度调研端到端 P95 延迟≤ 10 分钟
性能快速调研端到端延迟≤ 4 分钟
性能缓存命中响应≤ 100 ms
性能并发会话≥ 20
成本单次深度调研 token 成本≤ $0.5
成本预算护栏告警 / 熔断80% / 100%
可靠性单市场单源数据可用率> 99%
可靠性缓存命中率> 80%
可观测trace 覆盖100% LLM/工具调用
质量Skill 调用成功率(MVP/差异化)≥ 90% / ≥ 95%
安全第三方 Skill / MCP 上线前审计100%
§0 写作原则

三条工程原则

1

契约先行

在 agent 系统里, 模糊性是最大的成本来源。本文档为每个 Skill / MCP 工具 / API 端点都给出明确的接口契约和 Pydantic 数据模型, 防止集成时崩溃。

2

验收即测试

所有功能需求附 Given-When-Then 验收标准, 设计成可直接转化为离线 eval 数据集或自动化测试用例。"系统应该准确" 不可验收, "DCF 在 WACC=8.5% / g=3% 下输出每股内在价值落在 1760-2140" 可验收。

3

Harness 与 Agent 解耦

大模型每升级一次, 围绕它搭建的复杂度就要被重新定价。解耦的架构让我们能在不动核心业务逻辑的前提下, 既给 harness 做加法, 也做减法。