斯坦福推STORM:智能RAG实现复杂研究目标

旅行   2024-11-03 13:00   北京  

斯坦福大学最新推出的AI研究系统STORM,让「提问-回答」式RAG黯然失色!

这个名为STORM(Synthesis of Topic Outlines through Retrieval and Multi-perspective Question Asking)的系统,不仅支持复杂研究任务,还能生成维基百科风格的文章

更厉害的是,它还通过了10位资深维基百科编辑的考验!

STORM:AI研究的新范式

STORM与传统的RAG(检索增强生成)系统有何不同?它采用了一种巧妙的方法:通过模拟多视角对话来达成研究目标

具体来说,STORM会:

  1. 使用LLM代理模拟「视角引导对话」

  2. 扩展「大纲驱动RAG」以生成更丰富的文章内容

这种方法不仅能处理复杂的多步骤长上下文研究任务,还能生成高质量的研究文章。

维基百科编辑都说好

STORM的表现如何?史丹福大学找来了10位经验丰富的维基百科编辑进行评测。

结果显示:

  • 70%的编辑认为STORM在写作前期的研究阶段非常有用

  • 在与传统文章生成方法的对比中,STORM在多个指标上都表现出色

这些结果表明,STORM不仅能协助研究,还能生成高质量的初稿,为人类编辑提供有力支持。

开源且支持本地文档

STORM的另一大亮点是它的开放性:

  • 开源:代码已在GitHub上公开

  • 支持多种实现:包括Python包和基于LangGraph的实现

  • 灵活的数据源:不仅支持网络搜索,还能对接本地文档库

这意味着研究人员和开发者可以根据自己的需求定制STORM,甚至将其应用于专有数据集。

仓库地址:

https://github.com/stanford-oval/storm/tree/main

实际应用:FEMA灾害应对文档分析

为了测试STORM的实际效果,研究人员使用了34份来自美国联邦应急管理局(FEMA)的灾害准备和应对文档。

def  parse_pdfs ():     """    解析指定目录中的所有 PDF 文件并加载其内容。
此函数遍历 PDF_DIR 指定的目录中的所有文件, 检查它们是否具有 .pdf 扩展名,并使用 PyPDFLoader 加载其内容。 每个 PDF 的加载内容都附加到列表中,然后返回该列表。
返回: 列表:包含所有已加载 PDF 文档内容的列表。 """ docs = [] pdfs = os.listdir(PDF_DIR) print ( f"我们有{ len (pdfs)} 个pdfs" ) for pdf_file in pdfs: if not pdf_file.endswith( ".pdf" ): continue print ( f"正在加载 PDF:{pdf_file} " ) file_path = f" {PDF_DIR} / {pdf_file} " loader = PyPDFLoader(file_path) docs = docs + loader.load() print ( f"已加载{ len (docs)}文档”)
返回文档

docs = parse_pdfs()
text_splitter = RecursiveCharacterTextSplitter(chunk_size = 1000,chunk_overlap = 200)chunks = text_splitter.split_documents(docs)

他们提出了一个具有挑战性的问题:

比较不同类型灾害的财务影响及其对社区的影响

def  summary_text ( text, prompt ):     """    根据用户的提示生成一些文本的摘要
参数:
text (str) - 要分析的文本 prompt (str) - 关于如何总结文本的提示说明,例如“生成标题”
返回:
summary (text) - LLM 生成的摘要
""" messages = [ ( "system" , "您是一位助手,可以非常简短地用一句话描述文本。" , ), ( "human" , f" {prompt} :: \n\n {text} " ), ] ai_msg = llm.invoke(messages) summary = ai_msg.content return summary

def enrich_metadata ( docs ): """ 使用 LLM 填充文本块的“标题”和“说明” 参数

docs (list) - LangChain 文档列表
返回:
docs (list) - 填充了元数据字段的 LangChain 文档列表
""" new_docs = [] for doc in docs:
# pdf 名称是 doc.metadata['source'] 的最后一部分 pdf_name = doc.metadata[ "source" ].split( "/" )[- 1 ]
# 在 df 中查找 pdf_name 位于 URL 中的行 row = df[df[ "Document" ]. str .contains(pdf_name)] page = doc.metadata[ "page" ] + 1 url = f" {row[ 'Document' ].values[ 0 ]} ?id= { str (uuid4())} #page= {page} "
# 我们将使用 LLM 生成文本的摘要和标题,由 STORM 使用 # 这仅用于演示,正确的应用程序应该有更好的元数据 summary = summary_text(doc.page_content, prompt= "请描述此文本:" ) title = summary_text( doc.page_content, prompt= "请为此文本生成一个 5 字的标题:" )
doc.metadata[ "description" ] = summary doc.元数据[ “标题” ] = 标题 doc.元数据 [ “网址” ] =网址 doc .元数据[ “内容”] = doc.page_content
# print(json.dumps(doc.metadata, indent=2)) new_docs.append(doc)
print ( f"有{ len (docs)}个文档" )
return new_docs

docs = enrich_metadata(docs) chunks = enrich_metadata(chunks)

这个问题不仅复杂,而且在给定的文档中并没有直接的答案。STORM需要综合分析多个文档,提取相关信息,并生成一个全面的报告。

结果,STORM成功生成了一篇结构清晰、引用准确的研究文章。这充分展示了STORM在处理复杂研究任务时的强大能力。

STORM的未来

虽然STORM表现出色,但研究人员也坦言它还有改进空间:

  • 目前还不支持多模态输入

  • 生成的内容质量虽好,但还不及经验丰富的人类水平

  • 在引用处理上还存在一些细节问题

尽管如此,STORM 已然为AI辅助研究开辟了新的道路。它不仅能协助学术研究,还可能在商业分析、政策制定等领域发挥重要作用。

AI辅助研究的未来,或许就是STORM这样的系统。

👇

👇

👇

👇

本文同步自知识星球《AGI Hunt》

星球实时采集和监控推特、油管、discord、电报等平台的热点AI 内容,并基于数个资讯处理的 AI agent 挑选、审核、翻译、总结到星球中。

  • 每天约监控6000 条消息,可节省约800+ 小时的阅读成本;

  • 每天挖掘出10+ 热门的/新的 github 开源 AI 项目;

  • 每天转译、点评 10+ 热门 arxiv AI 前沿论文。

星球非免费。定价99元/年,0.27元/天。(每+100人,+20元。元老福利~)

  • 一是运行有成本,我希望它能自我闭环,这样才能长期稳定运转;

  • 二是对人的挑选,鱼龙混杂不是我想要的,希望找到关注和热爱 AI 的人。

欢迎你的加入!

AGI Hunt
关注AGI 的沿途风景!
 最新文章