在信息爆炸的时代,内容生成技术正以前所未有的速度发展,成为各行业必不可少的工具。尤其是基于检索增强生成(RAG)的内容生成方法,它能够精准地提取并生成高质量的内容,满足我们对知识的快速获取与深度整理的需求。
正如著名作家赫尔曼·梅尔维尔所言:“知识就像海洋,永无止境,我们需要有正确的船只才能在其中航行。”如今,STORM和Co-STORM正是我们航行在这片知识海洋中的得力助手。
STORM系统通过网络搜索,借助多角度提问,能够自动生成类似维基百科文章的主题大纲,而Co-STORM则更进一步,通过启用人类协作,提升了内容的连贯性和实用性。
这一创新不仅提升了内容生成的效率,更使得信息寻求和知识整理变得更加一致与受欢迎,标志着RAG内容生成进入了一个全新的时代。
Co-STORM 提出了一种协作话语协议,该协议实现了一种轮次管理策略,以支持顺畅的协作。
Co-STORM LLM 专家:此类代理基于外部知识源生成答案,或根据话语历史提出后续问题。
主持人:此代理生成由检索器发现的信息启发且在之前的回合中未直接使用的问题,这些问题具有启发性!问题生成也可以是基于事实的!
人类用户:人类用户将主动采取以下行动之一:(1)观察对话以深入了解主题,或(2)通过插入话语来引导对话焦点。
Co-STORM 还维护一个动态更新的思维导图,将收集到的信息组织成层次化的概念结构,旨在在人类用户和系统之间建立一个共享的概念空间。思维导图已被证明有助于在对话变得漫长和深入时减轻心理负担。
不同学习与信息搜索范式的比较。Co-STORM 使人类能够观察并参与不同角色 LM 代理之间的协作对话。用户可以请求系统根据对话历史和收集到的信息生成一份完整的引用报告。通过生成直接响应来查询,有效解决已知未知问题,用户了解他们的信息需求。
然而,在复杂的信息搜索场景中使用这些系统(如学术研究、市场分析和决策制定)时仍存在差距,在这些场景中,系统应向用户展示他们未知的未知,以促进知识发现。虽然“未知的未知”这一概念最初指的是军事中的意外风险,但它与信息研究背景下的意外发现信息相关。
STORM 和 Co-STORM 都使用 dspy 以高度模块化的方式实现。
安装知识风暴库,请使用:
pip install knowledge-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
STORMWikiRunner
类。以下是一个使用 You.com 搜索引擎和 OpenAI 模型的示例。import os
from knowledge_storm import STORMWikiRunnerArguments, STORMWikiRunner, STORMWikiLMConfigs
from knowledge_storm.lm import OpenAIModel
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 is a LM system so different components can be powered by different models to reach a good balance between cost and quality.
# For a good practice, choose a cheaper/faster model for `conv_simulator_lm` which is used to split queries, synthesize answers in the conversation.
# Choose a more powerful model for `article_gen_lm` to generate verifiable text with citations.
gpt_35 = OpenAIModel(model='gpt-3.5-turbo', max_tokens=500, **openai_kwargs)
gpt_4 = OpenAIModel(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)
# Check out the STORMWikiRunnerArguments class for more configurations.
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)
CoStormRunner
类。以下是一个使用必应搜索引擎和 OpenAI 模型的示例。from knowledge_storm.collaborative_storm.engine import CollaborativeStormLMConfigs, RunnerArgument, CoStormRunner
from knowledge_storm.lm import OpenAIModel
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 = OpenAIModel(model=gpt_4o_model_name, max_tokens=1000, **openai_kwargs)
discourse_manage_lm = OpenAIModel(model=gpt_4o_model_name, max_tokens=500, **openai_kwargs)
utterance_polishing_lm = OpenAIModel(model=gpt_4o_model_name, max_tokens=2000, **openai_kwargs)
warmstart_outline_gen_lm = OpenAIModel(model=gpt_4o_model_name, max_tokens=500, **openai_kwargs)
question_asking_lm = OpenAIModel(model=gpt_4o_model_name, max_tokens=300, **openai_kwargs)
knowledge_base_lm = OpenAIModel(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)