项目复盘 · 2019
人工智能研究生产:口径、批处理与交付证据
从年度报告、主管部门数据交付和专题咨询中,还原一条由分类树、双语检索式、专利批处理、统计聚合和版本交付组成的研究生产链,并明确代码与成稿之间尚未闭合的证据。
这组历史工作最有价值的部分,并不是某一版报告中的排名,而是团队逐渐形成了一套“先冻结口径,再批量计算”的研究生产方法。Jira 记录了任务承诺与状态,Confluence 留下分类树、数据矩阵、排期和终稿,GitLab 快照则展示专利 XML 如何被解析、清洗、聚合。不过三类证据并不总能首尾相接:有些指标在工单里写着“计算完成但未入库”,有些源码迟至报告完成后才集中导入,还有一版解析器甚至把入队语句注释掉了。
因此,本文不把分散材料包装成一套已经自动化运行的“报告平台”,而是还原其中可以确认的机制、实际交付,以及尚不能确认的环节。
研究对象不是一张表,而是一组带口径的数据集
年度报告的数据框架把研究对象拆成七类:产业、科研、学术、人才、技术、应用和区域。产业层继续拆成企业数量、投融资金额与频次、融资轮次以及并购;科研层统计发明专利申请与授权;学术层限定 SCI 论文;人才层区分一般人才、招聘需求与高端人才;技术层覆盖机器学习、计算机视觉、自然语言理解、知识图谱、机器人和智能芯片;应用层再看自动驾驶、医疗、金融、教育等方向。
这不是简单的章节目录。数据矩阵为每项指标分别记录国家范围、时间范围和备注。例如,两项主管部门交付的企业统计并不使用相同的国家集合和截止日期;技术层与应用层也只复用企业、融资、专利和论文中的部分指标。换言之,同名图表只有同时满足“地区、时间、对象、事件口径”一致时才能比较。
2018 年报告的专利说明进一步冻结了四项规则:只统计发明专利;以公开日限定约十年的观察窗;用公开编号中的国家或地区代码归属专利;技术范围限定在计算机与信息科学相关的两组 IPC 大类。这个选择会排除部分以机械结构为主的机器人专利,材料也明确指出由此会改变国家间排序。
专利权人处理还存在一处重要的不一致:常规统计把不同法人名称视为不同申请主体,前十名展示却又做了局部合并。这个做法能改善头部机构的可读性,但如果合并表没有版本,头部排名与总体统计便不是完全相同的实体口径。
分类树同时承担“定义”和“查询编译器”的角色
Confluence 中的边界表不是一列关键词,而是一棵允许多父节点的双语分类树。机器学习、视觉、自然语言、知识图谱、机器人、驾驶、语音等是中层节点;文字识别、可视搜索、本体、客服机器人等可以同时挂在两个上级分类下。每个末级节点再配置中文词、英文词、缩写和拼写变体。
报告检索采用了两层约束:先用 IPC 或论文数据库学科类别限定技术域,再在标题、摘要等文本字段中匹配双语词表。材料特别说明,大写的布尔连接词是表达式而不是关键词。例如,语音方向把语音处理、语音识别和麦克风阵列拆开,人脸方向同时覆盖两种常见英文表达;自动驾驶方向保留连字符、分写和行业缩写的变体。
这套设计解决了三件事:
- 分类编码让企业、融资、论文和专利可以复用同一技术树;
- 多父节点保留交叉技术,而不是强迫每个词只属于一类;
- 词表把研究员的概念边界转换成可执行查询。
它也留下一个容易被忽视的计数问题。多父节点适合检索,却不适合直接相加;如果“文字识别”同时计入视觉与自然语言,上层总数必须使用去重后的文档集合,不能把子类柱状图求和。现有附件保存了分类与关键词,却没有保存每次运行的命中样本、误命中率和去重集合,因而无法复算报告中每个数字。
从压缩包到统计表:源码还原出的专利处理管线
一份后期汇总进入 GitLab 的 Java 仓库,保留了最具体的处理过程。README 明确区分申请专利的两个结构版本和授权专利的三个结构版本;代码也确实为不同时期的数据保留多组解析入口,而不是用一套 XPath 强行覆盖所有年份。
可恢复的调用链如下:
下面按现存 Java 解析器、清洗线程和统计入口整理为等价伪代码。源码为多个年代版本分别实现,示例有意合并重复分支,不冒充某一个原文件。
等价伪代码
parser = parser_for(publication_year, document_kind)
for xml_document in read_archive(input_file):
sanitized = remove_sections(
xml_document, ["drawing", "table", "formula", "sequence"]
)
raw = parser.to_map(sanitized)
patent = normalize_parties(raw)
if patent.id is null:
failures.write(input_file, "missing_id")
continue
queue.put(patent)
consumer.take_batch(batch_size)
consumer.write_search_index()
stats.add_unique(patent.family_id, patent.country, patent.year)
stats.add_weight(patent.family_id, external_weight.get(patent.id, fallback))解析器逐行读取压缩包,在每个新 XML 文档开始时重置状态位;遇到图纸、表格、公式、序列和化学结构区块时暂时跳过,并对一个已知乱码文件做专项修复。进入统一结构的字段包括申请与公开信息、发明名称、申请人或受让人、摘要、说明书和权利要求。
清洗线程专门处理历史 XML 的“单对象或数组”差异:受让人既可能直接包含地址簿,也可能拆成机构名、姓名、角色和地址;申请人又可能出现在普通 parties 或美国专用 parties 结构中。代码把这些变体合并为列表,再写入新索引。读取侧使用滚动查询,写入侧按可配置批量大小提交;成功、失败和字段缺失分别落入清单,使中断后的任务可以跳过已经完成的文档。
统计层不是直接数文档。代码能先以专利族号去重,再按国家聚合;也能在“年份 → 国家 → 专利族”的嵌套桶内累计外部导入的网络权重。另一条路径把论文或专利的 UID 与 PageRank 结果对齐,缺失权重使用固定兜底值,然后批量回写。它与 Jira 中“PageRank 已跑完、尚未导入”的描述在技术上相互印证,但没有同一批输入文件、运行日志或提交号,仍不能证明报告最终采用了这次计算。
源码中的失效路径,反而说明为什么需要运行级证据
这份源码不能被当作无条件可靠的生产实现。至少有四个可直接从代码确认的问题:
- 一版授权专利解析线程计算完文档 ID 后,真正的队列写入语句被注释,按该快照运行会得到空的下游队列;
- 生产者数量使用可变整数对象做同步锁,递减后锁对象会变化,并发语义不安全;
- 若受让人、申请人或正文节点缺失,若干分支会在判空前强制转换,异常记录可能来不及写出;
- 测试目录只有模板式单元测试,未见针对多版本 XML、断点续跑或批量失败重试的样例。
更关键的是,仓库只有四次集中导入提交,时间晚于主要报告。代码可以证明团队拥有或整理过这些处理机制,却不能单独证明某张历史图表就是由当前快照生成。若要形成可审计链路,每个图表至少需要绑定:输入快照校验值、分类词表版本、解析器提交、运行参数、失败清单和输出表版本。
行研资料库是另一条独立的轻量管线
一个仅有两次提交的 Python 仓库,展示了行业报告资料如何进入内部资料库。它为多个来源各写一组页面选择器,先抓标题、发布日期、摘要与下载地址,再用链接摘要生成文件名。能直接下载的 PDF 保存原文件;只有网页正文的来源,则通过无头浏览器打印为 PDF。结构化元数据进入关系表,二进制正文进入键值存储,下载状态用于避免重复处理。
这条管线的设计亮点是把“发现资料”和“保存正文”分开,也为原生 PDF 与网页打印准备了不同路径。但快照仍带有典型脚本风险:选择器与页面结构硬绑定;部分分支提前返回,使后续下载代码不可达;连接配置与文件目录写死在源码;网络校验被关闭;日志、样本和程序混在同一仓库。它适合解释资料如何被批量收集,不足以证明年度报告已经具备可重复构建能力。
交付证据比“任务完成”更细一层
证据链中可以确认三个不同层次:
- Jira 中较早的年度报告事项记录了融资数据上传、技术趋势关键词确认和区域数据补充完成;
- Confluence 后续空间保存了排期表、原始数据草稿、整合表、产业篇多个版本、论文与专利表,移交页还保存了一份打印版成稿;
- 面向两个行业组织或主管部门的项目记录了至少三批已交付文件,并在移交页保留技术层、应用层和并购核验材料。
“存在成稿”和“可以重算成稿”仍是两回事。并购核验事项要求先把英文公司名对齐到中文主体,再与上市公司并购库交叉检查;移交附件也确实包含机器汇总、公告关键词与人工匹配表。这说明实体对齐不是一句方法建议,而是实际遇到的瓶颈。最后一次重新交付事项仍停留在待办,现存材料也没有统一的变更清单,因此不能判断重新交付是否采用了修订数据。
建筑专题同样处于部分完成状态。工单把建筑生命周期拆成设计、施工与运维,再为成本管理、质量管理、协同管理等场景构造中英文布尔检索式;评论明确要求先检查返回量和相关性,再按申请公司聚合并补充产品分析。技术定义、数据准备和一项英文专利筛选已完成,趋势分析、章节完善和更完整的专利分析未完成。它证明了“行业流程词 × AI 技术词”的交叉检索方法,却不能证明整章数据已经验收。
复建时应保留四道门,而不是一个完成状态
如果今天重建这套研究生产线,最小可行的数据契约应包含四道独立门槛:
- 边界通过:分类树、布尔词表、国家与时间范围经过评审;
- 数据通过:输入快照冻结,实体归并和排除样本可追踪;
- 计算通过:失败率、去重数、抽样精度和跨版本差异达到阈值;
- 发布通过:图表绑定运行清单,文字结论经过事实核验。
这四道门能准确表达历史材料里反复出现的状态差异:“计算完成”不等于“已经入库”,“附件已上传”不等于“已经核验”,“报告有终稿”也不等于“所有图表可复现”。
证据账本
| 结论 | 证据类型 | 可以确认什么 | 仍缺什么 |
|---|---|---|---|
| 年度报告建立了跨产业、科研、人才和区域的数据框架 | Confluence 文档事实 | 指标、国家、时间和分类维度曾被逐项设计 | 每项指标最终采用的查询快照 |
| 至少存在一份正式排版的 2018 年成稿 | Confluence 附件事实 | 工作不只停留在提纲 | 验收、发行和采用记录 |
| 专利处理考虑了历史 XML 版本、断点和批量写入 | GitLab 代码事实 | 具体字段统一与并发管线可恢复 | 报告运行所用提交与参数 |
| PageRank 可按国家、年份和专利族聚合 | Jira 与代码交叉证据 | 计算目标和聚合实现相互支持 | 入库完成记录和结果校验 |
| 行研 PDF 可由多来源批量采集 | GitLab 代码事实 | 元数据、原文与下载状态的处理方式 | 稳定调度、测试和来源授权记录 |
| 全部报告已由统一平台自动生成 | 无证据 | 只能作为未来复建目标 | 端到端构建清单与发布流水线 |
公开复盘不保留客户名称、内部路径、账号、访问配置、人员身份和原始数据链接。工单状态方面:一个规划报告项目共 12 项,仅专利引证明确完成,两项网络计算停留在“完成计算、未入库”;建筑专题 7 项中 3 项完成;医疗 AI 企业关键词筛选只有一项完成事项;通用行研流程的三项仍处在评估或开放状态。本文据此确认方法、局部实现和部分交付,不把未入库结果、候选企业清单或源码快照扩大解释为全部成果已验证。