数据截至 (上游 commit fb951af7744d)
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 统一各家 LLM | knowledge_storm/lm.py |
| 思维导图数据类 | Co-STORM 的 KnowledgeBase / KnowledgeNode 树 | knowledge_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 里都有定义(KnowledgeCurationModule、OutlineGenerationModule、ArticleGenerationModule、ArticlePolishingModule),STORM-Wiki 只是它们的一种实例化——这正是 README 强调的“可定制流水线”设计。
3. 怎么读这套文档(阅读地图)
建议顺序由浅入深:
- 先读 01-storm-pipeline.md — 把 STORM-Wiki 四阶段流水线整体走一遍,看清数据怎么在阶段间流动、各阶段用哪个 LLM、产物是什么。
- 再读 02-knowledge-curation.md — 钻进 STORM 最核心、工程含量最高的“知识采集”:视角生成 + Writer↔Expert 模拟对话 + 检索式回答。这是项目名字里 “Multi-perspective Question Asking” 的实现。
- 想了解协同模式读 03-costorm-mindmap.md — Co-STORM 的圆桌讨论协议、轮次管理策略、以及那张动态思维导图(
KnowledgeBase)如何 LLM 导航着把信息逐条归位。 - 想带走精华读 04-clever-details.md — 引用编号统一、降级匹配、嵌入相似度归位等可借鉴技巧,以及边界、横向对比、完整代码地图。
如果你只想抓住 STORM 的“魂”:读 02 章就够——其余都是围绕“问出好问题”这一核心的工程化。