RAG内容生成革新:STORM与Co-STORM引领智能检索与人类协作

文摘   2024-12-09 07:40   新加坡  

在信息爆炸的时代,内容生成技术正以前所未有的速度发展,成为各行业必不可少的工具。尤其是基于检索增强生成(RAG)的内容生成方法,它能够精准地提取并生成高质量的内容,满足我们对知识的快速获取与深度整理的需求。

正如著名作家赫尔曼·梅尔维尔所言:“知识就像海洋,永无止境,我们需要有正确的船只才能在其中航行。”如今,STORM和Co-STORM正是我们航行在这片知识海洋中的得力助手。

STORM系统通过网络搜索,借助多角度提问,能够自动生成类似维基百科文章的主题大纲,而Co-STORM则更进一步,通过启用人类协作,提升了内容的连贯性和实用性。

这一创新不仅提升了内容生成的效率,更使得信息寻求和知识整理变得更加一致与受欢迎,标志着RAG内容生成进入了一个全新的时代。

STORM 是一个基于网络搜索从头开始编写类似维基百科文章的LLM系统。Co-STORM 通过启用人类协作的LLM系统进一步增强了其功能,以支持更一致和更受欢迎的信息寻求和知识整理。
STORM 将生成带引用的长文章分解为两个步骤:
写作前阶段:系统进行基于互联网的研究以收集参考资料并生成提纲。
写作阶段:系统使用大纲和参考文献生成全文并附有引用。
STORM 将自动化研究过程的核心识别为自动提出好的问题。直接提示语言模型提问效果不佳。为了提高问题的深度和广度,STORM 采用两种策略:
视角引导式提问:给定输入主题,STORM 通过调查类似主题的现有文章来发现不同的视角,并使用它们来控制提问过程。
模拟对话:STORM 模拟了维基百科作者与主题专家之间的对话,该对话基于互联网资源,以使语言模型能够更新其对主题的理解并提出后续问题。
STORM 自动化写作前阶段的概览。从给定主题开始,STORM 通过调查相关维基百科文章(1-2)来识别覆盖该主题的各种视角。
然后,它模拟一个维基百科作者与一个基于可信在线资源的专家之间的对话(3-6)。最终大纲基于LLM的内在知识和从不同视角收集的对话(7-8)进行编纂。

Co-STORM 提出了一种协作话语协议,该协议实现了一种轮次管理策略,以支持顺畅的协作。

Co-STORM LLM 专家:此类代理基于外部知识源生成答案,或根据话语历史提出后续问题。

主持人:此代理生成由检索器发现的信息启发且在之前的回合中未直接使用的问题,这些问题具有启发性!问题生成也可以是基于事实的!

人类用户:人类用户将主动采取以下行动之一:(1)观察对话以深入了解主题,或(2)通过插入话语来引导对话焦点。

Co-STORM 还维护一个动态更新的思维导图,将收集到的信息组织成层次化的概念结构,旨在在人类用户和系统之间建立一个共享的概念空间。思维导图已被证明有助于在对话变得漫长和深入时减轻心理负担。

不同学习与信息搜索范式的比较。Co-STORM 使人类能够观察并参与不同角色 LM 代理之间的协作对话。用户可以请求系统根据对话历史和收集到的信息生成一份完整的引用报告。通过生成直接响应来查询,有效解决已知未知问题,用户了解他们的信息需求。

然而,在复杂的信息搜索场景中使用这些系统(如学术研究、市场分析和决策制定)时仍存在差距,在这些场景中,系统应向用户展示他们未知的未知,以促进知识发现。虽然“未知的未知”这一概念最初指的是军事中的意外风险,但它与信息研究背景下的意外发现信息相关。

STORM 和 Co-STORM 都使用 dspy 以高度模块化的方式实现。

安装知识风暴库,请使用:

pip install knowledge-storm 
    克隆 Git 仓库。
    git clone https://github.com/stanford-oval/storm.gitcd storm
    安装所需的软件包。
    conda create -n storm python=3.11conda activate stormpip install -r requirements.txt
    STORM 知识库引擎被定义为简单的 Python STORMWikiRunner 类。以下是一个使用 You.com 搜索引擎和 OpenAI 模型的示例。
    import osfrom knowledge_storm import STORMWikiRunnerArguments, STORMWikiRunner, STORMWikiLMConfigsfrom knowledge_storm.lm import OpenAIModelfrom knowledge_storm.rm import YouRMlm_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)
    Co-STORM 知识库构建引擎被定义为简单的 Python CoStormRunner 类。以下是一个使用必应搜索引擎和 OpenAI 模型的示例。
    from knowledge_storm.collaborative_storm.engine import CollaborativeStormLMConfigs, RunnerArgument, CoStormRunnerfrom knowledge_storm.lm import OpenAIModelfrom knowledge_storm.logging_wrapper import LoggingWrapperfrom 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)
    Co-STORM 的信息搜索辅助系统,该系统模拟用户和多个 LM 代理之间的协作对话。通过创建一个用户可以观察和参与的交互式环境,Co-STORM 提升了学习和复杂信息搜索过程。Co-STORM 在揭示人类学习中的未知未知方面优于传统搜索引擎和 RAG 聊天机器人,并减少了用户的认知努力。
    参考资料:
    1. https://github.com/stanford-oval/storm?tab=readme-ov-file
    2. https://arxiv.org/pdf/2402.14207
    3. https://www.arxiv.org/pdf/2408.15232

    AI技术研习社
    专注分享人工智能、大模型、算法、大数据开发、数据分析领域的技术干货和落地实践!
     最新文章