LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略
目录
STORM系统简介
1、Co-STORM
2、更新新闻
STORM系统安装和使用方法
1、安装
pip安装
直接克隆GitHub仓库
2、模型和数据集
两个数据集
FreshWiki数据集
WildSeek数据集
支持的模型
3、使用方法
STORM (STORMWikiRunner)
Co-STORM (CoStormRunner)
4、管道定制
STORM
Co-STORM
案例应用
1、STORM示例
2、Co-STORM示例
STORM系统简介
2024年4月发布,STORM是一个基于大型语言模型(LLM)的知识整理系统,能够根据互联网搜索结果从零开始撰写类似维基百科的文章,并包含参考文献。它将长文章的生成过程分解为两个阶段:
>> 预写阶段:系统进行基于互联网的调研,收集参考资料并生成提纲。
>> 写作阶段:系统利用提纲和参考资料生成包含引文的完整文章。
STORM的核心在于自动提出高质量问题的机制。它采用两种策略来提高问题的深度和广度:
>> 视角引导式提问:根据输入主题,STORM通过调查类似主题的现有文章来发现不同的视角,并利用这些视角来控制提问过程。
>> 模拟对话:STORM模拟维基百科撰写者和主题专家之间的对话,这些对话以互联网资源为基础,使语言模型能够更新对主题的理解并提出后续问题。
STORM无法生成可以直接发表的文章(这通常需要大量编辑),但经验丰富的维基百科编辑发现它在写作前的准备阶段非常有用。超过70,000人体验过它的在线研究预览版。
GitHub地址:https://github.com/stanford-oval/storm
1、Co-STORM
Co-STORM是STORM的增强版,它允许人机协作,以支持更一致和更符合用户偏好的信息查找和知识整理。Co-STORM引入了协作式话语协议,通过轮次管理策略支持人机之间的流畅协作,包含以下几个角色:
>> Co-STORM LLM专家:基于外部知识源生成答案,或根据对话历史提出后续问题。
>> 主持人:根据检索器发现但未在之前的轮次中直接使用到的信息,生成发人深省的问题。问题生成也可以基于外部信息!
>> 人类用户:人类用户可以(1)观察对话以更深入地理解主题,或(2)主动参与对话,通过插入话语来引导讨论重点。
Co-STORM还维护一个动态更新的思维导图,它将收集到的信息组织成层次化的概念结构,旨在构建人类用户和系统之间的共享概念空间。思维导图已被证明有助于减少长时间深入讨论时的认知负担。
STORM和Co-STORM都以高度模块化的方式使用dspy实现。总而言之,STORM和Co-STORM提供了一个强大的框架,用于构建基于LLM的知识整理系统,并支持高度的自定义和扩展。
2、更新新闻
[2025/01] 在知识风暴 v1.1.0 版本中,我们为语言模型和嵌入模型添加了 litellm 集成。
[2024/09] Co-STORM 代码库现已发布,并集成到 knowledge-storm Python 包 v1.0.0 中。运行 pip install knowledge-storm --upgrade 进行查看。
[2024 年 9 月] 我们推出协作式 STORM(Co-STORM)以支持人类与 AI 协同进行知识整理!Co-STORM 论文已被 EMNLP 2024 主会议录用。
[2024/07] 您现在可以使用“pip install knowledge-storm”来安装我们的软件包!
[2024/07] 我们新增了 VectorRM 以支持基于用户提供的文档进行知识关联,这补充了现有的搜索引擎支持(YouRM、BingSearch)。(详情请见 #58)
[2024/07] 我们为开发者发布了演示版的轻量级界面,这是一个使用 Python 中的 Streamlit 框架构建的极简用户界面,非常适合本地开发和演示托管(查看 #54)
[2024 年 6 月] 我们将在 2024 年北美计算语言学协会年会(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 以支持不同语言模型的定制以及检索/搜索集成。
STORM系统安装和使用方法
1、安装
pip安装
pip install knowledge-storm
直接克隆GitHub仓库
安装源码,以便直接修改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
2、模型和数据集
两个数据集
FreshWiki和WildSeek,分别用于研究自动知识整理和复杂信息检索。
FreshWiki数据集
包含 100 篇高质量的维基百科文章,这些文章聚焦于 2022 年 2 月至 2023 年 9 月期间编辑次数最多的页面。更多详情请参阅 STORM 论文的 2.1 节。可以直接从 Huggingface 下载数据集。为缓解数据污染问题,我们存档了数据构建流程的源代码,以便日后重复使用。
WildSeek数据集
为了研究用户在复杂信息搜索任务中的兴趣,我们在野外利用从网络研究预览中收集的数据创建了 WildSeek 数据集。我们对数据进行了下采样,以确保主题的多样性和数据的质量。每个数据点都是一对,包括一个主题和用户针对该主题进行深度搜索的目标。更多详情,请参阅 Co-STORM 论文的第 2.2 节和附录 A。
支持的模型
>> 语言模型组件:litellm 支持的所有语言模型,https://docs.litellm.ai/docs/providers。
>> 嵌入模型组件:litellm 支持的所有嵌入模型,https://docs.litellm.ai/docs/embedding/supported_embedding。
>> 检索模块组件:YouRM、BingSearch、VectorRM、SerperRM、BraveRM、SearXNG、DuckDuckGoSearchRM、TavilySearchRM、GoogleSearch 和 AzureAISearch
无论是 STORM 还是 Co-STORM,它们都在信息整理层工作,您需要分别设置信息检索模块和语言模型模块,以创建它们各自的运行器类。
3、使用方法
STORM和Co-STORM都提供了Python接口。
STORM (STORMWikiRunner)
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 API密钥,并设置模型参数
openai_kwargs = {
'api_key': os.getenv("OPENAI_API_KEY"), # 从环境变量中获取API密钥
'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-3.5模型实例
gpt_4 = LitellmModel(model='gpt-4o', max_tokens=3000, **openai_kwargs) # 创建一个GPT-4模型实例
# 设置不同的语言模型用于不同的任务
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) # 使用环境变量中的API密钥和搜索参数
# 创建STORMWikiRunner实例
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 (CoStormRunner)
Co-STORM的知识整理引擎定义为一个简单的Python CoStormRunner 类。以下是一个使用Bing搜索引擎和OpenAI模型的例子:
# 导入协同STORM引擎的相关模块
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系统范式
lm_config = CollaborativeStormLMConfigs() # 初始化协同STORM的语言模型配置
# 设置OpenAI API的参数
openai_kwargs = {
"api_key": os.getenv("OPENAI_API_KEY"), # 从环境变量中获取API密钥
"api_provider": "openai", # API提供商
"temperature": 1.0, # 控制生成文本的随机性
"top_p": 0.9, # 控制生成文本的多样性
"api_base": None, # API基础URL
}
# 创建不同用途的语言模型实例
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搜索资源管理器
bing_rm = BingSearch(bing_search_api_key=os.environ.get("BING_SEARCH_API_KEY"),
k=runner_argument.retrieve_top_k) # 使用环境变量中的API密钥和检索参数
# 创建CoStormRunner实例
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) # 打印报告
4、管道定制
STORM
如果您已安装源代码,可以根据自己的使用场景对 STORM 进行定制。STORM 引擎由 4 个模块组成:
>> 知识整理模块:收集给定主题的广泛信息。
>> 大纲生成模块:通过生成分层大纲来组织收集到的信息。
>> 文章生成模块:用收集到的信息填充生成的大纲。
>> 文章润色模块:优化和改进所写的文章,使其呈现效果更佳。
每个模块的接口在 knowledge_storm/interface.py 中定义,而它们的实现则在 knowledge_storm/storm_wiki/modules/ 中实例化。这些模块可以根据您的具体需求进行定制(例如,以项目符号格式生成章节,而非完整段落)。
Co-STORM
如果您已安装源代码,可以根据自己的使用场景对 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 提供了回合策略管理的一个示例实现。它可以进行自定义和进一步改进。
5、在线测试
Write a hot news article about the DeepSeek-R1 model based on the latest authoritative sources
案例应用
GitHub项目提供了示例脚本(位于examples文件夹),用于快速启动STORM和Co-STORM,并配置不同的参数。建议使用secrets.toml文件设置API密钥。
项目还提供了自定义流水线的方法,允许用户根据自身需求修改知识整理模块、提纲生成模块、文章生成模块和文章润色模块。 Co-STORM的自定义则更加灵活,允许自定义LLM代理策略和协作式话语协议。
1、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
更多自定义语言模型或自定义语料库的例子,请参考examples/storm_examples/README.md。
2、Co-STORM示例
运行以下命令可以使用GPT系列模型和默认配置运行Co-STORM (需要在secrets.toml中设置BING_SEARCH_API_KEY和ENCODER_API_TYPE):
python examples/costorm_examples/run_costorm_gpt.py \
--output-dir $OUTPUT_DIR \
--retriever bing