每日简报(Daily Brief)需求文档
版本 v0.4|2026-09-02|状态:MVP 已实现(2026-09-02:观点单元管线+/daily 双形态+Watchlist+已读+NLQ/MCP,202 项测试通过,浏览器双形态实测通过;实现记录见 docs/daily-brief-pending.md) 需求来源:用户希望"浏览每日新增研报的核心观点 + 关联个股,不阅读大量研报原文,只看感兴趣的内容"。 v0.2:采纳用户澄清——一篇内容(尤其 digest 类)常打包多篇原始研报,浏览粒度必须是"观点单元(小节/原始研报)"。 v0.3:券商归属降为可选增强;实测确认 report_theme / report_stock / summary 均有遗漏且口径不符,观点单元以正文分节解析为主源,提及表降级为交叉引用。 v0.4:四项开放问题全部确认——独立
/daily页;NLQ/MCP 并入 MVP;Watchlist 题材+个股并存且评级事件(首次覆盖/上调)视为兴趣命中;聚合内容按"分组头 + 默认展开"展示。
1. 背景与问题
- 数据侧:
scripts/sync_data.py增量同步每日运转,正式库现有 7,797 篇脱水研报;每日新增 6–12 篇,带来日均约 12 条题材提及、22 条个股提及。 - 用户侧痛点:
- 没有以"日"为中心的观点浏览入口。现有
/timeline是"题材"维度的每日聚合(热力条 + 单日题材明细),回答"今天哪些题材热";但用户要的是"今天的新研报都说了什么观点、指向哪些个股",粒度是观点→个股,方向相反。 - 一篇内容 ≠ 一篇研报。相当比例的内容(尤其 digest 类)是聚合体,一篇打包多篇原始券商研报(实测平均 2.7 篇、最多 11 篇)。若按"一篇内容一个观点"展示,会强行把多个独立观点压成一条,丢失归属与分歧。
- 原文阅读成本高。内容正文 HTML 很长,逐篇打开不现实;用户明确表示"不希望阅读大量的研报内容"。
- 缺少兴趣过滤。新增内容中用户只关心一小部分(自选题材/个股/催化类型),目前无任何"只看我关注的"机制。
2. 用户与场景
- 用户:本人(单用户内部工具,无多角色)。
- 典型场景:每天一次(盘后/晚间),花 3–5 分钟扫一遍当日新增研报的核心观点;对感兴趣的观点下钻看关联个股,必要时才进原文。除网页外,也希望通过 NLQ/MCP 直接问"今天有什么新观点"(已确认双入口,NLQ/MCP 并入 MVP)。
- 隐含要求:静态站(pages.dev)是主要阅读入口之一,新功能必须 Flask 与静态站双形态可用;页面为独立
/daily(已确认)。
3. 核心诉求拆解
| # | 诉求 | 含义 |
|---|---|---|
| N1 | 每日新增 | 以数据日为单位组织内容,只看"今天/某日新增",不与历史混杂 |
| N0 | 观点单元粒度 | 浏览与计数的基本单位是观点单元(≈一篇原始研报/一个主题小节),不是一篇聚合内容;聚合内容需拆开展示,并尽量标注归属(券商/原始标题) |
| N2 | 核心观点 | 每个观点单元浓缩成一句可扫读的观点(≤50 字级别),而非摘要堆砌 |
| N3 | 关联个股 | 观点直接挂出涉及的个股(及题材)chips,可点击进详情页 |
| N4 | 兴趣过滤 | 只浏览感兴趣的内容:关注列表题材与个股并存(已确认);关注标的的评级事件(首次覆盖/评级上调,rating_event)同样视为兴趣命中 |
| N5 | 低阅读负担 | 默认折叠正文,卡片式扫读;点开才看证据/原文 |
4. 现状盘点(数据可行性,2026-09-02 实测)
聚合形态(用户澄清 + 2026-09-02 实测)
- 库中 digest 类 3,438 篇(44%),栏目全是聚合型(脱水研报 / 每日强股 / 直击一线 / 评级慧选 / 每日谈 / 周回顾);live 类 4,359 篇为单篇编辑内容(标题即观点)。
- 有券商引用记录(
report_broker)的内容 2,918 篇,digest 平均一篇引用 2.7 篇原始研报(去重 source_title),最多 11 篇;live 基本不引用。 - ⚠️ 归属断链:个股/题材提及(
report_stock/report_theme)没有"来自哪篇原始研报"的字段——如 0901 脱水研报打包了国盛(钼)/长江(超节点)/国信(生猪)三篇,库知道引用了谁、也知道提了金钼股份/光迅科技,但"金钼股份的推荐出自国盛钼研报"这层关系不存在,只能靠正文推断。 - ✅ 拆分可行性高:digest 正文天然分节——"摘要:"之后按
1、超节点算力:2、钼:3、猪周期:编号小节,每节 ≈ 一篇原始研报,节内自带观点正文 + "关注:个股清单",部分节正文直接写明券商("国盛证券指出…")。小节即观点单元,是理想的卡片粒度。
提及表与 summary 的覆盖实测(2026-09-02 第二轮实测,回答"是否会遗漏":会,且口径不符)
report_stock/report_theme的来源是源表结构化字段(选股宝编辑打的stocks/plates标签,见src/etl.py+src/extractors.py),不是正文全文扫描。因此它们是"编辑认可关联"口径,不是"内容实际涉及"口径。- 近一周 69 篇实测:正文出现的个股名约 75% 不在
report_stock、题材名约 87% 不在report_theme(含顺带提及的口径水分);更确凿的是 digest 小节内明确"关注:xxx、xxx"推荐清单的入库率仅 20%——如 0901 脱水研报节内列了 11 只关注个股,report_stock只录 2 只。 - 结论:这两张表不能作为观点单元关联标的的唯一来源,只能作交叉引用(能对上则链到题材/个股详情页);观点单元的个股/题材清单必须从正文小节内重新解析。
report.summary(覆盖 7795/7797)实测形态为篇级导语/目录:digest 常为"今日内容:1、…2、…"式小节一句话目录,不含小节级观点详情与关注个股清单。可作篇级速览与兜底,粒度不够做主展示。
已有的原料(观点原料在正文,结构化表是交叉引用层)
report_theme/report_stock每行提及自带观点五属性:reason(≤50 字推荐原因)、reason_type(8 类催化:业绩/订单/政策/技术进展/供需价格/产能/事件催化/资金动向)、evidence_quote、is_core、weight——交叉引用层:能与小节对上的提及可借用其 reason/类型,并提供详情页链接;不可作为唯一来源(覆盖率见上节实测)。report.summary覆盖 7,795/7,797(99.97%),篇级导语兜底。report_broker的source_title/analyst_name/cited_date可用于把小节对齐回原始研报——可选增强,用户已确认归属非必须,对不上不阻塞任何功能。- 评级事件(
rating_event)已有独立页/ratings,可作为"个股信号"补充来源。 - NLQ(
src/nlq.py)+ MCP server 已存在,可低成本扩展"查某日观点"意图。 - LLM key 可用(
src/llm_chain.py,ark-code-latest)。
发现的缺口(数据层必修项)
- ⚠️
viewpoint.extract()的 reason 回填未挂入日常同步流程:最近 3 个数据日(08-30/08-31/09-01)的 reason 覆盖为 0,08-28 及以前约 50–100%。原因是该步骤历史上是手动按窗口跑的,src/sync.py编排里没有它。若不修,每日简报的观点字段日常会是空的。
5. 三视角头脑风暴
5.1 产品经理视角(价值 / 契合 / 差异化)
| # | 想法 | 说明 |
|---|---|---|
| P1 | 每日观点流页面 /daily(按观点单元) |
以日为单位,一屏列出当日全部观点单元卡(小节标题 + 观点句 + 催化类型徽章 + 个股/题材 chips + 归属券商),聚合内容拆成多张卡。3 分钟扫完一天。直接命中 N1+N0+N2+N3。 |
| P2 | 兴趣关注(Watchlist,题材+个股并存) | 关注列表题材与个股并存;当日内容按"我关注的在前/其余折叠"组织,或一键"只看关注";关注标的的评级事件(首次覆盖/上调)命中兴趣,在当日页设"关注信号"区。命中 N4。 |
| P3 | 跨篇观点对比(LLM) | 同一题材当日/近日出现多篇原始研报时,LLM 合并生成对比视图 + 标注分歧(如"国盛看涨价、华泰看订单")。注意:digest 正文已做过一次"多合一",本功能价值在跨内容、跨券商的二次对比。 |
| P4 | 增量信号置顶 | 关注标的的"新信号"单独置顶:首次被提及、评级上调、连涨启动——区分"新信息"与"重复出现"。 |
| P5 | 兴趣反馈闭环 | 记录点开过的观点,反哺兴趣权重(点击≈感兴趣),长期让排序越来越准。 |
5.2 产品设计师视角(扫读体验 / 信息层级)
| # | 想法 | 说明 |
|---|---|---|
| D1 | 观点单元卡片流 | 一张卡 = 一个观点单元:小节标题(加粗)+ 观点句 + 类型徽章 + 个股 chips + 归属角标(可选增强,对得上才显示券商名/原始标题);聚合篇显示"本篇含 N 个观点"分组头;默认折叠,点击展开证据与原文锚点链接。 |
| D2 | 三层信息架构 | L1 当日 30 秒总览(观点单元标题流 + 当日统计条)→ L2 单观点展开(含同题材跨篇观点对比入口)→ L3 原文页(锚点定位到小节)。层层下钻,每层都可止步。 |
| D3 | chip 式过滤器 | 顶部快速过滤:仅核心(is_core)/ 催化类型 / 题材 / 券商;过滤状态进 URL 参数(?type=订单&core=1),可收藏可分享。 |
| D4 | 已读/稍后读标记 | 轻量已读状态(localStorage,静态站零后端可用),未读高亮、次日默认只显示未读。 |
| D5 | 空状态防打扰 | 无关注内容时显示"今日无你关注的信号 + 其余 N 条速览折叠入口",而非空列表或全量轰炸。 |
5.3 工程师视角(技术 / 数据 / 平台)
| # | 想法 | 说明 |
|---|---|---|
| E1 | 观点单元管线挂入同步(正文分节为主源) | 并入 src/sync.py 增量编排:① digest 正文分节解析(编号小节 → 观点单元:节标题 + 观点句 + 节内"关注"个股清单 + 节内题材名匹配);② viewpoint.extract(窗口=上次水位日) 的 reason/reason_type 回填,对小节对得上的提及借用其类型标注。顺手修复当前 3 天 reason 断档。不依赖 report_stock 的覆盖(实测仅 20%)。 |
| E2 | 观点单元落库 + 聚合查询 | 新增 report_section 类表(report_id、seq、heading、viewpoint_text、个股清单、题材标签、broker 归属可空);个股清单以节内文本解析 + stock 表名字匹配为准;与 report_theme/report_stock 提及能对上则记关联(详情页链接),对不上不强求;report_broker.source_title 文本对齐补券商归属为可选增强。/daily 页即席按日查询,模式与 /timeline 一致,量大再物化。 |
| E3 | Watchlist 前置过滤 | 关注列表存 localStorage + 可导入导出的 data/my_watchlist.json(题材 + 个股条目);静态站 JS 前端过滤,零后端改动;评级事件命中(首次覆盖/上调)由前端比对当日 rating_event 数据(随 /daily 数据一并下发)。 |
| E4 | NLQ/MCP 意图扩展 | 新增"今天/某日的新增观点(可按题材/个股过滤)"查询意图与 MCP 工具参数,不开网页也能扫一眼。 |
| E5 | LLM 跨篇对比批处理 | 同步后自动对当日同题材的多个观点单元跑 LLM 对比,落 daily_digest 表;静态构建时嵌入;失败降级为并列展示(不合并)。 |
6. 优先级 Top 5(含理由与待验证假设)
新功能权重:核心价值 > 验证速度 > 差异化。
| 优先 | 想法 | 理由 | 待验证假设 |
|---|---|---|---|
| 1 | E1+E2 观点单元管线(正文分节解析,挂入同步) | 一切观点功能的地基:不拆观点单元,聚合内容就会把多研报压成一条;且提及表覆盖仅 20%(实测),必须从正文小节重新解析个股清单。分节规则已实测存在,解析是确定性规则,无 LLM 依赖。 | ① 分节与"关注清单"模式对全部 digest 栏目(每日强股/直击一线/评级慧选等)的覆盖率——"脱水研报"栏目已验证,其余栏目需抽样验证;② 节内个股名匹配的准确率(防止歧义名误配,如 2 字简称);③ 增量模式下幂等且耗时可控(单日 ≤12 篇,秒级预期)。 |
| 2 | P1+D1+D2 每日观点流 /daily(按观点单元) |
直接命中主诉求 N1/N0/N2/N3/N5;建在观点单元表之上是纯读侧改造,Flask+静态站可复用 /timeline 的双形态模式。 |
① 观点卡信息密度(小节标题+观点句+chips)是否足以判断"要不要点开";② live(单篇、标题即观点)与 digest(多小节)两种形态混排是否协调;③ 解析失败/无小节的内容如何兜底(回落 summary/标题单卡)。 |
| 3 | P2+D3+E3 兴趣过滤 Watchlist | "只看感兴趣的"是用户原话;localStorage 方案零后端、静态站可用,MVP 成本极低。已确认题材+个股并存、评级事件命中兴趣。 | 剩余实现细节:关注列表维护入口选"页面上点⭐ + JSON 导入导出兜底"是否顺手(可在实现中调整)。 |
| 4 | D4 已读/未读标记 | "每日浏览"闭环的最后一块:未读高亮让"今天看没看过"一目了然;localStorage 即可。 | 静态站(每日重新构建)下 localStorage 键按数据日隔离是否够用。 |
| 5 | P3+E5 LLM 跨篇对比(降级为二期验证) | 价值重估:digest 正文已做过一次"多合一",LLM 的差异化价值收窄为跨内容、跨券商的同题材对比与分歧标注——仍有意义但不再是 MVP 依赖。 | ① LLM 对比合并的稳定性;② 每日 6–12 篇量级下成本可忽略的假设成立;③ 无 LLM 的降级形态(观点单元并列展示)是否已够用。 |
P4(增量信号置顶)与 P5(兴趣反馈闭环)暂列观察项:依赖 Watchlist 落地后的真实使用频率再决定。
7. 建议分期
- MVP(第一批实现):
- 观点单元管线(E1+E2,正文分节为主源);
- 独立
/daily页(P1/D1/D2):聚合篇按"本篇含 N 个观点"分组头 + 默认展开(已确认); - 过滤 chips(D3:仅核心 / 催化类型 / 题材);
- Watchlist(P2/D5/E3):题材+个股并存;当日命中关注标的的评级事件(首次覆盖/上调)在"关注信号"区展示;
- 已读标记(D4);
- NLQ/MCP 意图扩展(E4,已确认并入):"今天/某日的新增观点",支持题材/个股过滤。
- V1.1:评级事件卡片的增强形态(与观点单元同卡视觉);"关注信号"的增量判断(区分首次提及 vs 重复出现)。
- V2(观察后决策):LLM 跨篇对比与分歧标注(P3/E5);增量信号置顶扩展(P4:首次提及、连涨启动);兴趣反馈闭环(P5)。
8. 验收标准(MVP)
- 同步后无需手动步骤:当日 digest 内容解析出观点单元(覆盖率按栏目抽样报告);小节内明确的"关注"个股清单进入观点单元的比例 ≥80%(人工抽样核对)。
- 观点单元粒度正确:聚合型内容(含多篇原始研报)拆分为多个观点单元展示,不合并、不丢小节;券商归属为可选增强——对得上显示券商/原始标题角标,对不上无角标,均不算缺陷。
/daily为独立页面(顶部导航可及;Flask 与静态站均含,注意静态站子目录base='..'导航规则):默认显示最新数据日的观点单元卡流:每卡含小节标题、观点句、催化类型徽章、个股/题材 chips(可点入详情页)、展开证据与原文锚点链接;聚合篇为"本篇含 N 个观点"分组头 + 默认展开;解析失败的内容回落 summary/标题单卡,不缺席当日列表。- Watchlist:题材与个股条目并存;命中关注标的的观点单元排序靠前(或"只看关注"模式);当日命中关注标的的评级事件(首次覆盖/上调)在"关注信号"区展示并可点入
/ratings。过滤状态体现在 URL。 - 已读标记跨日保留;再次打开默认突出未读。
- NLQ/MCP:问"今天/某日有什么新观点"返回当日观点单元(数量 + 小节标题清单),支持按题材/个股过滤;
/api/nlq与 MCP 工具行为一致。 - 回归测试全过(当前基线 179 项 + 新增用例),浏览器实测 Flask 与静态构建两种形态(含子目录页
base='..'导航坑回归)。
9. 非目标(本期不做)
- 不做研报全文的逐篇 LLM 摘要重写(summary + reason 已够 MVP)。
- 不做推送/定时邮件等出站通知形态。
- 不做自动选股、收益回测等投研衍生功能。
- 不做多用户/账号体系。
10. 已确认决策(2026-09-02,需求定稿)
| 问题 | 决策 |
|---|---|
| 页面归属 | 独立 /daily 新页面(不并入 /timeline) |
| 阅读入口 | 网页 + NLQ/MCP 双入口;NLQ/MCP 意图扩展并入 MVP |
| 兴趣粒度 | 题材 + 个股两者并存;关注标的的首次覆盖 / 评级上调(rating_event)视为兴趣命中,进"关注信号"区 |
| 聚合内容展示 | "本篇含 N 个观点"分组头 + 默认展开(不拆散平铺) |
| 券商归属 | 可选增强,对不上不显示、不阻塞(v0.3 确认) |