STORM(Synthesis of Topic Outlines through Retrieval and Multi-perspective Question Asking)是一个由 LLM 驱动的知识整理系统,可研究一个主题并生成带引用的完整长度报告。该项目由斯坦福 oval 团队开发,当前为研究预览版,已有超过 70,000 人试用在线预览。
用途与定位 STORM 面向知识探索与写作前期准备。官方明确指出,系统目前无法产出通常需要大量编辑的可发表文章,但有经验的 Wikipedia 编辑认为它在写作前期阶段有帮助。
工作方式 STORM 将生成长篇带引用文章拆分为两步:
- 写作前阶段(Pre-writing stage):系统进行基于互联网的研究,收集参考文献并生成提纲。
- 写作阶段(Writing stage):系统使用提纲和参考文献生成带引用的完整文章。 官方认为,自动研究过程的核心在于自动提出好问题,而直接提示语言模型提问效果不佳。为提升问题的深度与广度,STORM 采用两种策略:
- 视角引导提问(Perspective-Guided Question Asking):给定输入主题后,STORM 通过调研类似主题的已有文章来发现不同视角,并用这些视角控制提问过程。
- 模拟对话(Simulated Conversation):STORM 模拟一位 Wikipedia 写作者与一位基于互联网资料的领域专家之间的对话,使语言模型更新对主题的理解并提出后续问题。
Co-STORM 协作模式 Co-STORM 提出了协作话语协议,通过轮次管理策略支持以下三方顺畅协作:
- Co-STORM LLM 专家:基于外部知识源生成答案,和/或根据话语历史提出后续问题。
- 主持人(Moderator):受检索器发现但未在前几轮直接使用的信息启发,生成具有思考价值的问题;问题生成同样可以基于资料。
- 人类用户:可以主动选择(1)观察话语以更深入理解主题,或(2)通过注入话语积极参与对话,引导讨论焦点。 Co-STORM 还维护一张动态更新的思维导图(mind map),将收集到的信息组织为分层概念结构,力图在人类用户与系统之间建立共享的概念空间。官方称该思维导图已被证明有助于在话语变得冗长深入时降低心智负担。
技术实现与模型支持 STORM 和 Co-STORM 均使用 dspy 以高度模块化方式实现。当前包支持:
- 语言模型组件:litellm 支持的所有语言模型。
- 嵌入模型组件:litellm 支持的所有嵌入模型。
- 检索模块组件:YouRM、BingSearch、VectorRM、SerperRM、BraveRM、SearXNG、DuckDuckGoSearchRM、TavilySearchRM、GoogleSearch 和 AzureAISearch。
安装与使用方式 可通过 pip 安装:pip install knowledge-storm;也可安装源码以直接修改 STORM 引擎行为: git clone https://github.com/stanford-oval/storm.git cd storm 源码环境安装: conda create -n storm python=3.11 conda activate storm pip install -r requirements.txt STORM 与 Co-STORM 都工作在信息整理层,需要先设置信息检索模块和语言模型模块,才能创建各自的 Runner 类。STORM 知识整理引擎定义为 Python 的 STORMWikiRunner 类,可通过 run 方法调用,其主要参数包括:
- do_research:为 True 时模拟不同视角的对话以收集主题信息,否则加载已有结果。
- do_generate_outline:为 True 时为主题生成提纲,否则加载已有结果。
- do_generate_article:为 True 时基于提纲和已收集信息生成文章,否则加载已有结果。
- do_polish_article:为 True 时通过添加摘要部分并(可选)删除重复内容来润色文章,否则加载已有结果。 Co-STORM 知识整理引擎定义为 Python 的 CoStormRunner 类,可通过 warmstart() 和 step(...) 方法调用。
示例与配置 官方在 examples 文件夹提供脚本,用于以不同配置快速运行 STORM 和 Co-STORM,并建议使用 secrets.toml 设置 API 密钥。可运行默认配置的 gpt 系列模型,也可使用其他语言模型或基于自有语料;Co-STORM 示例需在 secrets.toml 中添加 BING_SEARCH_API_KEY 和 ENCODER_API_TYPE。
流水线定制 若安装了源码,可基于自身用例定制 STORM。STORM 引擎由 4 个模块组成:
- 知识整理模块:收集关于给定主题的广泛信息。
- 提纲生成模块:通过为整理好的知识生成分层提纲来组织收集到的信息。
- 文章生成模块:用收集到的信息填充生成的提纲。
- 文章润色模块:改进和增强文章以提升呈现效果。 各模块接口定义在 knowledge_storm/interface.py,实现位于 knowledge_storm/storm_wiki/modules/*,可按需定制(例如以项目符号格式生成小节而非完整段落)。 Co-STORM 同样可定制:其 LLM 智能体接口定义在 knowledge_storm/interface.py,实现位于 knowledge_storm/collaborative_storm/modules/co_storm_agents.py;协作话语协议的核心是轮次策略管理,示例实现为 knowledge_storm/collaborative_storm/engine.py 中的 DiscourseManager。
数据集 项目发布了以下数据集以促进自动知识整理与复杂信息检索研究:
- FreshWiki 数据集:收录 100 篇高质量 Wikipedia 文章,聚焦 2022 年 2 月至 2023 年 9 月间编辑最多的页面。可从 huggingface 直接下载,并归档了数据构建流水线源码以便未来重复。
- WildSeek 数据集:来自网络研究预览收集的数据,经下采样以保证主题多样性与数据质量,每个数据点包含一个主题及用户对该主题进行深度搜索的目标。
论文复现与路线图 STORM 论文实验可切换到 NAACL-2024-code-backup 分支;Co-STORM 论文实验对应 EMNLP-2024-code-backup 分支(官方标注为占位,将更新)。团队正在推进的方向包括:人在回路(Human-in-the-Loop)功能,支持用户参与知识整理过程;信息抽象,为整理后的信息开发抽象,以支持 Wikipedia 风格报告之外的呈现形式。
许可与致谢 项目感谢 Wikipedia 的开放内容,FreshWiki 数据集来源于 Wikipedia,采用 CC BY-SA 许可。
限制 官方说明系统尚不能生成可直接发表的成品文章,通常需要大量编辑;其定位为写作前期与研究探索辅助工具。