用 LLM 处理 2020-2023 Hacker News 帖子,展现科技社区舆论的长期趋势和热点演变。
简而言之:我们分析了 2020 年 1 月至 2023 年 6 月期间 Hacker News 上所有评论数超过 5 条的帖子。我们利用 Llama3 70B 大语言模型,同时分析了帖子及其相关评论,深入了解 Hacker News 社区如何参与不同话题的讨论。你可以在文章底部下载我们生成的数据集。
使用下方工具,可以探索各种话题及其引发的情绪。情绪一栏显示情绪得分的中位数,其中 0 表示最负面的情绪,9 表示最正面的情绪。点击列标题,可以发现引发强烈正面或负面反应的话题,也可以找出那些往往会产生两极化评论的争议性话题。
如果你关注 Hacker News 已有一段时间,很可能已经凭直觉知道社区喜欢哪些话题,以及喜欢讨厌哪些话题。如果你用 Rust 将 Factorio 移植到 ZX Spectrum 上运行,扑面而来的将是无尽的喜爱和 karma。反过来,如果你没有进行一轮融资,而是把创业公司卖给一家私募股权公司,让他们在代码库中加入遥测功能来支持定向广告,那你最好先穿上一套石棉防护服。
但这终究只是一种模糊的直觉!这个社区非常信奉理性和数据科学——虽然“数据科学”这个说法本身也颇具争议——如果能用严谨的数据分析来支撑我们的猜测,结论自然会更有说服力。
此外,这也给了我们一个体验大语言模型的理由。撇开围绕 AI 的各种炒作不谈,大语言模型在这类实际任务中的效果好得令人震惊。恰好,我们还是开源工具 Metaflow 的开发者。这款工具使用 Python 编写,让探索此类项目既有趣又能学到东西。
在上方的文本框中输入这些加粗短语,看看我们是否针对恰当的情绪反应进行了优化。
正如下文实现部分所述,我们下载了大约 10 万个发布在 Hacker News 上的页面,以了解哪些内容能引起社区共鸣。我们重点关注获得至少 20 个赞和 5 条评论的帖子,并让大语言模型为每个页面生成 10 个最能描述其内容的短语。
以下是从这 10 万个页面中汇总出的前 20 个话题,以及涉及每个话题的帖子数量:
排名靠前的话题几乎毫不令人意外。不过,这个社区以多元化的知识兴趣而闻名。前 20 个话题仅占所有帖子所涉及话题的 10%。你可以使用上方工具亲自查看全部 14,000 个至少与 5 篇帖子相关的话题。
热门话题是否随时间发生了变化?当然。以下是排名前 10 的趋势话题:
尽管数据集只覆盖到 2023 年 6 月,我们仍然能看到 AI、自然语言处理及相关话题如海啸般涌来。遗憾的是,裁员也从 2022 年年中开始成为热门话题。AI 相关文章的增长,很可能也解释了“技术”话题的增长。
2020 至 2022 年间,一个压倒性的宏观趋势是与 COVID 疫情有关的一切。幸运的是,它如今已不再是紧迫问题。颇有意思的是,2021 年 8 月是一个动荡的月份,尤其是 Apple 提议的 CSAM 扫描功能,在隐私和 Apple 相关帖子中引发了轩然大波。
如果你想来一场回忆之旅,可以看看左侧那些自 2022 年 1 月以来一次都没有再出现过的昔日话题:
相应地,右侧的话题在 2022 年 1 月之前并不存在。无须经济学博士学位,也能理解 Wallstreetbets 是如何被生活成本危机、招聘冻结和银行倒闭所取代的。
需要特别强调的是,分享或点赞一篇帖子并不代表认同——很多时候恰恰相反。因此,要真正理解一个社区的动态,我们需要分析人们如何回应帖子,而这些反应会体现在他们的评论中。
为此,我们重建了数据集中各篇帖子对应的评论线程,并要求大语言模型将讨论情绪划分为 0 到 9 分:0 表示一场彻底失控的骂战,9 表示完美的和谐与积极氛围。
我们尽职尽责的大语言模型承担起虚拟社区版主的工作,在大约 9 个小时内浏览了 10 万个评论线程,阅读了 2.3 亿个单词,涵盖从苦涩、激情、智慧、幽默到爱意的完整情绪光谱。
以下是大语言模型给出的情绪分布:
首先,大语言模型显然完全搞不清楚中性讨论是什么样子——结果中一次 5 分都没有。又或者,这是大语言模型的一句刻薄吐槽,暗示人类根本无法进行不带情绪、毫无偏见的讨论。
其次,情绪明显偏向正面,这与我们对该网站的个人体验一致。对积极和乐观氛围的偏爱,是我们每天打开 Hacker News 的一个重要原因。其他地方的恶意已经够多了。
还值得注意的是,机器给出的一些少数 1 分结果似乎并不靠谱。例如,BentoML 的这篇帖子得到了 1 分,尽管其中的情绪看起来大体上是积极且支持性的。所有关于大语言模型的常见注意事项在这里同样适用。
现在,我们已经掌握了话题和情绪得分,终于可以科学地回答这个社区喜欢什么、又喜欢讨厌什么:
极客、书呆子和黑客应该会在这里感到宾至如归!有趣的是,虽然这个社区往往富有远见、着眼未来——至少在技术问题上如此——但它显然也对技术怀旧情有独钟。现代世界固然令人惊叹,但我们仍深深怀念 ZX Spectrum、Z80 汇编和 8086。好在至少还能从 PICO-8 中找到一些慰藉。
在容易引发愤怒的话题一侧,大多数话题都无须解释。不过值得澄清的是,Hacker News 并不讨厌国际学生,只是与他们相关的帖子往往充斥着负面情绪,这反映了社区对留学生所面临困境的同情。
颇为滑稽的是,Hacker News 并不是一个汽车爱好者社区。每当我们谈论汽车时,通常都是因为汽车出了什么问题。若想获得更多类似洞见,可以使用页面顶部的工具,详细探索 HN 丰富多样的话题版图。
除了那些单峰分布、只会引发喜爱或厌恶的话题之外,还有一些话题呈现双峰分布:有关某个话题的帖子有时会获得极其正面的回应,有时却会引发骂战。例如:
GNOME——KDE 与 GNOME 之争已经持续了 25 年。
Google——互联网中的主导力量,既有好的一面,也有坏的一面。
政府监管——做也挨骂,不做也挨骂。
风险投资——硅谷的命脉,也是无穷八卦的源泉。
在上方工具中按“争议性”一列排序,可以查看更多内容。要在争议性得分中名列前茅,一个话题必须同等程度地与负面和正面帖子相关联,同时不能有太多中性帖子。
请出 Betteridge 定律。
我们可以绘制一段时间内的平均情绪变化,数据来自每日评论线程中所表达的情绪:
数据证明,2021 年 8 月的情况糟透了——也可能只是因为上图中特别标出的 Apple 风波。总体来看,平均情绪存在一个清晰但幅度不大的下降趋势。
要理解为什么会出现这种情况,还需要进行更深入的分析。暂且不考虑“生活就是越来越糟”这一显而易见的假设——它未必是真的——另一个假设可能是“永恒九月”的某种变体。要在不断壮大的社区中维持积极氛围,需要持续不断、有意识地付出努力。感谢 HN 版主多年来让这个社区始终保持繁荣与积极!
这篇文章本身的存在,就是我们有理由对未来感到兴奋和乐观的原因。虽然自然语言处理和情绪分析已经存在了几十年,但大语言模型所提供的质量、通用性和易用性是绝对前所未有的。
面对本文这样杂乱的数据集,要达到这里的话题识别和情绪评分质量,仅仅几年前还需要博士论文级别的工作量,而且结果很可能更差。相比之下,我们在大约 7 个小时内就开发出了本文所需的全部代码。十年前,即便只使用一个规模适中的模型,处理 3.5 亿个 token 也需要一台超级计算机;而在我们的案例中,使用随处可得的硬件大约 16 个小时就完成了。
最令人惊叹的是,包括大语言模型在内的所有构建模块都是开源的!下面快速概览一下代码和数据,展示如何在家中复现实验。
以下是我们所做工作的高层概览:
图中的每个白色方框都是一个 Metaflow 流程,对应链接如下:
HNSentimentInit 创建待分析的帖子列表。
HNSentimentCrawl 下载这些帖子。
HNSentimentAnalyzePosts 解析帖子并将其交给大语言模型处理。
HNSentimentCommentData 基于 Google BigQuery 中的 Hacker News 数据集重构评论线程。第一步本来也应该/可以使用这个。下次吧!
HNSentimentAnalyzeComments 通过 LLM 运行评论线程。
数据分析和上面显示的图表是在笔记本中生成的(图片中的灰色框)。
以下是这些工作流的功能:
首先,我们想分析已引起讨论的 Hacker News 帖子所涵盖的话题。使用公开可用的 HN 帖子数据集(感谢 Julien!),我们查询了 2020 年 1 月至 2023 年 6 月期间(此数据集中的最新日期)所有至少获得 20 个赞并有 5 条以上评论的帖子,这产生了大约 100,000 个帖子。以下是完成这项工作的简单 Metaflow 工作流,特别感谢 DuckDB。
由于这 100,000 个帖子大多位于不同的域上,我们可以安全地并行下载它们而不会对服务器进行 DDoS 攻击。使用 100 个并行工作程序,下载这些页面只花了大约 25 分钟(见这里)。
从随机 HTML 页面解析文本内容曾经是件非常麻烦的事,但 BeautifulSoup 使其变得极其简洁。
此时,我们拥有大约 100,000 个文本文档的相对干净数据集,总共包含 500M 多个 token。使用最先进的 LLM(例如 GPT-4o 或 AWS Bedrock 上的 Llama3 70b)处理一次数据集的成本约为 $1,300(使用 ChatGPT 批处理 API),不包括输出 token。除了成本,时间也是一个问题——我们希望尽可能快地处理数据集,以便快速评估结果,如果需要可以循环迭代。因此我们不希望受到 API 速率限制或其他瓶颈的影响。
我们之前发过一篇关于 NVIDIA NIM 微服务的成功经验文章。这些微服务提供一个快速增长的 LLM 和其他生成式 AI 模型库,作为预先打包的镜像,完全优化以充分利用 vLLM、TensorRT-LLM 和 Triton 推理服务器,所以你无需花时间追赶最新的 LLM 推理技巧。
由于我们的 Outerbounds 部署中包含了 NIM,我们只需将 @nim 添加到工作流中,就能访问高吞吐量 LLM 端点,成本仅为运行它的自动扩展 GPU(这里是四个 H100 GPU)的成本。当然,你可以调用你选择的任意 LLM 端点——现在有很多选择。
我们的 prompt 很直白:
Assign 10 tags that best describe the following article.
Reply only the tags in the following format:
1. first tag
2. second tag
N. Nth tag
---
[First 5000 tokens from a web page]
我们使用的 llama3 70b 模型有 8,000 token 的上下文窗口,但我们决定将 token 数量限制在 5,000,以考虑分词器行为的差异,确保不会超过限制。
以这种方式处理约 140M 输入 token 耗时约 9 小时。通过使用五个工作程序并发地请求模型,我们能够将吞吐量提高到约 4,300 输入 token/秒,如下面的 UI 所示,以利用动态批处理和其他优化。
我们没有尝试直接从 Hacker News 下载 100,000 个评论页面,而是利用了 Google BigQuery 中的 Hacker News 数据集。令人烦恼的是,数据库中的评论不直接与其父帖子关联,所以我们必须实现一个小函数来重构评论线程。
我们不能直接用 BigQuery 运行这个函数,但幸运的是我们可以轻松地将数据导出为 Parquet 文件。在 DuckDB 中加载生成的 16M 行并扫描它们轻而易举,这得益于 Metaflow 知道如何快速加载数据。我们只是添加了 @resources(disk=10000, cpu=8, memory=32000) 来在足够大的实例上运行该函数。
有了评论线程后,我们能够用这个 prompt 通过 LLM 运行它们:
In the scale between 0-10 where 0 is the most negative sentiment
and 10 is the most positive sentiment, rank the following discussion.
Reply in this format:
SENTIMENT X
where X is the sentiment rating
---
[First 3000 tokens from a comment thread]
获得这样的简单结构化输出似乎没有问题。我们以这种方式处理了约 230M 输入 token,只花了约 7 小时,因为我们只需要两个输出 token。
你可以使用你最喜欢的工具链复现上述所有步骤。以下是我们使用 Metaflow 的主要原因,也是你可能想考虑它的原因:
轻松保持组织——与随机 Python 脚本或笔记本相比,一个很大的优势是 Metaflow 会自动持久化所有工件、跟踪所有执行并保持一切井然有序。我们依靠 Metaflow 的命名空间来执行大型、昂贵的运行和原型,确保两者不会相互干扰。我们使用 Metaflow 标签来组织独立开发时流之间的数据共享。
轻松云端扩展——爬取需要水平扩展,DuckDB 需要垂直扩展,LLM 需要 GPU 后端。Metaflow 开箱即用地处理了所有情况。
高可用编排器——通过 LLM 运行大型数据集的成本可能达到数千美元。你不希望运行因随机问题而失败。我们依靠 Metaflow 开箱即用支持的高可用 Argo Workflows 编排器来保持运行数小时。
你可以使用开源 Metaflow 完成上述所有操作,但通过在 Outerbounds Platform 上运行流,我们获得了一些额外的好处:用这种方式开发代码(包括笔记本)很有趣,在云工作站上运行 VSCode,扩展到云是轻而易举的,@nim 让我们在不担心成本或速率限制的情况下访问 LLM。
如果这样的功能符合你的兴趣,我们很乐意免费帮你入门。
使用此数据集还可以进行更多分析和可视化。与其花费数千美元调用 OpenAI API,不如下载我们创建的主题和情感:
post-sentiment.json 包含 post_id → sentiment_score 映射
post-topics.json 包含 post_id → [topics] 映射
topics-data.json 包含基于上述 JSON 的清理和连接数据集,为本文顶部的工具提供数据。
你可以在此 HuggingFace 数据集和 Google BigQuery Hacker News 数据集中找到与帖子 ID 相关的元数据。要查看帖子,只需打开 https://news.ycombinator.com/item?id=[post_id]。
例如,研究帖子域和情感及话题之间的关联会很有趣。我们的直觉是某些域产生主要是正面情感,反之亦然。或者,有争议的话题会获得更多赞?
如果你用这些数据创建了有趣的东西,请链接回这篇博文并告诉我们!加入 Metaflow Slack 并在 #ask-metaflow 上留言。
为了支持我们的开源工作,请给 Metaflow 一个 star!🤗