科学工具
科学工具让世界更美好
让世界更美好

开源知识生成工具 STORM 安装部署使用指南开源知识生成工具 STORM 安装部署使用指南

STORM全称是“Synthesis of Topic Outlines through Retrieval and Multi-perspective Question Asking”,是一个由大语言模型驱动的知识整理系统,能围绕特定主题进行研究,并生成带有引用的完整报告。

STORM是一个大语言模型系统,能基于互联网搜索从零开始撰写类似维基百科的文章。Co-STORM进一步增强了其功能,允许人类与大语言模型系统协作,支持更贴合需求的信息查找和知识整理。

虽然该系统无法生成无需修改就能发布的文章(这类文章通常需要大量编辑),但有经验的维基百科编辑发现它在写作前的准备阶段很有用。

STORM与Co-STORM的工作原理

STORM

STORM将生成带引用的长文章分为两个步骤:

• 写作前阶段:系统进行基于互联网的研究,收集参考资料并生成大纲。

• 写作阶段:系统利用大纲和参考资料生成带引用的完整文章。

STORM认为自动化研究过程的核心是自动提出好的问题。直接提示大语言模型提问效果不佳。为提升问题的深度和广度,STORM采用两种策略:

• 视角引导提问:给定输入主题,STORM通过调研相似主题的现有文章发现不同视角,并用这些视角控制提问过程。

• 模拟对话:STORM模拟维基百科作者和主题专家之间基于互联网资源的对话,让大语言模型更新对主题的理解并提出后续问题。

Co-STORM

Co-STORM提出协作式对话协议,通过轮次管理策略支持多方顺畅协作:

• Co-STORM大语言模型专家:这类智能体基于外部知识源生成答案,或根据对话历史提出后续问题。

• 主持人:该智能体根据检索器发现但之前轮次未直接使用的信息,生成发人深省的问题。问题生成也能基于事实!

• 人类用户:人类用户可以主动选择(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

API支持

目前,我们的包支持:

• 大语言模型组件:所有litellm支持的大语言模型,列表见https://docs.litellm.ai/docs/providers

• 嵌入模型组件:所有litellm支持的嵌入模型,列表见https://docs.litellm.ai/docs/embeddings

• 检索模块组件:YouRM、BingSearch、VectorRM、SerperRM、BraveRM、SearXNG、DuckDuckGoSearchRM、TavilySearchRM、GoogleSearch和AzureAISearch

欢迎通过PR将更多搜索引擎/检索器集成到knowledge_storm/rm.py中!

STORM和Co-STORM都在信息整理层工作,需要设置信息检索模块和大语言模型模块,分别创建它们的Runner类。

STORM

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是一个多语言模型系统,不同组件可以使用不同模型,在成本和质量之间取得平衡。
# 实际使用中,`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)

可以通过简单的run方法调用STORMWikiRunner实例:

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

Co-STORM知识整理引擎定义为简单的Python类CoStormRunner。以下是使用必应搜索引擎和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采用与STORM相同的多语言模型系统模式
lm_config: CollaborativeStormLMConfigs = CollaborativeStormLMConfigs()
openai_kwargs = {"api_key": os.getenv("OPENAI_API_KEY"), "api_provider": "openai", "temperature": 1.0, "top_p": 0.9,}
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)
# 查看Co-STORM的RunnerArguments类了解更多配置。
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实例:

# 预热系统,在Co-STORM和用户之间建立共享概念空间
costorm_runner.warm_start()
# 逐步进行协作对话
# 可以按任意顺序多次运行以下任一代码片段
# 观察对话:
conv_turn = costorm_runner.step()
# 注入你的话语以主动引导对话:
costorm_runner.step(user_utterance="YOUR UTTERANCE HERE")
# 基于协作对话生成报告
costorm_runner.knowledge_base.reorganize()
article = costorm_runner.generate_report()
print(article)

STORM快速开始

我们在examples文件夹中提供了脚本,帮助快速开始运行不同配置的STORM和Co-STORM。

建议使用secrets.toml设置API密钥。在根目录下创建secrets.toml文件,添加以下内容:

# ============ 语言模型配置 ============
# 设置OpenAI API密钥。
OPENAI_API_KEY= "your_openai_api_key"
# 如果使用OpenAI提供的API服务,包含以下行:
OPENAI_API_TYPE= "openai"
# 如果使用微软Azure提供的API服务,包含以下行:
OPENAI_API_TYPE= "azure"
AZURE_API_BASE= "your_azure_api_base_url"
AZURE_API_VERSION= "your_azure_api_version"
# ============ 检索器配置 ============
BING_SEARCH_API_KEY= "your_bing_search_api_key"  # 如果使用必应搜索
# ============ 编码器配置 ============
ENCODER_API_TYPE= "openai"  # 如果使用openai编码器

STORM示例

使用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。

Co-STORM示例

使用gpt系列模型按默认配置运行Co-STORM:

在secrets.toml中添加BING_SEARCH_API_KEY="xxx"和ENCODER_API_TYPE="xxx"

运行以下命令:

python examples/costorm_examples/run_costorm_gpt.py \
    --output-dir $OUTPUT_DIR \
    --retriever bing

管道自定义

STORM

如果安装了源代码,可以根据自己的用例自定义STORM。STORM引擎包含4个模块:

• 知识整理模块:收集关于给定主题的广泛信息。

• 大纲生成模块:通过生成层级大纲组织收集的信息。

• 文章生成模块:用收集的信息填充生成的大纲。

• 文章润色模块:优化撰写的文章,提升呈现效果。

每个模块的接口在knowledge_storm/interface.py中定义,其实现在knowledge_storm/storm_wiki/modules/*中实例化。可以根据具体需求自定义这些模块(例如,生成要点格式的章节而不是完整段落)。

Co-STORM

如果安装了源代码,可以根据自己的用例自定义Co-STORM。

Co-STORM引入了多种大语言模型智能体类型(即Co-STORM专家和主持人)。大语言模型智能体接口在knowledge_storm/interface.py中定义,其实现在knowledge_storm/collaborative_storm/modules/co_storm_agents.py中实例化。可以自定义不同的大语言模型智能体策略。

Co-STORM引入了协作式对话协议,其核心功能围绕轮次策略管理。我们通过knowledge_storm/collaborative_storm/engine.py中的DiscourseManager提供了轮次策略管理的示例实现。这部分可以自定义和进一步改进。

数据集

为促进自动知识整理和复杂信息查找的研究,我们的项目发布了以下数据集:

FreshWiki

FreshWiki数据集包含100篇高质量的维基百科文章,聚焦2022年2月至2023年9月期间编辑次数最多的页面。更多细节见STORM论文第2.1节。

可以直接从huggingface下载该数据集。为缓解数据污染问题,我们归档了数据构建管道的源代码,未来可以重复使用。

WildSeek

为研究用户在实际场景中复杂信息查找任务的兴趣,我们利用从网络研究预览中收集的数据创建了WildSeek数据集。我们对数据进行了下采样,确保主题的多样性和数据质量。每个数据点都是一个对,包含一个主题和用户对该主题进行深度搜索的目标。

复现STORM和Co-STORM论文结果

• 对于STORM论文实验,请切换到分支NAACL-2024-code-backup,链接见 https://github.com/stanford-oval/storm/tree/NAACL-2024-code-backup

• 对于Co-STORM论文实验,请切换到分支EMNLP-2024-code-backup。