项目复盘 · 2018
自动报告:从主题词到可核验图表初稿
通过产品原型、关键词流程、12 类图表模板和 47 条开发测试事项,还原一套自动研究初稿工具的计算边界、异步任务与未完成重构。
产业研究往往从一个宽泛主题开始。研究者先界定概念,再寻找相关公司、融资、专利、人才和论文,最后按年度、地区和细分领域统计。自动报告项目试图把其中可以标准化的部分压缩成一次任务:输入主题,生成关键词集合,匹配多源样本,计算固定图表,再用模板输出一段可编辑说明。
它最接近“带数据依据的研究初稿生成器”,而不是自动得出可靠结论的写作系统。本文用四种标识区分证据:文档事实来自产品、测试和工单;代码事实来自现存仓库;合理推断来自多份材料的共同指向;缺失证据表示无法确认。
下面是依据产品文档与缺陷记录整理的等价伪代码。它展示模板文案为何必须先处理空值、全零和并列,而不能直接把最大值填进“领先”句式。
等价伪代码
task = create_task(topic, keyword_version, data_snapshot)
emit_preview(task, template_placeholders)
samples = match_sources(task.keywords, per_keyword_limit)
table = aggregate(samples, dimensions=["year", "region", "source"])
if table.is_empty:
narrative = "当前口径下未获得可统计样本"
elif table.all_values_are_zero:
narrative = "当前样本未形成非零统计值"
else:
peak = max_with_ties(table)
growth = fastest_valid_growth(table, reject_zero_denominator=true)
narrative = render_facts(peak, growth, unit=table.unit)
assert chart.data_hash == narrative.data_hash
save_report(task, table, chart, narrative, template_version)时间线:从演示增强到内部稳定版
文档事实|2017 年 10 月。 10 月 24 日建立前端重构和产品设计任务,目标是用 Vue 替换旧界面框架,同时实现登录、自动报告和定制图表。次日的产品文档把用户分为三类:需要产业决策材料的公共机构、需要战略与竞争情报的企业,以及为前两者服务的研究人员。需求被抽成“概念与成熟度、人才/企业/资本/地域四维宏观分布、定制建议”三层。
文档事实|2017 年 11 月。 内部版被明确定位为“演示版与正式产品之间”:前后端分离,优先补核心流程,不急于建设完整辅助模块。关键词定制需求包括批量导入、组合表达式和不同数据源使用不同关键词;高级布尔语法因需要词法和语法解析,被明确排除在本版之外。
文档事实|2017 年 12 月。 年终版把性能与结果拆成两个阶段:样图要求约 5 秒内出现,真实图表通过限制关键词和匹配条目控制在 30 分钟以内,样图到真图之间展示进度。Jira 的实际说明更具体:样图约 4 至 10 秒,真实报告常约 10 分钟;中英文关键词总量最多约 250 个,每个关键词的匹配条目也设上限。
文档事实|2018 年 1 月。 47 条事项中有 42 条在本月创建,集中处理图表文字、导出、关键词树、样本分页、公司详情、零值文案、PDF 背景、日期变成时间起点、图谱未定义值和任务历史清理。1 月 25 日规划为 v0.5 基本稳定版,3 月 29 日则规划 v0.6,准备加入 PDF 输出、通用/定制报告分流、更多可视化以及论文与人才数据。
边界。 当前状态为 38 条完成、1 条处理中、8 条待办。版本规划不是发布证明,尤其 v0.6 的大部分功能未在对应源码和验收记录中得到确认。
关键词树决定了统计总体
早期关键词调用链在文档中写得很清楚:
- 输入中文时先翻译为英文;
- 用英文主题取得百科体系的一层目录;
- 为目录词补单复数、重定向等词形;
- 再把英文关键词翻译回中文;
- 用所有关键词匹配中文与英文投融资库中公司自带的标签或类别。
后续版本重新定义了目标:不是无限扩展概念,而是给定任意中英文关键词,找到尽量精确的同义关系和上下位关系,使其能匹配公司主营业务、行业与核心技术标签。
文档事实。 图谱页面计划把中英文分成两棵层级树,每个关键词节点同时显示各数据源匹配量;点击匹配量可以下钻到样本。用户自定义词不进入百科树,而是在二维关键词表中管理。组合查询用于消歧,排除查询用于剔除歧义,不同来源还可以使用不同标记。
合理推断。 这比“自动扩词后直接统计”更可解释,因为用户能看到总体如何形成。但目录关系并不天然等于产业关系,翻译、重定向和词形扩展也可能改变口径。一个主题修改后,关键词、样本、聚合和文案必须使用同一版本,否则页面会同时出现旧图与新样本。
文档事实。 “新增或删除关键词后同步调整采集数据”的事项到项目结束仍为处理中;关键词全量增删改、按来源组合表达式等在年终计划中也有未完成项。这说明可编辑图谱的界面已部分存在,事务式重算没有真正收口。
样图和真图其实是两种不同承诺
样图的作用不是提供结论,而是立刻反馈报告结构;真图才基于匹配样本做统计。一次任务至少需要四类状态:关键词准备、样本匹配、聚合计算、报告生成。进度百分比如果只按时间估算,会在慢数据源或空结果时停住;只有后端保存每阶段已处理数量,进度才是可解释的。
文档事实。 项目完成了真实进度展示,但“已完成进度条可删除”仍为待办,工单指出多次搜索后历史任务会不断堆积。v0.5 又要求:用户关闭未保存报告的标签页时,后台删除其全部中间数据。这显示当时的任务结果很可能以用户会话或报告实例为单位持久化,而不是纯粹即时计算。
边界。 删除未保存数据与后台任务并发时存在竞态:页面关闭后计算仍可能继续写入,或删除动作误伤已被保存的版本。现有材料没有任务状态机、幂等标识和回收策略源码,不能确认这一问题如何处理。
重建时,一个任务至少应拥有“待运行、运行中、部分成功、成功、失败、取消、已回收”状态,并固定关键词版本、数据快照、模板版本和输出标识。样图应明确标记为占位,不能与真实统计共享可下载入口。
12 张模板如何覆盖企业、融资和专利
文档事实。 年终版有 12 张模板图表,构成三组统计骨架:
- 企业:全球年度新增、全球国家或地区排名、国内省市排名、三大经济区比较;
- 融资:全球年度金额、全球国家或地区排名、国内省市排名、三大经济区金额;
- 专利:全球年度新增、主要国家分布、国内年度新增、国内省市分布。
每张图都能切到数据或图谱标签页;数据页计划列出命中关键词和来源,支持分页、导出与公司名称模糊过滤。产品原型还设计了数据源、范围、图表类型、横纵轴、间隔与最小最大值等控件,但 v0.1 文档明确说当期只考虑单条曲线。v0.5 又把数据页配置改为只读,说明团队主动从“自由报表设计器”退回“固定模板可核验”。
文档事实。 自定义图表的功能事项被标记完成,但其上层史诗和模板维度编辑仍为待办。更谨慎的解释是:曾完成新增模板或有限定制路径,没有形成可以任意修改 12 张模板数据源与统计维度的通用设计器。
文案模板从主观趋势退回可计算事实
图表说明页面保存了一次很有价值的编辑决策。最初文案会写“持续增长”“处于高峰期”“第一梯队”等趋势判断;评审后,多处被改成“某年达到峰值、峰值为多少、相邻哪两年增速最快”。
文档事实。 文档直接注明:涉及趋势判读的描述暂不方便实现。团队因此优先选择最大值、排序和同比差值等可由数组直接计算的事实。这一收缩是正确的,因为“先升后降”“进入高峰”需要定义窗口、平滑方式、异常值和统计显著性,不是替换几个变量就能安全生成。
工单随后暴露了模板边界:
- 一组数据全部为零时,系统仍可能声称某对象领先;
- 日期缺失或转换错误会显示为时间起点;
- 城市字段混入异常编码,国内“城市”标签又实际包含省级口径;
- 专利类型、专利名称、专利族与专利号曾被混用;
- 子类和第三层目录数据不完整;
- 导出 PDF 会把当前选中图表的灰色背景一并带入。
这些不是单纯 UI 瑕疵。它们分别对应零值守卫、时间解析、地域层级、字段语义、维度完整性和渲染状态泄漏。生成文字必须和图表共享同一份经过校验的中间统计,而不能各自处理原始数据。
一个可靠模板至少需要:
- 输入字段、单位、时间和地域口径;
- 空值、全零、负数和异常值策略;
- 最小样本量与适用条件;
- 排名并列和同比分母为零的规则;
- 可回溯到原始记录的样本标识;
- 无法支持结论时的中性文案。
公司详情承担了“回到原始对象”的任务
文档事实。 公司详情第一次只加载工商与投融资,专利和其他慢数据通过链接按需请求;首页目标约 2 秒,二级数据与名称模糊匹配目标约 3 秒。这个决策把总体图表与具体公司连接起来,同时避免一次跨多个数据源加载所有明细。
代码事实。 后期保存的公司大表仓确实采用“主对象 + 来源计数 + 按来源分页详情”的三段接口:先查公司列表,再取得公司概况和各来源匹配数,最后在用户展开时访问专利、法律文书或应用等明细。它能证明这种渐进加载架构后来存在,但该仓提交始于 2018 年 9 月,且只保存 8 次提交,不能作为自动报告年终版的直接源码。
缺失证据。 公司大表 README 承认名称重复时可能只取第一条。自动报告中“某公司是否出现在样本”的结果因此也会受实体合并质量影响;没有实体准确率和人工校验记录,就不能把下钻详情视为绝对一致。
原型、实现与缺失源码之间的边界
文档事实。 v0.1 附件给出了四个页面区:报告主页面、数据管理、图谱管理和嵌入图谱。顶部固定搜索与全局过滤,报告区提供图表和快捷操作,数据区锁定配置头部并滚动原始记录,图谱区配置层数、语言和距离阈值。未保存报告关闭后不可再见,已保存报告则从“我的报告”访问,并支持下载、查看数据、查看图谱和删除。
代码事实。 当前相关 Java 仓仍保留旧报告日志名、图表样式、树形组件、静态数据、关键词 DAO、公司查询和权限框架。其依赖是 Spring MVC、Shiro、关系库、MongoDB 与 Elasticsearch;一座巨型初始提交同时引入后台模板和大量第三方前端资源。
但没有找到与 2017 年 Vue 重构、异步报告生成和 12 张模板一一对应的完整仓库。Java 仓时间晚于本轮重构,且主要是公司大表与内部工具快照。本文因此把关键词、模板、进度和缺陷视为文档已验证,把具体后台计算实现留为缺失证据。
已确认交付与未完成部分
可确认交付: 样图和真实图表两阶段流程、进度显示、12 张模板、模板文字、报告导出、关键词中英文展示、样本关键词与来源字段、数据分页,以及公司详情渐进加载。大量具体缺陷被创建并关闭,足以证明内部版本实际接受过场景测试。
未完成或证据不足: Spring Boot 重构;12 张模板任意维度编辑;关键词增删后的完整重算;全量关键词管理;公司详情全来源覆盖;进度历史清理;v0.6 的论文、人才、热力图与通用/定制报告分流。
代码事实。 现存仓库与部署文档曾保存固定服务位置和访问凭据,本文不公开具体值。重建时应轮换所有历史凭据,拆分配置、代码、生成数据和日志,并为每次报告保存模板与数据版本。
可复用经验
自动报告最值得复用的不是“自动写一段话”,而是三项约束:让用户看到关键词范围;让每张图能下钻到样本;当算法无法支持趋势判断时退回可计算事实。它们共同把自动化限制在可核验范围内。
若重建,应先把报告定义成一个可重复的数据产品:主题解析生成不可变关键词版本,样本匹配生成带来源的快照,统计层输出统一中间表,图表与文案只读取中间表,最终报告记录全部版本。研究者对关键词或样本的人工修订应生成新版本,而不是直接覆盖旧结果。
证据边界
自动报告 Jira 有 47 条事项,创建时间从 2017 年 10 月延续到 2018 年 2 月,更新至 2018 年 5 月。Confluence 保存用户与需求分类、关键词流程、内部版计划、年终版清单、测试、依赖、文字模板、v0.1 原型和后续版本规划;附件中的页面说明比单独工单更能证明产品结构。
当前没有完整自动报告前后端源码,也没有任务数据库、聚合算法或发布记录。文章因此确认“内部版本被实现并测试”,但不确认长期运行、外部采用、自由报表设计器或后续高级数据源已经交付。