Research OS — 个人金融研究与决策辅助系统
一句话点题:把两年积累的私域研究记忆,变成可推理、可复盘、可计胜率的决策操作系统。 本文不只介绍产品·更以三个具体工程问题为锚展开:LLM 抽取的原文引用为什么 73% 都找不回原文?为什么单个模型生成的交易判断不能直接用?为什么传统量化回测不适合研究类策略?这三个问题分别催生了 Quote Grounding、六席位委员会、Decision Replay。
终于有个工具能告诉我「现在该做不该做」而不是「请阅读以下 47 篇研报」。可惜还不能帮我止损。
一句话点题:把两年积累的私域研究记忆,变成可推理、可复盘、可计胜率的决策操作系统。
本文不只介绍产品·更以三个具体工程问题为锚展开:LLM 抽取的原文引用为什么 73% 都找不回原文?为什么单个模型生成的交易判断不能直接用?为什么传统量化回测不适合研究类策略?这三个问题分别催生了 Quote Grounding、六席位委员会、Decision Replay。
1. 背景
1.1 个人投资研究的真实问题
每天的输入端:5 个社交平台(Twitter / 微博 / 小红书 / 抖音 / 微信公众号)+ 16 个数据源(行情 / 宏观 / 事件 / 链上 / 情绪)+ N 份 PDF 研报与群聊截图。一周下来一台机器里堆了几百份原文,散落在 Notion、本地 Markdown、相册里。
| 痛点 | 量化 |
|---|---|
| 信息层散落 | 每周新增 ≈ 200 条文本观点 / 50 张研报截图 / 30 段视频 |
| 决策层无法复盘 | 一个月前为什么仓位 30% / 现在为什么 60%?没记录 |
| LLM 直接生成研报不可追溯 | 90% 的"看似合理"输出找不到原始引用 |
| 多模型成本爆炸 | 同时跑 4-5 个模型对话·一天费用极容易过百 |
研究类 SaaS 工具(Bloomberg / Benzinga / Koyfin)解决信息层但不解决"我个人观点的累积",AI 助理(ChatGPT / Claude / Perplexity)解决泛化提问但不解决"基于我两年研究的判断"。两边都不解决"现在该不该做"。
1.2 信息层与决策层之间的断裂
业界 RAG 系统通常止步于"检索 + 生成"。金融研究需要更多:
- 真伪与兑现独立建模 · 一条预测可能是"说过 / 是真的 / 实现了 / 市场按预期反应了"四个不同状态。混在一起就没法做后验校准。
- 私域是核心资产 · 我看了两年的某研究员观点,比 ChatGPT 默认知识更值钱。不能让模型反客为主。
- 决策不只判方向 · 还要判"现在做值不值"——funding cost 多少、波动率状态、等待价值窗口。
- 委员会而非单模型 · 一个模型生成的判断不够稳健·要至少四个不同视角互相校验,分歧本身就是信号。
1.3 目标
一句话:把私域研究记忆变成可推理的决策操作系统,每个判断都附带反证 / 风险 / 失效条件 / 完整证据链。
2. 设计概览
2.1 八条核心原则
V2 升级时确立的设计约束,所有后续工程决策都对照这 8 条评估:
- 私域知识是核心资产,公共数据是校准器,不可反客为主
- 公共数据服务于证据校准与决策复现,不做无边界囤积
- 模型动态激活,不无条件全员出动,成本控制核心是少喂无效信息
- 社交源是精选研究员池,不是噪音流量池
- 真假消息与兑现状态独立建模
- 决策不只判方向,还判"现在做值不值"
- Decision Replay 优先于传统回测
- 所有高确信输出必须附带反证、风险、失效条件与证据链
2.2 四层逻辑架构
四层不是物理目录·而是逻辑分层。记忆层是核心资产、私域驱动;证据层是校准器、公共数据驱动;决策层是动态推理引擎;发现与学习层关闭从决策回归到记忆的反馈循环。
2.3 数据源全景
接入 16 个数据源 + 5 个社交平台。每条都有独立的冷却时长 + Mock 降级 + content_hash 去重:
| 类别 | 数据源 | 拉取方式 | 冷却 |
|---|---|---|---|
| 行情 | Binance 现货 / Futures · Yahoo Finance · CoinGecko | 主动轮询 HTTP | 5 / 3 / 15 分钟 |
| 宏观 | FRED · Alpha Vantage | 主动轮询 | 24h / 24h |
| 事件 | RSS 多源(CoinDesk / Reuters / etc.) | 主动轮询 | 1h |
| 链上情绪 | 待接入 3 路(链上 / 衍生品 / 情绪指数) | — | — |
| 社交媒体 | Twitter / 微博 → RSSHub · 小红书 / 抖音 → MediaCrawler · 微信 → We-MP-RSS | 混合 | 30min |
| 私域 | PDF / 图片 / TXT · GPT-5 Vision 识别 | 事件驱动 | — |
分级分源 + 互为降级:行情 Binance → Yahoo → CoinGecko,新闻 RSS 多源冗余,社媒三个独立中间件。任一源挂掉不会整条断。
2.4 技术栈
| 层 | 技术 | 选型理由 |
|---|---|---|
| 后端 | FastAPI + Python 3.11 + SQLAlchemy | 异步 IO 友好 · OpenAPI 自动生成 · 类型严格 |
| 前端 | React 18 + TypeScript + Vite + TailwindCSS | 社区活跃 · 编译快 · 组件复用率高 |
| 数据库 | SQLite(开发)/ PostgreSQL + pgvector(生产) | 单机零依赖 · 平滑升级到向量检索 |
| 缓存 | Redis(可选 · 降级到内存字典) | Mock 降级让本地开发零依赖 |
| AI 接入 | OpenRouter 统一路由 | 单 Key 路由 10 个模型 · 中转 IP 隔离 · 按量付费 |
| 视觉识别 | GPT-5 Vision + Pillow(长图分块) | 长图自动切片 + 多图自动拼接 |
| pdfplumber + PyMuPDF + Vision 降级链 | 三级降级·扫描件最终走 Vision | |
| 视频转写 | Gemini 2.5 Flash | Google AI Studio 免费层·成本接近零 |
| 社交拉取 | RSSHub + MediaCrawler + We-MP-RSS | 三个独立开源中间件·5 平台覆盖 |
| 部署 | Docker Compose / Uvicorn + Nginx | 开发用 compose · 生产可拆 |
3. 核心模块
3.1 Ingestion Pipeline · 多模态观点抽取
输入端是混乱的:PDF 研报、群聊截图、长图、视频。IngestionWorkflow 把它们统一处理成结构化的 ClaimCard:
| 输入 | 处理链路 | 关键点 |
|---|---|---|
| 文本 PDF | pdfplumber · 提文本 | 失败降级到 PyMuPDF |
| 扫描件 PDF | PyMuPDF · 转图 → Vision | 三级降级链 |
| 长图 | Pillow · 自动分块 → Vision · 拼接 | 单图 max 8K 像素,自动切片 |
| 多图 | Vision 各自识别 → 语义合并 | content_hash 去重 |
| 视频 | Gemini 2.5 Flash · 转写 | Google AI Studio 免费层 |
抽取出的 ClaimCard 结构化字段:作者 · 日期 · 资产标签 · 立场 · full_quote(原文引用)· 置信度。中英文 / 表格 / 截图全支持。
3.2 Quote Grounding · 三级匹配 + Double Check
整个系统中最关键的设计。LLM 抽取出的 full_quote 经常与原文存在差异——改写措辞、跨消息拼接、用 …… 串联——导致无法回溯到原文精确位置。
命中后用原文片段替换 LLM 输出的 quote,保证 verbatim。这一步是后续所有"溯源审计"的地基——没有 grounded quote 就没法做反证、没法做后验校准。
优化历程——四轮迭代把 grounding 率从 27% 推到 89.6%:

| 阶段 | 改动 | Grounded 率 |
|---|---|---|
| 最初(无 grounding) | LLM 输出直接落库 | ~27% |
| + Quote Grounding 模块 | 三级匹配链 | 58.5% |
| + Prompt 正反例引导 | system prompt 加群聊正反例·禁拼接 / 禁省略号 | 72.0% |
| + NFKC + CJK Radical 修复 | 修 PDF OCR 输出的 U+2E80-U+2EFF 错位汉字 | 76.8% |
| + Double Check | 把 NOT_FOUND 重喂给 LLM 二次抽 | 89.6% |
详见 docs/optimization/QUOTE_GROUNDING.md(仓库内部文档)。
3.3 六席位委员会 · 动态激活
研究类决策不能只靠一个模型生成判断——单模型有偏好、有盲区、有训练数据偏差。CommitteeOrchestrator 编排六个席位独立辩论,最后由裁决模型综合。
席位职责:
| 席位 | 角色 | 主选模型 | 关注 |
|---|---|---|---|
| A | 主席(基准) | Claude Opus 4.6 | 综合判断与基准方向 |
| B | 概率推演 | Gemini 3.1 Pro | 多分支概率分布 |
| C | 风控 | GPT-5.4 | 反证、找漏洞、对冲建议 |
| D | 市场结构 | GLM-5 | 庄散博弈、机构行为与叙事背离 |
| E | 真伪审计(可选) | Gemini Flash | 信源可信度、消息真假 |
| F | 执行经济性(可选) | Gemini Flash | funding cost / 波动率 / 等待价值 |
裁决约束:
- conviction > 0.7 才可判 strong consensus
- 四方方向严重分歧 → consensus_level=split · conviction 上限 0.45
- 市场结构分析师发现机构行为与叙事背离 → 必须在裁决中突出警告
- 所有高确信输出必须附带反证、风险、失效条件、证据链
3.4 决策简报与证据链
BriefingWorkflow 编排完整的简报生成:
- MCP 上下文聚合 ·
ResearchMemoryMCP(三路混合召回)+EventFeedMCP+MarketDataMCP+FlowContinuityMCP - 信息融合 ·
FusionSkill把四类数据融合成统一上下文 - 简报生成 ·
BriefingSkill输出结构化BriefingCard:执行摘要 / 支持论点 / 反面论点 / 关键风险 / 策略建议 / 推荐操作 / 失效条件 - 证据链接 · 关联的 Claim / Event / Market 数据写入
BriefingEvidenceLink表,支持任意一句结论反查到原始引用
3.5 决策回放与策略蒸馏
传统量化做"历史回测"——把策略套到过去的 K 线上看赚不赚。但研究系统的策略往往不是规则化的("我觉得 BTC 现在 risk-on"),无法 backtest。
Decision Replay 换一个思路:每次出 briefing 时存一份 DecisionSnapshot(时点证据快照 + 委员会裁决 + 推荐操作),事后用户标注实际结果("涨了 / 跌了 / 横盘"),LLM 回放分析"哪一步看错了 / 哪一席位贡献最大"。胜率统计基于这些标注累积。
StrategyDistillationWorkflow 反向工作:从原始研究资料里蒸馏出可执行的交易策略(策略名称 / 类型 / 核心逻辑 / 适用资产 / 进场条件 / 退出规则 / 风险因素),通过 StrategySourceLink 记录策略与原始来源的蒸馏关系。
3.6 OpenRouter 路由 + 角色化模型
10 个 Skill 角色 × 3 级 fallback,统一通过 OpenRouter 路由:
| 角色 | 主选 | 备选 | 选择理由 |
|---|---|---|---|
| briefing | Claude Sonnet 4.6 | Gemini Flash | 长文输出清晰·稳健 workhorse |
| fusion | Gemini 3.1 Pro | DeepSeek V3.2 | 量化推理强·1M 上下文窗口 |
| extraction | DeepSeek V3.2 | Gemini Flash Lite | 成本极低·中文优秀 |
| committee_a(主席) | Claude Opus 4.6 | Claude Sonnet 4.6 | Arena #1·旗舰推理 |
| committee_b(概率) | Gemini 3.1 Pro | Gemini Flash | 量化分析强 |
| committee_c(风控) | GPT-5.4 | GPT-5.4 Mini | 反证与找漏洞 |
| committee_d(结构) | GLM-5 | DeepSeek V3.2 | BFCL #2·审计与 Schema 校验 |
| strategy | Claude Opus 4.6 | Gemini Pro | 深度推理 |
| speaker | DeepSeek V3.2 | Gemini Flash Lite | 低成本画像 |
| embedding | Qwen3-Embedding-4B | text-embedding-3-small | 嵌入向量化 |
万能 Fallback 是 DeepSeek V3.2,无论是哪个角色,主备都挂时统一兜底——它不受区域限制,可达性最稳。
4. 工程要点
4.1 NFKC + CJK Radical 修复 · Quote Grounding 76.8% 的关键
审查 NOT_FOUND 样本时发现,PDF OCR 输出的汉字使用了 CJK Radical Supplement 字符(U+2E80-U+2EFF),例如 ⽐特币(⽐ 是 U+2F63)而非标准 比特币(比 是 U+6BD4)。这些字符视觉上完全相同,但 Unicode code point 不同,导致精确匹配失败。
仅这一步把 grounding 率从 72% 推到 76.8%。同时把同样的归一化也应用到 LLM 输出的 quote 端,让两端在归一化空间里比对。
4.2 Prompt 自适应优化 · PromptAdapter
不同模型对 prompt 的偏好差异极大:Claude 强调完整填写、Gemini 防止嵌套 wrapper、GPT 严格遵守 system prompt、GLM 中文分析强但需控制输出长度、DeepSeek 需要确保数值范围合法。
PromptAdapter 根据模型型号自动追加适配后缀,并维护一个温度矩阵(按"技能 × 模型家族"二维查表):
| 技能 × 模型 | 温度 | 来源 |
|---|---|---|
| 提取 + DeepSeek | 0.05 | 经验:极低温确保格式 |
| 委员会辩论 + GPT | 0.35 | 经验:反证需适度发散 |
| 裁决 + Claude | 0.15 | 经验:高稳定性 |
| 简报 + Gemini | 0.30 | 官方推荐 |
每个温度都标注来源(官方 / 经验 / 待验),方便审计和后续 A/B 调整。
4.3 4 层社媒去重架构
社媒拉取最大的工程难点不是抓取本身,而是去重——同一条帖子可能从 RSSHub 拉一次、用户手动转发再拉一次、隔天 ETag 失效再拉一次。四层去重逐层兜底:
这一套架构同时覆盖 5 个平台(Twitter / 微博 / 小红书 / 抖音 / 微信公众号),每个平台只需实现"原始数据 → 五元组"的映射函数。
4.4 LLMClient · Mock 降级 + 3 级 Fallback

关键决策:
- 可重试 vs 不可重试 · 4xx 客户端错误立刻停 retry(不浪费 token),5xx / 429 才退避重试
- 三级 fallback · 主选 → 备选 → 万能 fallback(DeepSeek V3.2,可达性最稳)
- Mock 降级 · 全挂时返回结构化 Mock 响应而非抛错,让本地开发零依赖、无 API Key 也能跑
4.5 asyncio 原生调度 · 无 Celery / Redis
研究类系统不需要复杂的 broker,asyncio 内嵌进 FastAPI 进程即可:
| 任务 | 频率 | 功能 |
|---|---|---|
| 市场快照采集 | 15 min | Watchlist + 默认资产的行情快照 |
| A 股基金增强采集 | 14:00–15:00 / 2 min | 聚焦 CSI300 / ZZ500 / CYB / HSI |
| 生命周期检查 | 1 h | 扫描并更新过期 ClaimCard 状态 |
| 自动研究简报 | 6 h | Watchlist 热门资产自动生成 Briefing |
| 社交媒体抓取 | 6 h | 5 平台增量拉取(staleness 触发) |
| 每日雷达扫描 | 12 h | 检测分歧 / 资金异动 / 事件催化 |
所有定时任务通过 asyncio.to_thread 包装同步操作,不阻塞 FastAPI 事件循环。启动时延迟 5 秒执行首次快照,确保服务先就绪。好处:启停简单、无外部依赖、对单用户研究系统足够;代价:单进程崩溃所有任务停摆,未来需要扩多实例时要换 Celery。当前阶段不值得引入额外组件。
5. 现状与展望
5.1 已完成(截至 2026-04-22)
| 模块 | 主要产出 | 状态 |
|---|---|---|
| Ingestion Pipeline | PDF / 图片 / 长图 / 视频全模态接入 · 三级降级 | ✅ |
| Quote Grounding | 三级匹配 + Double Check · 89.6% | ✅ |
| 六席位委员会 | V2 动态激活 + 最终裁决 | ✅ |
| 决策简报 | RAG + 实时市场 · 证据链接表 | ✅ |
| 决策回放 | DecisionSnapshot + 后验校准 + 胜率 | ✅ |
| 策略蒸馏 | StrategyCard + StrategySourceLink | ✅ |
| 16 数据源 | 行情 / 宏观 / 事件 / 链上 / 社媒 | ✅ |
| 5 平台社媒 | RSSHub + MediaCrawler + We-MP-RSS | ✅ |
| OpenRouter 路由 | 10 角色 × 3 级 fallback | ✅ |
| 验证中心 | 13 场景全链路 + AI 评审 | ✅ |
| 全量 pytest | 429 / 429 通过 | ✅ |
| 23 张表 + 25 ORM 模型 | SQLite (dev) / PostgreSQL+pgvector (prod) | ✅ |
5.2 边界与未做
刻意不做的清单和做了的清单一样重要:
- 不做实时交易终端。Bloomberg / Benzinga 是 Push 推流 + SOC 2 / FINRA 合规,研究系统是 15 分钟轮询·不是同一物种
- 不做精确滑点估算。完整执行成本需要订单簿数据,简化为 funding cost / 波动率状态 / 等待价值窗口三维度
- 不做云端账户。私域记忆是核心资产,全程本机·零网络出口(除 LLM API + 数据源)
- 不做 1m / 5m 全量 OHLCV 缓存。BTC 1m 一年 52 万条,个人系统存储不值得·保留 15 分钟快照 + 日度技术状态已足够
- 暂不引入 efinance / AKShare。接口频繁变动 / 文档差 / Breaking change 多,等成熟后再评估
- 席位 7(Actor & Motive)暂不做。深度人物动机分析 ROI 极低,SpeakerProfile V2 + 来源画像已可覆盖大部分需求
5.3 下一步
- Phase 14 · 数据质量 SLI/SLO · 完整性 / 新鲜度 / 错误率三个 SLI + 主动告警
- Phase 15 · Source Health 面板 · 消费现有
source_health_logs· 加 sparkline 可视化 - Phase 16 · Chat RAG 升级 · 引入 Re-ranker + 时效衰减
- Phase 17 · Prompt 温度矩阵全验证 · 把"待验"温度通过 A/B 测试转成"经验"
- Phase 18 · Daily Radar 结构化升级 · 当前 auto_briefing_job 是雏形 · 升级成结构化每日雷达输出
参考资料
- 项目仓库(私有)
- 内部文档 ·
docs/architecture/V2_DESIGN.md· 21 条建议评估、四层架构、3 阶段路线图 - 内部文档 ·
docs/architecture/PIPELINE_ANALYSIS.md· 三阶段链路深度剖析 - 内部文档 ·
docs/optimization/QUOTE_GROUNDING.md· Quote Grounding 四轮优化全历程 - 内部文档 ·
docs/optimization/MODEL_SELECTION.md· 10 模型 / 5 供应商选型与审计 - LangExtract(Google · 2025) · 三级匹配设计参考
- LLMQuoter(arXiv 2501.05554) · 引用溯源研究
- Anthropic Skills 规范 · Skill 角色化设计参考
- OpenRouter 模型路由文档 · 多模型统一路由