Universal Content Extractor
一个多源提取和新闻聚合引擎——从 PDF 报纸、网站、RSS 和社交媒体中提取报道,然后将其分段、聚类并排序,生成个性化信息流,每一个 LLM 步骤都在本地运行。
01概述
Universal Content Extractor 从各种截然不同的来源(PDF 报纸和杂志、开放网络、RSS/Atom 信息源和社交平台)中摄取公开新闻,并将这些海量信息转化为连贯、去重、跨语言且个性化的信息流。决定性的设计选择在于:每一段文本理解和页面图像识别都在服务器上自托管的 Gemma 模型上运行,因此大规模处理新闻无需支付任何商业 LLM API 费用。
02解决的问题
大规模聚合新闻意味着要同时面临两个难题:从抗拒被提取的格式中获取内容(PDF 报纸是一种排版布局,而不是文章列表;网站则是隐藏在反爬虫防御背后的标记语言),然后跨越语言障碍理解这些内容,避免其变成一面充满重复内容的墙。如果使用商业 LLM 来完成所有这些工作,每篇文章的成本将变得令人望而却步。运行本地模型打破了这一限制——而且由于内容属于公开新闻,其出发点纯粹是出于成本考虑,而非数据隐私。
成果:实现了新闻的大规模处理,且单篇文章的模型处理费用几乎为零。
03我们构建了什么
多源提取
- PDF 报纸和杂志 — 通过“Flash”流水线进行 AI 分段:PyMuPDF 文本提取、流式/增量分段器、单页图像处理、基于跨页的页面处理,以及针对芬兰语、瑞典语和英语的多页文章连载检测。
- 网页抓取 — CSS 选择器,外加用于 JavaScript 渲染页面的 Playwright。
- RSS / Atom 信息源。
- 社交媒体 — X / Twitter、Facebook、Instagram 和 LinkedIn。
反检测
大规模抓取之所以能够存活,全靠那些不起眼的防御机制:随机延迟、用户代理轮换、代理轮换、指数退避,以及在来源实施阻拦时能够干净利落退出的熔断机制。
内容丰富化与信息流
内容一旦录入,就会被丰富化处理:通过余弦相似度进行语义聚类(阈值约为 0.75),跨语言链接以使不同语言中的同一篇报道相互关联,生成 AI 概要,并进行事件分类。接着,个性化信息流会应用多算法排序、去重和用户偏好设置。
本地 LLM
自托管的 Gemma 模型在本地处理所有的文本理解和页面图像识别——包括阅读和理解——这正是使得处理如此大体量内容具有经济可行性的关键所在。
04存储与接口
记录存储在 PostgreSQL 中;嵌入向量存储在 Milvus 向量数据库中,用于语义搜索和聚类。在此基础之上构建了三个接口:一个管理面板、一个 REST API 和一个新闻信息流 UI。
05技术
06亮点
- “Flash” PDF 流水线,能够对报纸排版进行分段,并跨越 FI / SV / EN 拼接多页文章。
- 隐藏在完整反检测层(轮换、退避和熔断机制)背后的 Web、RSS 和社交媒体摄取。
- 语义聚类和跨语言链接,确保同一篇报道不会出现十几个重复版本。
- 具有多算法排序、去重和用户偏好设置的个性化信息流。
- 所有文本理解和页面图像识别均在本地 Gemma 模型上运行——大规模处理时的商业 LLM API 费用为零。
- 使用 PostgreSQL 存储记录,Milvus 用于向量搜索。