斯坦福大学最新推出的AI研究系统STORM,让「提问-回答」式RAG黯然失色!
这个名为STORM(Synthesis of Topic Outlines through Retrieval and Multi-perspective Question Asking)的系统,不仅支持复杂研究任务,还能生成维基百科风格的文章。
更厉害的是,它还通过了10位资深维基百科编辑的考验!
STORM:AI研究的新范式
STORM与传统的RAG(检索增强生成)系统有何不同?它采用了一种巧妙的方法:通过模拟多视角对话来达成研究目标。
具体来说,STORM会:
使用LLM代理模拟「视角引导对话」
扩展「大纲驱动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 的人。
欢迎你的加入!