EXPERT Day 177: 金融研究 AI Agent v1 — 需求与架构设计
PRD 写作、Multi-Agent 系统设计、LangGraph 状态机、跨资产研究流程建模
日期: 2026-10-25 方向: AI 系统工程 / Multi-Agent / Financial Research 阶段: Phase 3 - 实战 Capstone(Day 177-180) 标签: #AIAgent #LangGraph #MCP #RAG #Finance #Architecture #PRD
今日目标
经过 Day 121-176 的全栈 AI 系统工程铺垫(LLM 基础、Prompt 工程、RAG、Agent、LLMOps、Eval、Safety),今天进入实战 Capstone:把过去 56 天的所有组件捏合成一个可上线的产品——金融研究 AI Agent v1。
| 类型 | 内容 |
|---|---|
| 学习 | PRD 写作、Multi-Agent 系统设计、LangGraph 状态机、跨资产研究流程建模 |
| 实操 | 完成 PRD + 系统架构图 + Agent 拓扑 + 工具清单 + 技术选型 + Trade-off 分析 |
| 产出 | 本笔记(设计文档)+ docs/FINANCE_AGENT_PROJECT.md(portfolio 级架构 paper) |
写在前面:本 Capstone 不是从零开始,而是把过去 56 天每天产出的"零件"组装成一台可运转的机器:
- Day 135-148 的 RAG(hybrid retrieval / rerank / multi-vector)
- Day 149-162 的 Agent(ReAct / MCP / LangGraph / Memory)
- Day 163-176 的 LLMOps(vLLM / cost / eval / observability / safety)
- Phase 2 的金融数据系统(财报库/链上数据/新闻流)
一、产品定位与目标用户
1.1 一句话定位
「为 buyside 研究员与独立投资人服务的、能跨 TradFi 与 Crypto 的、带主动调研能力的 AI 研究助理。」
英文版本:
"An AI research copilot that bridges TradFi and Crypto, with proactive investigation capabilities, built for buyside researchers and independent investors."
1.2 目标用户画像
| 用户群体 | 痛点 | 我们提供 |
|---|---|---|
| Buyside 研究员(小型对冲/家办) | Bloomberg Terminal $24K/yr 太贵,AlphaSense 不覆盖 crypto,链上数据要单独查 Etherscan/Dune,财报抽取靠人手 | 一个统一界面,跨 TradFi 与 Crypto,按 query 计费 |
| 独立投资人(Active Twitter trader / Substack writer) | 无机构资源,手动跨平台拼数据,做不出深度研究报告 | "雇" 一个 AI 助理 24/7 帮做 macro / single-name / onchain 研究 |
| 小型 FOF / 资产配置者 | 需要看 RWA / DeFi 与传统资产配置组合,但缺跨资产数据视图 | 跨资产 portfolio 复盘 + 风险预警 |
| 合规官(CCO) | 需要快速判断某个 crypto 标的是否合规 / 制裁 | Compliance agent + OFAC SDN 列表 + 链上溯源 |
1.3 与现有产品对比
| 产品 | 核心优势 | 短板 | 价格 |
|---|---|---|---|
| Bloomberg Terminal AI(BloombergGPT-like) | 数据全(500+ 数据源)、机构信誉、TradFi 标准 | crypto/onchain 缺失、$24K/年、不可定制 | $24,000/yr |
| AlphaSense | 财报/电话会议转录搜索强、AI summarization 成熟 | 无 crypto、无主动 agent 行为 | $12,000+/yr |
| FactSet AI | 投行研报库、estimates 数据丰富 | crypto 缺失、UI 老旧 | $15,000+/yr |
| Perplexity Finance | 价格便宜、UI 好、网络搜索强 | 不专业、hallucination 高、无 onchain、无深度计算 | $20/月 |
| 本项目(Finance Research Agent v1) | crypto+TradFi 跨资产 / 内置 onchain agent / multi-agent 主动调研 / 按 query 计费 | TradFi 数据深度暂不及 Bloomberg、品牌弱 | $0.05~0.20/query 起 |
差异化:
Bloomberg AlphaSense Perplexity OURS
TradFi深度 ★★★★★ ★★★★ ★★ ★★★
Crypto/Onchain ★ ★ ★★ ★★★★
主动Agent ★★ ★★ ★ ★★★★★
跨资产桥接 ★★ ★ ★ ★★★★
价格友好 ★ ★★ ★★★★★ ★★★★
二、PRD(产品需求文档)
2.1 用户故事(User Stories)
格式:As a [角色], I want [行为], so that [价值]
Story 1:宏观研究(Macro Research)
- As a buyside macro 研究员
- I want 输入"美联储 2026 年 11 月议息会议后 3 个月,2Y/10Y 期限利差与 BTC 走势的相关性",agent 自动拉 FRED + Coingecko 数据并给出结论
- So that 我不用花 2 小时在 Bloomberg Terminal + Excel 里手动拼图
验收标准:
- 5s 内首字节响应
- 给出相关系数 + 时间序列图 + 文字解读
- 引用数据源 URL
Story 2:单标的深度研究(Single-name Deep Dive)
- As a 独立投资人
- I want 输入"分析 NVDA 最近三个季度的 GenAI 业务质地变化,对比 AMD 同口径"
- So that 我能在 30 分钟内做完原本需要半天的研究
验收标准:
- 抽取 10-Q/10-K 中 GenAI 相关披露
- 同口径对比(YoY revenue、segment margin)
- 给出 PE / EV/EBITDA 对比表
Story 3:Portfolio 复盘(Portfolio Review)
- As a FOF 资产配置者
- I want 上传我的 portfolio CSV(含 SPX、QQQ、BTC、ETH、BUIDL),agent 给出过去 30 天归因分析
- So that 我的月度 review 报告自动化 80%
验收标准:
- 计算各 asset class 的 contribution to return
- 风险归因(vol contribution)
- 自然语言总结 + 图表
Story 4:快讯监控(News Monitor)
- As a crypto 研究员
- I want 设置一个长期 watch:"任何关于 BlackRock BUIDL / Ondo USDY 的新闻或链上活动"
- So that 当有关键事件发生时,我 5 分钟内收到结构化推送
验收标准:
- 后台定时 polling(5 分钟一次)
- 新闻+链上转账双源去重
- Webhook / Email / Telegram 推送
- 每条事件附 4 句结构化总结:what / who / impact / source
Story 5:合规审查(Compliance Check)
- As a 小型基金合规官
- I want 输入一个钱包地址或代币合约,agent 给出制裁/合规风险报告
- So that 我在 5 分钟内完成一次 due diligence 而不是 5 小时
验收标准:
- OFAC SDN 列表匹配
- 链上溯源到 mixer / sanctioned address
- 输出 risk score 0-100 + 详细推理链
Story 6:跨资产对比(Cross-asset Compare)
- As a macro PM
- I want "对比 SPX、IEF、GLD、BTC、BUIDL 这 5 个标的过去 1 年的 Sharpe / max drawdown / correlation matrix"
- So that 我能快速建立资产配置 baseline
Story 7:财报会议解读(Earnings Call)
- As an equity 研究员
- I want 输入"AAPL FY26Q1 earnings call",agent 给出关键 Q&A 摘要 + 管理层 tone 变化
- So that 我能错过 live call 但不错过 alpha
2.2 核心功能模块
| 模块 | 功能描述 | 主导 Agent | 依赖工具 |
|---|---|---|---|
| F1. 财报解析 | 从 10-K/10-Q/8-K 抽取数字指标,结构化为 JSON | Equity Agent | financial_data.py / RAG |
| F2. 链上数据查询 | 持币地址、转账记录、合约状态、TVL、链上活动 | Crypto Agent | onchain.py(Etherscan/Dune) |
| F3. 新闻监控 | 实时新闻 + 历史新闻搜索 + sentiment | Macro/Crypto Agent | news.py(Tavily/NewsAPI) |
| F4. 对比分析 | 多标的同口径对比、相关性矩阵、归因 | Coordinator | calc.py + viz.py |
| F5. 风险预警 | OFAC、制裁、mixer、合约漏洞、流动性枯竭 | Compliance Agent | compliance toolkit |
| F6. Portfolio 归因 | 给定 portfolio,做 P&L attribution | Coordinator | calc.py(Brinson/Fama-French) |
| F7. 长期 Watch | 定时 polling 任务 + alert 推送 | Background worker | cron + notification |
2.3 非功能需求(NFR)
| 维度 | 目标 | 测量方法 |
|---|---|---|
| Latency(首字节 TTFT) | <3s p95 | streaming 起手时间 |
| Latency(端到端) | <30s p95(简单 query),<120s p95(复杂多步 query) | trace 总耗时 |
| Cost | <$0.10/query 中位、<$0.50/query p95 | Anthropic billing |
| Hallucination 率 | <5%(基于 100 条 golden test) | LLM judge + 人工抽查 |
| Tool 调用成功率 | >95% | observability dashboard |
| 可用性 | 99.5% SLA | uptime monitoring |
| 数据新鲜度 | TradFi 价格 <15min 延迟,链上数据 <5min | freshness probe |
| 并发 | 100 concurrent users | load test |
| 合规 | 不输出投资建议;FINRA 2210 disclaimer 自动添加 | guardrails |
| PII 处理 | 不持久化 PII;email 等做 hash | Presidio scan |
三、系统架构设计
3.1 总体架构图
┌──────────────────────────────────────────────────────────────────────────┐
│ Layer 0: Client │
│ Web UI (Next.js) │ Telegram Bot │ CLI │ REST API │ Webhook │
└──────────────────────────────────┬───────────────────────────────────────┘
│ HTTPS / SSE streaming
┌──────────────────────────────────┴───────────────────────────────────────┐
│ Layer 1: API Gateway │
│ Kong / Envoy │ JWT auth │ Rate limit │ Cost meter │ WAF │
└──────────────────────────────────┬───────────────────────────────────────┘
│
┌──────────────────────────────────┴───────────────────────────────────────┐
│ Layer 2: Guardrails (Input) │
│ Prompt-injection scan │ PII redaction │ Topic check │ RAG ACL │
└──────────────────────────────────┬───────────────────────────────────────┘
│
┌──────────────────────────────────┴───────────────────────────────────────┐
│ Layer 3: Orchestrator (LangGraph) │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Coordinator Agent │ │
│ │ (router + planner + final synthesizer; Opus 4.7) │ │
│ └──────┬──────────────┬──────────────┬─────────┬─────────┘ │
│ │ │ │ │ │
│ ┌──────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐ ┌─▼──────────┐ │
│ │ Macro Agt │ │ Equity │ │ Crypto │ │ Compliance │ │
│ │ (Sonnet) │ │ Agt(Sonnet)│ │ Agt(Sonnet)│ │ Agt(Opus) │ │
│ └──────┬─────┘ └─────┬─────┘ └─────┬─────┘ └─────┬──────┘ │
│ └──────────────┴──────────────┴────────────┘ │
│ │ │
│ Shared State (TypedDict) │
└──────────────────────────────┬───────────────────────────────────────────┘
│ tool calls
┌──────────────────────────────┴───────────────────────────────────────────┐
│ Layer 4: Tools (MCP Servers) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐│
│ │ Financial │ │ Onchain │ │ News │ │ Calc & Viz ││
│ │ Data │ │ Data │ │ Stream │ │ ││
│ │ - CapIQ │ │ - Etherscan │ │ - Tavily │ │ - finance ││
│ │ - FRED │ │ - Dune │ │ - NewsAPI │ │ - matplotlib ││
│ │ - Yahoo │ │ - Coingecko │ │ - SeekingAlpha│ │ ││
│ │ - SEC EDGAR │ │ - DeFiLlama │ │ │ │ ││
│ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘│
└──────────────────────────────┬───────────────────────────────────────────┘
│
┌──────────────────────────────┴───────────────────────────────────────────┐
│ Layer 5: RAG & Memory │
│ ┌────────────────┐ ┌────────────────┐ ┌──────────────────────────┐ │
│ │ Vector DB │ │ BM25 Index │ │ Memory │ │
│ │ Qdrant │ │ Elasticsearch │ │ - Mem0 (long-term) │ │
│ │ Voyage finance-2│ │ │ │ - Chroma (semantic) │ │
│ │ + Cohere rerank│ │ │ │ - Redis (session) │ │
│ └────────────────┘ └────────────────┘ └──────────────────────────┘ │
└──────────────────────────────┬───────────────────────────────────────────┘
│
┌──────────────────────────────┴───────────────────────────────────────────┐
│ Layer 6: Data Infrastructure │
│ Doc Store (S3) │ Time-series DB (TimescaleDB) │ Graph DB (Neo4j) │
│ Document Lake: 10-K, 10-Q, transcripts, research notes, whitepapers │
└──────────────────────────────┬───────────────────────────────────────────┘
│
┌──────────────────────────────┴───────────────────────────────────────────┐
│ Layer 7: Eval & Observability │
│ Langfuse (traces) │ ClickHouse (logs) │ Prometheus │ Grafana │
│ Eval harness: 100 golden cases / 30 red-team cases / weekly CI │
└──────────────────────────────┬───────────────────────────────────────────┘
│
┌──────────────────────────────┴───────────────────────────────────────────┐
│ Layer 8: Safety (Output) │
│ PII scrub │ Compliance disclaimer auto-insert │ Output coherence │
└──────────────────────────────────────────────────────────────────────────┘
3.2 多 Agent 设计
为什么用多 Agent 而不是单 Agent?
详见第六章 "关键设计决策" 中的论证。简言之:专业化 + 上下文压缩 + 并行。
5 个专业 Agent
| Agent | 模型 | 职责 | 关键工具 | 典型 token/调用 |
|---|---|---|---|---|
| Coordinator | Opus 4.7 | 路由分派、子结果汇总、最终回答 | 无(meta) | 5K input / 1.5K output |
| Macro Agent | Sonnet 4.6 | 宏观经济、利率、汇率、央行政策 | FRED、Yahoo、News | 8K / 1.5K |
| Equity Agent | Sonnet 4.6 | 股票研究、财报解析、估值 | CapIQ、SEC EDGAR、Yahoo、RAG | 12K / 2K |
| Crypto Agent | Sonnet 4.6 | 链上数据、DeFi、代币经济 | Etherscan、Dune、Coingecko、DeFiLlama | 10K / 2K |
| Compliance Agent | Opus 4.7 | 制裁、KYC/AML、合规风险 | OFAC SDN、链上溯源、News | 15K / 3K |
Agent 之间的协议
- 基础:LangGraph
StateGraph,所有 agent 共享AgentState(TypedDict) - 路由:Coordinator 根据 query intent 分类(NLU classifier,规则 + LLM 兜底)
- 并行:可独立的子查询并行(asyncio.gather)
- 冲突:如果 agents 给出冲突结论,Coordinator 用 "self-consistency vote" 选择置信度高的
3.3 工具清单(17 个)
| # | 工具 | 调用方 | 数据源 | 缓存策略 | 成本 |
|---|---|---|---|---|---|
| 1 | get_stock_price | Equity | Yahoo Finance | 60s | 免费 |
| 2 | get_financials | Equity | SEC EDGAR | 24h | 免费 |
| 3 | get_estimates | Equity | CapIQ | 24h | $$$$ |
| 4 | parse_filing | Equity | RAG over EDGAR | 永久(按 filing) | $ |
| 5 | compute_pe_ev_ebitda | Equity/Macro | calc.py | 不缓存 | 0 |
| 6 | get_macro_series | Macro | FRED | 60s | 免费 |
| 7 | get_news | Macro/Crypto | Tavily/NewsAPI | 60s | $$ |
| 8 | get_eth_balance | Crypto | Etherscan | 30s | 免费层够 |
| 9 | get_eth_txs | Crypto | Etherscan | 30s | 免费层 |
| 10 | query_dune | Crypto | Dune API | 5min | $$$ |
| 11 | get_token_info | Crypto | Coingecko | 60s | 免费 |
| 12 | get_defi_tvl | Crypto | DeFiLlama | 5min | 免费 |
| 13 | check_ofac_sdn | Compliance | OFAC list(本地) | 24h | 免费 |
| 14 | trace_funds | Compliance | Etherscan + 启发式 | 5min | 免费 |
| 15 | vector_search | All | Qdrant + Voyage finance-2 | 永久(按 hash) | $$ |
| 16 | compute_correlation | All | calc.py | 不缓存 | 0 |
| 17 | render_chart | All | matplotlib | 不缓存 | 0 |
3.4 数据基础设施
| 数据源 | 用途 | 接入方式 | 成本 | SLA |
|---|---|---|---|---|
| S&P Capital IQ | 财务估值数据 | REST API | $1500/月 | 99.9% |
| FRED | 宏观时间序列 | REST API | 免费 | 99% |
| Yahoo Finance | 实时价格 | yfinance lib | 免费 | 95% |
| SEC EDGAR | 财报原文 | https + parse | 免费 | 99% |
| Etherscan | 链上数据 | REST API | $200/月 Pro | 99.9% |
| Dune Analytics | 复杂链上 SQL | REST API | $390/月 Plus | 99% |
| Coingecko Pro | 代币元数据 | REST API | $129/月 | 99.5% |
| DeFiLlama | TVL/协议数据 | REST API | 免费 | 95% |
| Tavily | LLM 友好搜索 | REST API | $0.005/搜索 | 99% |
| OFAC SDN List | 制裁名单 | XML 下载 | 免费 | - |
| Internal Doc Lake | 私有研报、内部备忘 | S3 + Qdrant | 自营 | - |
总月度数据成本估算:约 $2500-3000/月(中等使用量)。
四、技术选型
4.1 LLM 模型组合
| 模型 | 角色 | 价格(每 MTok) | 用例 |
|---|---|---|---|
| Claude Opus 4.7 | Reasoning / Coordinator / Compliance | $15 input / $75 output | 路由决策、复杂多步推理、合规判断 |
| Claude Sonnet 4.6 | Routine(Macro/Equity/Crypto) | $3 / $15 | 工具调用循环、文档抽取 |
| Claude Haiku 4.5 | Cheap routes(FAQ、确认、分类) | $0.80 / $4 | 简单 NLU、cache hit 路径 |
Anthropic prompt caching 应用:
- 系统 prompt + tool schema:90% 折扣(缓存命中)
- 长文档:通过 file API 上传,按 cache token 计费
成本估算(典型 query:500 tokens 输入 + 5 工具调用 + 1500 tokens 输出):
- 不缓存:~$0.08/query
- 缓存命中(90% off cached):~$0.02/query
- 平均:~$0.05/query 中位
4.2 Agent Framework: LangGraph
为什么 LangGraph 而不是 CrewAI / AutoGen / LlamaIndex Agents?
| 框架 | 优势 | 劣势 | 我们的选择 |
|---|---|---|---|
| LangGraph | 显式状态机、cycle 支持、生产级、和 Langfuse 集成最好 | 学习曲线、不如 CrewAI 简单 | ✅ 选 |
| CrewAI | 简单声明式、role-playing 模式好读 | 黑盒、状态管理弱、debug 难 | ❌ |
| AutoGen | Microsoft 出品、conversation pattern 强 | 文档跟不上、prod 案例少 | ❌ |
| LlamaIndex Agents | RAG 强 | agent 部分太薄 | ❌(我们只用 LlamaIndex 做部分 RAG) |
| OpenAI Agents SDK | 简单 | 锁 OpenAI、和 Anthropic 生态弱 | ❌ |
LangGraph 关键能力:
- StateGraph:用 TypedDict 显式定义 state schema
- Conditional edges:基于 state 动态路由
- Cycles:天然支持 ReAct 式循环(plan→act→observe→reflect→...)
- Checkpointer:state 持久化到 PostgreSQL/Redis,支持 resume
- Streaming:原生支持 SSE token 流
4.3 RAG: Hybrid Search
| 组件 | 选择 | 理由 |
|---|---|---|
| Embedding | Voyage finance-2 | 金融领域 fine-tuned,比 OpenAI ada-002 在 FinBench 上高 12% |
| Vector DB | Qdrant | 自部署、support hybrid (vector + payload filter)、性能强 |
| Sparse retrieval | BM25(Elasticsearch) | 数字/股票代码召回率高 |
| Reranker | Cohere rerank-3 | top-100 → top-10 重排,nDCG@10 提升 ~25% |
| Chunking | Semantic + section-aware | 财报按章节切(MD&A/Risk Factors),交易电话会按 Q&A 切 |
检索流程:
query
→ expand (HyDE: LLM 生成假想答案再去检索)
→ BM25 top-50 + Vector top-50
→ dedupe + RRF (Reciprocal Rank Fusion)
→ Cohere rerank → top-10
→ context window assembly
4.4 Memory
| 层 | 工具 | 内容 | TTL |
|---|---|---|---|
| Session | Redis | 当前对话上下文(消息历史、工具调用结果) | 24h |
| Short-term semantic | Chroma | 最近 30 天的高价值对话片段 | 30d |
| Long-term | Mem0 | 用户偏好、研究兴趣、portfolio 持仓 | 永久 |
| Procedural | Postgres | "做某类研究的标准流程"模板 | 永久 |
Mem0 用 LLM 主动从对话中抽取"事实",存入向量库 + 关系图。比朴素 message log 节省 90% token。
4.5 Observability
- Langfuse:trace 可视化、prompt 版本管理、score 评估、A/B 实验
- ClickHouse:原始事件落地,做 ad-hoc 分析
- Prometheus:QPS、latency、error rate、cost per query
- Grafana:dashboard
4.6 Guardrails
- Input 层:NeMo Guardrails(topic check)+ Prompt-Guard-86M(injection 检测)
- Output 层:Anthropic 内置 safety + 自研 compliance scrub(自动加 disclaimer)
- PII:Microsoft Presidio(PII detection + redaction)
五、关键设计决策与 Trade-off
决策 1:单 Agent vs 多 Agent — 选多 Agent
背景:金融研究是跨领域的,一个用户问题可能涉及宏观、个股、链上、合规多个领域。
选项 A:单大 Agent
- 优势:实现简单、上下文连续、不用管 agent 间通信
- 劣势:
- 上下文爆炸:所有工具 schema(100+)都塞进 system prompt → 5K+ token 起步
- 专业性弱:没有 prompt 针对宏观 vs 链上做精细化
- 难以并行:一个 query 串行调用 10 个工具 → 30s+
选项 B:多 Agent(最终选)
- 优势:
- 专业化:每个 agent 有定制 prompt + 工具子集(每个 <30 tools)
- 并行:Macro Agent 和 Crypto Agent 可同时跑
- 可独立 eval:每个子 agent 有自己的 golden test
- 成本可控:路由到 Sonnet/Haiku,只有 Coordinator 用 Opus
- 劣势:
- 实现复杂度高
- Coordinator 是单点
- 需要 schema 同步
结论:选 B。复杂度由 LangGraph 框架承担,且过去 56 天的训练给了我们足够能力。
决策 2:LangGraph vs CrewAI — 选 LangGraph
参考 4.2。核心理由:
- 生产可观测性:LangGraph + Langfuse = 一等公民集成
- 状态机的可调试性:CrewAI 的 role-playing 模式在生产环境难以 debug
- 灵活性:cycle / conditional 边可以在金融场景做"先查事实再决策"的多轮循环
决策 3:RAG vs 长上下文 — 选 Hybrid(默认 RAG,复杂 query 走长上下文)
背景:Claude Opus 4.7 支持 1M context。一个 10-K 文档约 100K tokens,理论可全文塞入。
选项 A:纯 RAG
- 优势:成本低、latency 快
- 劣势:召回不全可能漏关键信息
选项 B:纯长上下文
- 优势:无召回风险、能做全局 reasoning
- 劣势:100K context 输入约 $1.5(Sonnet)单次成本,且 latency 高(first token 5s+)
选项 C:Hybrid(最终选)
- 默认走 RAG(top-10 chunks)
- 当 RAG confidence < threshold(chunk relevance score 低)或 query 涉及全局推理(如"分析整份 10-K 的风险因素"),fallback 到长上下文
- 启用 Anthropic prompt caching:长上下文文档缓存后下次调用 90% 折扣
决策 4:Local LLM vs Cloud LLM — 选全 Cloud
背景:是否自部署 Llama 4 / Qwen 3 / DeepSeek-V4?
选项 A:全 Cloud(Anthropic)
- 优势:模型质量最高、运维零、合规省心(SOC 2 / HIPAA)
- 劣势:vendor lock-in、cost 长期高
选项 B:Hybrid(routine 用 self-host,reasoning 用 Anthropic)
- 优势:long-term 成本下降
- 劣势:维护 GPU 集群(H100 4 卡 ~$30K/月 spot)、调优 vLLM、监控、SLA 自负
选项 C:全 self-host
- 优势:极致成本控制
- 劣势:金融场景质量风险大
结论:v1 选 A。当 MAU > 10K / 月成本 > $30K 时,再做 Hybrid 迁移评估。
决策 5:Tool Schema — 选 MCP(Model Context Protocol)
背景:工具如何描述给 agent?
选项 A:framework-native(LangGraph @tool 装饰器)
- 优势:简单、和框架紧耦合
- 劣势:不能跨 agent 复用、不能跨语言
选项 B:MCP(最终选)
- 优势:
- Anthropic 标准协议
- 工具可独立部署为 MCP server(Python / TypeScript / Go)
- 团队可独立维护(金融数据 team 维护 financial_data MCP server)
- 工具升级不影响 agent 代码
- 劣势:
- 多一层网络(本地 stdio / 远端 HTTP)
- 调试复杂度上升
结论:选 B。把工具看作 microservices。
决策 6:State 持久化 — 选 Postgres + Redis
- Postgres:长期 state(用户偏好、watch list、历史 query)
- Redis:session state(24h TTL)、rate limit、cache
决策 7:合规 disclaimer 自动添加策略
背景:FINRA Rule 2210 要求所有面向 retail 的 communication 包含 disclaimer。
实现:
- Output guardrail 层在每次 final response 前自动追加:
"Disclaimer: This information is for research purposes only and does not constitute investment advice. Past performance is not indicative of future results."
- 当响应包含 buy/sell 等明确建议词时,触发额外 review
- 对 institutional users(API key tier=B),可关闭 disclaimer
决策 8:Eval 频率 — 选每次 PR + 每日 + 每周三层
- 每次 PR:30 条 deterministic test(运行 < 5min)
- 每日:100 条 golden test(运行 < 30min,cost ~$5)
- 每周:30 条 red-team adversarial test + LLM judge(cost ~$15)
六、风险与缓解
| # | 风险 | 概率 | 影响 | 缓解 |
|---|---|---|---|---|
| 1 | Hallucination:编造数字 | 高 | 极高 | 1) 强制每个数字必须有 tool call 来源 2) Output guardrail 校验数字是否在 trace 中出现 3) Eval 100 case 持续监控 |
| 2 | 数据 stale(Bloomberg 还慢一拍) | 中 | 高 | 1) 时间戳显式标注 2) Crypto 数据 5min 刷新 3) 在 UI 显示数据 freshness |
| 3 | Cost 失控(用户 abuse、bug 死循环) | 高 | 高 | 1) 每用户日 cost cap($5/day)2) Per-query token cap(input 50K / output 5K)3) Loop detection(同 tool 连续调用 5+ 次报警) |
| 4 | Prompt injection | 高 | 中 | 1) Input scan(Prompt-Guard-86M)2) Tool 输出 sandboxing(不允许 user content 直接进 system role)3) 关键操作 confirmation |
| 5 | 合规风险(被认为提供投资建议) | 中 | 极高 | 1) 全局 disclaimer 2) 黑名单 phrases ("you should buy / sell") 3) FINRA 律师季度 review prompt |
| 6 | 数据泄漏(用户 portfolio 进 LLM 训练) | 低 | 极高 | 1) Anthropic zero-retention 协议(enterprise)2) PII redaction 3) 自托管 vector DB |
| 7 | API 依赖故障(Etherscan 宕机) | 中 | 中 | 1) Circuit breaker 2) Fallback(Etherscan 挂了 fallback Alchemy)3) Graceful degradation(告诉用户该数据暂不可用) |
| 8 | OFAC list 更新滞后 | 低 | 极高 | 1) 每日定时拉取 OFAC SDN XML 2) Hash 校验 3) Audit log |
七、MVP 范围与迭代路径
Stage 1: MVP(Day 178 完成)
范围:
- ✅ Coordinator + 3 个 agent(Equity / Crypto / Compliance)
- ✅ 8 个核心工具(财报、链上、新闻、计算)
- ✅ RAG over SEC EDGAR(仅 SP500 公司)
- ✅ 基础 guardrails(input scan + disclaimer)
- ✅ CLI + REST API(无 Web UI)
- ✅ 30 条 golden test
- ❌ 无长期 watch / 无 portfolio 归因 / 无可视化
目标 metric:
- 30 条 golden test pass rate > 80%
- 中位 latency < 30s
- 中位 cost < $0.10/query
Stage 2: Beta(v1.1, +30 天)
-
- Macro Agent + 5 个新工具(FRED、Coingecko Pro、Dune)
-
- Long-term watch + Telegram bot
-
- Portfolio attribution
-
- 100 条 golden test 全量
-
- Web UI(Next.js)
-
- Anthropic prompt caching 全面启用
Stage 3: GA(v1.5, +90 天)
-
- 多语言(中文版 prompt 全套)
-
- 多租户 + RBAC
-
- Self-host fallback(DeepSeek-V4 routine 路径)
-
- LoRA fine-tune 财报抽取专用模型
-
- SOC 2 Type 1
八、Repository 结构(MVP)
finance_agent/
├── pyproject.toml
├── config.yaml
├── .env.example
├── README.md
├── docker-compose.yml
├── src/
│ ├── __init__.py
│ ├── orchestrator.py # LangGraph state machine
│ ├── settings.py
│ ├── agents/
│ │ ├── coordinator.py
│ │ ├── macro.py
│ │ ├── equity.py
│ │ ├── crypto.py
│ │ └── compliance.py
│ ├── tools/
│ │ ├── financial_data.py
│ │ ├── onchain.py
│ │ ├── news.py
│ │ ├── calc.py
│ │ └── viz.py
│ ├── rag/
│ │ ├── embedder.py
│ │ ├── retriever.py
│ │ └── reranker.py
│ ├── memory/
│ │ ├── session.py
│ │ └── longterm.py
│ ├── guardrails/
│ │ └── safety.py
│ ├── eval/
│ │ ├── golden.py
│ │ └── runner.py
│ ├── observability/
│ │ └── langfuse_setup.py
│ └── api/
│ ├── server.py
│ └── cli.py
├── prompts/
│ ├── coordinator.md
│ ├── equity.md
│ ├── crypto.md
│ ├── compliance.md
│ └── macro.md
└── tests/
├── test_orchestrator.py
├── test_tools.py
└── golden/
└── cases.jsonl
九、面试题(围绕本设计)
Q1:为什么用 LangGraph 而不是直接写 if/else 调度?
答:LangGraph 提供 (1) 显式状态 schema,便于演化;(2) 内置 checkpointer 支持中断恢复;(3) 与 Langfuse 一等集成;(4) 原生支持 cycle,金融场景常需"查事实→反思→再查"。手写 if/else 在 3 个 agent 后会失控,而且 trace 不规范。
Q2:Coordinator 是单点吗?怎么做高可用?
答:Coordinator 是逻辑上单点,但物理上是无状态的。state 持久化在 Postgres,多实例 Coordinator 通过 Redis 锁竞争 task。LangGraph 的 checkpointer 让 task resumption 几乎免费。
Q3:怎么防止 agent 进入死循环?
答:三层防御:(1) max_iterations=15 硬上限;(2) 同 tool 连续调用 5+ 次触发报警;(3) Cost cap(per query input 50K / output 5K tokens)。死循环命中任一即终止 + 返回 partial result。
Q4:RAG 召回不到关键信息怎么办?
答:Hybrid retrieval(BM25 + Vector + RRF + Rerank)已经把 nDCG@10 拉到 0.85+。再失败的话有两层兜底:(1) HyDE query expansion 重检索;(2) confidence < 0.5 时 fallback 到长上下文(Anthropic prompt caching 摊薄成本)。
Q5:金融领域 hallucination 危害极大,怎么保证?
答:四层防御:
- 结构化输出:所有数字必须 cite tool call output(trace 校验)
- LLM judge:每次 final response 用 Opus 做 self-check("该 response 中数字是否都能在 trace 中找到来源?")
- 每日 100 case golden test,hallucination rate 阈值 5%,超阈值阻止部署
- disclaimer + 用户教育:"this is research, not advice"
十、明日预告(Day 178)
明天进入实现,把今天的设计落地:
- LangGraph StateGraph 完整代码
- 5 个 agent 的实现
- 17 个工具的可运行版本
- RAG hybrid retrieval 代码
- 30 条 golden test
- 一个端到端 demo("分析 BlackRock BUIDL 最近一周的链上活动并对比传统货币基金")
代码量预计 1500+ 行 Python。
速查表
关键决策一览
| 维度 | 选择 | 一句话理由 |
|---|---|---|
| Agent 拓扑 | 多 Agent | 专业化 + 并行 + 可独立 eval |
| Framework | LangGraph | 状态机 + Langfuse 集成 |
| LLM | Opus 4.7 + Sonnet 4.6 + Haiku 4.5 | 按场景 routing |
| RAG | Hybrid (BM25+Voyage+Rerank) | nDCG@10 0.85+ |
| Tool 协议 | MCP | 解耦 + 跨语言 |
| Memory | Mem0 + Chroma + Redis | 三层 |
| Observability | Langfuse + ClickHouse + Grafana | 一等公民 |
| Eval | 三层(PR / 日 / 周) | hallucination < 5% |
| Hosting | Cloud(Anthropic) | v1 不自建 GPU |
关键数字
- Latency 目标:TTFT < 3s p95、E2E < 30s p95
- Cost 目标:< $0.10/query 中位
- Hallucination:< 5%
- 数据成本:~$2500/月
- LLM 成本:约 $0.05/query 平均(含 caching)
下一站 → Day 178:实现与代码