跳到主要内容

STORM — 架构与原理

30 秒导读: STORM 是斯坦福 OVAL 实验室的一套 LLM 系统,从零给任意主题写一篇带引用的“类维基百科”长文。它的核心洞察是:写长文最难的不是“写”,而是“问出好问题”——所以它先让 LLM 扮演不同视角的维基编辑,去和“专家”(联网检索)模拟对话,问出又深又广的问题、攒齐资料,再据此生成大纲、分节成文。Co-STORM 进一步把人拉进圆桌讨论,并用一张动态“思维导图”组织信息。

1. 这是什么(零基础也能懂)

一句话定义: STORM(Synthesis of Topic Outlines through Retrieval and Multi-perspective Question Asking)是一个用大模型 + 联网搜索,自动给一个主题写出带引用的维基式长文的系统。

解决什么问题 / 给谁用:

假设你要给一个陌生主题(比如“2024 年某新药的研发进展”)写一篇结构完整、有出处的科普长文。直接让 ChatGPT“写一篇”会得到泛泛而谈、可能编造的内容。STORM 面向的是写作前的调研与初稿场景——它的作者明说:产出不是能直接发表的成品,但有经验的维基编辑发现它在“动笔前”阶段很有用(见 README.md Overview 段)。

它能做什么:

  • 给定一个主题,自动联网检索、攒资料。
  • 自动生成文章大纲。
  • 分节写出带 [1][2] 行内引用的长文。
  • 润色:加一个导语(lead)段、可选去重。
  • Co-STORM 模式:支持人类实时加入“圆桌讨论”,并维护一张共享的思维导图。

用起来什么样: 一段最小的真实调用(来自 examples/storm_examples/run_storm_wiki_gpt.py:89-152):

# 示意,基于真实 example 精简
engine_args = STORMWikiRunnerArguments(output_dir="./results")
runner = STORMWikiRunner(engine_args, lm_configs, rm) # rm 是某个搜索引擎封装
runner.run(
topic="Taylor Swift",
do_research=True, # 多视角模拟对话攒资料
do_generate_outline=True, # 生成大纲
do_generate_article=True, # 分节成文
do_polish_article=True, # 加导语 + 去重
)
runner.post_run() # dump 配置 / LLM 调用历史

跑完后,results/<主题>/ 下会出现 conversation_log.json(模拟对话)、storm_gen_outline.txt(大纲)、storm_gen_article.txt(初稿)、storm_gen_article_polished.txt(成品)、url_to_info.json(引用源)等中间产物。

一句话直觉/类比: 把 STORM 想成一个会自己开“选题会”的记者——它先化身成好几个不同立场的同行(历史角度、技术角度、争议角度……),各自带着问题去采访“联网专家”,把采访记录攒成资料库,再据此列提纲、分章节写稿、最后通读去重。

2. 顶层全景(它大概怎么转)

STORM 仓库其实是两个引擎 + 一套公共底座:

部件干什么在哪
STORM-Wiki 引擎经典 STORM:无人参与,一次性把长文写完knowledge_storm/storm_wiki/
Co-STORM 引擎协同 STORM:人机圆桌讨论 + 思维导图knowledge_storm/collaborative_storm/
抽象接口层定义五大阶段模块、Article/Information 数据类knowledge_storm/interface.py
检索层 rm统一封装 Bing/Serper/Tavily/Vector… 十余种搜索knowledge_storm/rm.py
语言模型层 lm用 litellm 统一各家 LLMknowledge_storm/lm.py
思维导图数据类Co-STORM 的 KnowledgeBase / KnowledgeNodeknowledge_storm/dataclass.py
文本处理工具引用清洗、大纲解析、句子截断等knowledge_storm/utils.py(ArticleTextProcessing)

STORM-Wiki 的主线(高层,先不进代码)。 这是整个项目最值得先看懂的一条线——四个阶段顺序流过,每个阶段读上一阶段的产物:

topic(主题)


┌───────────────────────────┐
│ ① 知识采集 Knowledge Curation │ ← STORM 的真正发动机(见 02 章)
│ 多视角 + 模拟对话 + 检索 │
└───────────────────────────┘
│ conversations(各视角的对话历史)

┌───────────────────────────┐
│ ② 大纲生成 Outline Generation │ 先盲写草稿大纲,再用对话内容改进
└───────────────────────────┘
│ StormArticle(只有大纲)

┌───────────────────────────┐
│ ③ 分节成文 Article Generation │ 每个一级章节并行写,按语义相似度取资料
└───────────────────────────┘
│ draft article(带 [1][2] 引用)

┌───────────────────────────┐
│ ④ 润色 Article Polishing │ 加导语段 + 可选全文去重
└───────────────────────────┘


带引用的长文

这条流水线由 STORMWikiRunner.run 串起来(knowledge_storm/storm_wiki/engine.py:341-441):四个 do_* 开关各自对应一个 run_*_module 方法,且每一步都把产物落盘,任何一步都能从磁盘断点续跑(若上一步产物已存在,用 _load_*_from_local_fs 加载)。

四个阶段对应的抽象接口在 interface.py 里都有定义(KnowledgeCurationModuleOutlineGenerationModuleArticleGenerationModuleArticlePolishingModule),STORM-Wiki 只是它们的一种实例化——这正是 README 强调的“可定制流水线”设计。

3. 怎么读这套文档(阅读地图)

建议顺序由浅入深:

  1. 先读 01-storm-pipeline.md — 把 STORM-Wiki 四阶段流水线整体走一遍,看清数据怎么在阶段间流动、各阶段用哪个 LLM、产物是什么。
  2. 再读 02-knowledge-curation.md — 钻进 STORM 最核心、工程含量最高的“知识采集”:视角生成 + Writer↔Expert 模拟对话 + 检索式回答。这是项目名字里 “Multi-perspective Question Asking” 的实现。
  3. 想了解协同模式读 03-costorm-mindmap.md — Co-STORM 的圆桌讨论协议、轮次管理策略、以及那张动态思维导图(KnowledgeBase)如何 LLM 导航着把信息逐条归位。
  4. 想带走精华读 04-clever-details.md — 引用编号统一、降级匹配、嵌入相似度归位等可借鉴技巧,以及边界、横向对比、完整代码地图。

如果你只想抓住 STORM 的“魂”:读 02 章就够——其余都是围绕“问出好问题”这一核心的工程化。