开源项目 Storm 能自动研究主题并生成完整 wiki 风格文章,展示大模型在复杂信息合成中的应用潜力。
| Research preview | STORM Paper | Co-STORM Paper | Website |
[2025/01] 我们在 knowledge-storm v1.1.0 中添加了 litellm 集成用于语言模型和嵌入模型。
[2024/09] Co-STORM 代码库已发布并集成到 knowledge-storm Python 包 v1.0.0。运行 pip install knowledge-storm --upgrade 来体验。
[2024/09] 我们推出了协作式 STORM (Co-STORM) 以支持人工智能协作知识策划!Co-STORM 论文已被接受为 EMNLP 2024 主会议论文。
[2024/07] 您现在可以使用 pip install knowledge-storm 来安装我们的包了!
[2024/07] 我们添加了 VectorRM 来支持基于用户提供文档的接地,补充了现有的搜索引擎支持 (YouRM、BingSearch)。(参见 #58)
[2024/07] 我们为开发者发布了演示轻版,一个使用 Python Streamlit 框架构建的最小化用户界面,便于本地开发和演示托管 (参见 #54)
[2024/06] 我们将在 NAACL 2024 展示 STORM!在 6 月 17 日的海报会议第 2 场找到我们或查看我们的演讲材料。
[2024/05] 我们在 rm.py 中添加了必应搜索支持。使用 GPT-4o 测试 STORM - 我们现在在演示中使用 GPT-4o 模型配置文章生成部分。
[2024/04] 我们发布了 STORM 代码库的重构版本!我们定义了 STORM 流程的接口并重新实现了 STORM-wiki (参见 src/storm_wiki) 来演示如何实例化流程。我们提供了 API 以支持不同语言模型和检索/搜索集成的自定义。
虽然该系统无法生成出版级别的文章(这通常需要大量编辑),但经验丰富的维基百科编辑者发现它在撰文前期阶段很有帮助。
超过 70,000 人已经尝试过我们的实时研究预览。试试看 STORM 如何帮助您的知识探索之旅,请提供反馈来帮助我们改进系统 🙏!
STORM 将生成带有引文的长文章分解为两个步骤:
前期撰写阶段:系统进行基于互联网的研究来收集参考资料并生成大纲。
撰写阶段:系统使用大纲和参考资料来生成带有引文的全文文章。
STORM 将自动化研究流程的核心确定为自动提出高质量问题。直接提示语言模型提问效果不佳。为了提高问题的深度和广度,STORM 采用了两个策略:
视角导向的提问:给定输入主题,STORM 通过调查来自类似主题的现有文章来发现不同视角,并使用它们来控制提问过程。
模拟对话:STORM 模拟维基百科作者与主题专家之间的对话,以互联网源为基础,使语言模型能够更新其对主题的理解并提出后续问题。
Co-STORM 提出了一个协作话语协议,该协议实现了转向管理策略以支持以下智能体之间的顺利协作:
Co-STORM LLM 专家:这类智能体基于外部知识源生成答案和/或根据话语历史提出后续问题。
主持人:此智能体生成富有启发的问题,灵感来自检索器发现但未在之前轮次中直接使用的信息。问题生成也可以被接地!
人类用户:人类用户将主动采取以下任一行动:(1) 观察话语以更深入地理解主题,或 (2) 通过注入陈述来积极参与对话以引导讨论焦点。
Co-STORM 还维护一个动态更新的思维导图,它将收集的信息组织成分层概念结构,旨在在人类用户和系统之间建立共享的概念空间。思维导图已被证明可以帮助在话语变得冗长和深入时减少认知负荷。
STORM 和 Co-STORM 都使用 dspy 以高度模块化的方式实现。
要安装 knowledge-storm 库,使用 pip install knowledge-storm。
您也可以安装源代码,这允许您直接修改 STORM 引擎的行为。
克隆 git 仓库:
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
目前,我们的包支持:
语言模型组件:litellm 支持的所有语言模型,如此处所列
嵌入模型组件:litellm 支持的所有嵌入模型,如此处所列
检索模块组件:YouRM、BingSearch、VectorRM、SerperRM、BraveRM、SearXNG、DuckDuckGoSearchRM、TavilySearchRM、GoogleSearch 和 AzureAISearch
🌟 欢迎提交 PR 将更多搜索引擎/检索器集成到 knowledge_storm/rm.py 中!
STORM 和 Co-STORM 都在信息策划层工作,您需要设置信息检索模块和语言模型模块来分别创建它们的 Runner 类。
STORM 知识策划引擎定义为一个简单的 Python STORMWikiRunner 类。以下是使用 You.com 搜索引擎和 OpenAI 模型的示例。
import os
from knowledge_storm import STORMWikiRunnerArguments, STORMWikiRunner, STORMWikiLMConfigs
from knowledge_storm.lm import LitellmModel
from knowledge_storm.rm import YouRM
lm_configs = STORMWikiLMConfigs()
openai_kwargs = {
'api_key': os.getenv("OPENAI_API_KEY"),
'temperature': 1.0,
'top_p': 0.9,
}
# STORM 是一个 LM 系统,因此不同的组件可以由不同的模型驱动以在成本和质量之间达到良好平衡。
# 对于最佳实践,为 `conv_simulator_lm` 选择更便宜/更快的模型,用于拆分查询、综合对话中的答案。
# 为 `article_gen_lm` 选择更强大的模型来生成带有引文的可验证文本。
gpt_35 = LitellmModel(model='gpt-3.5-turbo', max_tokens=500, **openai_kwargs)
gpt_4 = LitellmModel(model='gpt-4o', max_tokens=3000, **openai_kwargs)
lm_configs.set_conv_simulator_lm(gpt_35)
lm_configs.set_question_asker_lm(gpt_35)
lm_configs.set_outline_gen_lm(gpt_4)
lm_configs.set_article_gen_lm(gpt_4)
lm_configs.set_article_polish_lm(gpt_4)
# 查看 STORMWikiRunnerArguments 类获取更多配置。
engine_args = STORMWikiRunnerArguments(...)
rm = YouRM(ydc_api_key=os.getenv('YDC_API_KEY'), k=engine_args.search_top_k)
runner = STORMWikiRunner(engine_args, lm_configs, rm)
STORMWikiRunner 实例可以通过简单的 run 方法调用:
topic = input('Topic: ')
runner.run(
topic=topic,
do_research=True,
do_generate_outline=True,
do_generate_article=True,
do_polish_article=True,
)
runner.post_run()
runner.summary()
do_research:如果为 True,模拟与不同视角的对话来收集有关主题的信息;否则,加载结果。do_generate_outline:如果为 True,为主题生成大纲;否则,加载结果。do_generate_article:如果为 True,基于大纲和收集的信息为主题生成文章;否则,加载结果。do_polish_article:如果为 True,则通过添加摘要章节并(可选)删除重复内容来润色文章;否则加载结果。
Co-STORM 知识管理引擎被定义为一个简单的 Python CoStormRunner 类。下面是使用 Bing 搜索引擎和 OpenAI 模型的示例。
from knowledge_storm.collaborative_storm.engine import CollaborativeStormLMConfigs, RunnerArgument, CoStormRunner
from knowledge_storm.lm import LitellmModel
from knowledge_storm.logging_wrapper import LoggingWrapper
from knowledge_storm.rm import BingSearch
# Co-STORM adopts the same multi LM system paradigm as STORM
lm_config: CollaborativeStormLMConfigs = CollaborativeStormLMConfigs()
openai_kwargs = {
"api_key": os.getenv("OPENAI_API_KEY"),
"api_provider": "openai",
"temperature": 1.0,
"top_p": 0.9,
"api_base": None,
}
question_answering_lm = LitellmModel(model=gpt_4o_model_name, max_tokens=1000, **openai_kwargs)
discourse_manage_lm = LitellmModel(model=gpt_4o_model_name, max_tokens=500, **openai_kwargs)
utterance_polishing_lm = LitellmModel(model=gpt_4o_model_name, max_tokens=2000, **openai_kwargs)
warmstart_outline_gen_lm = LitellmModel(model=gpt_4o_model_name, max_tokens=500, **openai_kwargs)
question_asking_lm = LitellmModel(model=gpt_4o_model_name, max_tokens=300, **openai_kwargs)
knowledge_base_lm = LitellmModel(model=gpt_4o_model_name, max_tokens=1000, **openai_kwargs)
lm_config.set_question_answering_lm(question_answering_lm)
lm_config.set_discourse_manage_lm(discourse_manage_lm)
lm_config.set_utterance_polishing_lm(utterance_polishing_lm)
lm_config.set_warmstart_outline_gen_lm(warmstart_outline_gen_lm)
lm_config.set_question_asking_lm(question_asking_lm)
lm_config.set_knowledge_base_lm(knowledge_base_lm)
# Check out the Co-STORM's RunnerArguments class for more configurations.
topic = input('Topic: ')
runner_argument = RunnerArgument(topic=topic, ...)
logging_wrapper = LoggingWrapper(lm_config)
bing_rm = BingSearch(bing_search_api_key=os.environ.get("BING_SEARCH_API_KEY"),
k=runner_argument.retrieve_top_k)
costorm_runner = CoStormRunner(lm_config=lm_config,
runner_argument=runner_argument,
logging_wrapper=logging_wrapper,
rm=bing_rm)
可以通过 warmstart() 和 step(...) 方法调用 CoStormRunner 实例。
# Warm start the system to build shared conceptual space between Co-STORM and users
costorm_runner.warm_start()
# Step through the collaborative discourse
# Run either of the code snippets below in any order, as many times as you'd like
# To observe the conversation:
conv_turn = costorm_runner.step()
# To inject your utterance to actively steer the conversation:
costorm_runner.step(user_utterance="YOUR UTTERANCE HERE")
# Generate report based on the collaborative discourse
costorm_runner.knowledge_base.reorganize()
article = costorm_runner.generate_report()
print(article)
我们在 examples 文件夹中提供了脚本,帮助你使用不同配置快速运行 STORM 和 Co-STORM。
建议使用 secrets.toml 配置 API 密钥。在根目录下创建 secrets.toml 文件,并添加以下内容:
# ============ language model configurations ============
# Set up OpenAI API key.
OPENAI_API_KEY="your_openai_api_key"
# If you are using the API service provided by OpenAI, include the following line:
OPENAI_API_TYPE="openai"
# If you are using the API service provided by Microsoft Azure, include the following lines:
OPENAI_API_TYPE="azure"
AZURE_API_BASE="your_azure_api_base_url"
AZURE_API_VERSION="your_azure_api_version"
# ============ retriever configurations ============
BING_SEARCH_API_KEY="your_bing_search_api_key" # if using bing search
# ============ encoder configurations ============
ENCODER_API_TYPE="openai" # if using openai encoder
要使用默认配置,通过 GPT 系列模型运行 STORM:
运行以下命令。
python examples/storm_examples/run_storm_wiki_gpt.py \
--output-dir $OUTPUT_DIR \
--retriever bing \
--do-research \
--do-generate-outline \
--do-generate-article \
--do-polish-article
要使用你喜欢的语言模型运行 STORM,或基于你自己的语料库进行事实依据补充,请查看 examples/storm_examples/README.md。
要使用默认配置,通过 GPT 系列模型运行 Co-STORM:
将 BING_SEARCH_API_KEY="xxx" 和 ENCODER_API_TYPE="xxx" 添加到 secrets.toml。
运行以下命令:
python examples/costorm_examples/run_costorm_gpt.py \
--output-dir $OUTPUT_DIR \
--retriever bing
如果你已经安装了源代码,则可以根据自己的用例自定义 STORM。STORM 引擎由 4 个模块组成:
知识管理模块:围绕给定主题广泛收集信息。
大纲生成模块:为整理后的知识生成分层大纲,以组织收集到的信息。
文章生成模块:使用收集到的信息填充生成的大纲。
文章润色模块:对写好的文章进行优化和完善,使其呈现效果更好。
每个模块的接口都定义在 knowledge_storm/interface.py 中,而它们的实现则在 knowledge_storm/storm_wiki/modules/* 中实例化。你可以根据具体需求自定义这些模块(例如,以项目符号列表而不是完整段落的形式生成章节)。
如果你已经安装了源代码,则可以根据自己的用例自定义 Co-STORM。
Co-STORM 引入了多种 LLM 智能体类型(即 Co-STORM 专家和主持人)。LLM 智能体接口定义在 knowledge_storm/interface.py 中,而其实现则在 knowledge_storm/collaborative_storm/modules/co_storm_agents.py 中实例化。你可以自定义不同的 LLM 智能体策略。
Co-STORM 引入了一种协作式讨论协议,其核心功能围绕轮次策略管理展开。我们通过 knowledge_storm/collaborative_storm/engine.py 中的 DiscourseManager 提供了一个轮次策略管理的实现示例。你可以对其进行自定义和进一步改进。
为了促进对自动知识管理和复杂信息检索的研究,我们的项目发布了以下数据集:
FreshWiki 数据集收录了 100 篇高质量 Wikipedia 文章,重点涵盖 2022 年 2 月至 2023 年 9 月期间编辑次数最多的页面。更多详情请参阅 STORM 论文第 2.1 节。
你可以直接从 Hugging Face 下载该数据集。为了缓解数据污染问题,我们归档了数据构建流水线的源代码,以便未来在不同日期重复执行。
为了研究现实场景中用户对复杂信息检索任务的兴趣,我们利用从 Web Research 预览版收集的数据创建了 WildSeek 数据集。我们对数据进行了下采样,以确保主题的多样性和数据质量。每个数据点都是一个由主题和用户针对该主题进行深度搜索的目标组成的数据对。更多详情请参阅 Co-STORM 论文第 2.2 节和附录 A。
WildSeek 数据集可在此处获取。
对于 STORM 论文实验,请切换到此处的 NAACL-2024-code-backup 分支。
对于 Co-STORM 论文实验,请切换到 EMNLP-2024-code-backup 分支(目前为占位内容,即将更新)。
我们的团队正在积极开展以下工作:
人机协同功能:支持用户参与知识管理过程。
信息抽象:为整理后的信息开发抽象层,以支持 Wikipedia 风格报告之外的其他呈现形式。
如果你有任何问题或建议,欢迎随时提交 Issue 或 Pull Request。我们欢迎大家贡献力量,共同改进系统和代码库!
联系人:Yijia Shao 和 Yucheng Jiang
感谢 Wikipedia 提供出色的开源内容。FreshWiki 数据集来源于 Wikipedia,并采用知识共享署名—相同方式共享(CC BY-SA)许可协议。
衷心感谢 Michelle Lam 为本项目设计 Logo,也感谢 Dekun Ma 主导 UI 开发工作。
感谢 Vercel 对开源软件的支持。
如果你在工作中使用了这份代码或其中的一部分,请引用我们的论文:
@inproceedings{jiang-etal-2024-unknown,
title = "走向未知的未知:通过参与语言模型智能体对话的人类学习",
author = "Jiang, Yucheng and
Shao, Yijia and
Ma, Dekun and
Semnani, Sina and
Lam, Monica",
editor = "Al-Onaizan, Yaser and
Bansal, Mohit and
Chen, Yun-Nung",
booktitle = "2024年自然语言处理实证方法会议论文集",
month = nov,
year = "2024",
address = "美国佛罗里达州迈阿密",
publisher = "计算语言学协会",
url = "https://aclanthology.org/2024.emnlp-main.554/",
doi = "10.18653/v1/2024.emnlp-main.554",
pages = "9917--9955",
}
@inproceedings{shao-etal-2024-assisting,
title = "使用大型语言模型从零开始协助编写维基百科式文章",
author = "Shao, Yijia and
Jiang, Yucheng and
Kanell, Theodore and
Xu, Peter and
Khattab, Omar and
Lam, Monica",
editor = "Duh, Kevin and
Gomez, Helena and
Bethard, Steven",
booktitle = "2024年北美计算语言学协会:人类语言技术会议论文集(第1卷:长论文)",
month = jun,
year = "2024",
address = "墨西哥墨西哥城",
publisher = "计算语言学协会",
url = "https://aclanthology.org/2024.naacl-long.347/",
doi = "10.18653/v1/2024.naacl-long.347",
pages = "6252--6278",
}