Опенсорс
July 3

STORM: Как LLM от Стэнфорда автоматизирует ресёрч и пишет статьи за вас

Вот вам нужно погрузиться в новую сложную тему. Впереди часы гуглежа, десятки открытых вкладок, попытки отделить зёрна от плевел и собрать всё в единую картину. Процесс мучительный и не всегда продуктивный.

И вот, кажется, ребята из Стэнфорда решили эту проблему если не полностью, то хотя бы частично автоматизировать. Они выкатили опенсорсный проект STORM — систему на базе LLM, которая берёт на себя самую нудную часть работы: исследование темы и создание структурированного черновика статьи в стиле Википедии. Сразу с цитатами и ссылками на источники.

Конечно, это не волшебная кнопка «сделать зашибись». Сами авторы честно говорят, что на выходе получается не готовая к публикации работа, а скорее очень качественный и подробный репорт, который нужно дорабатывать.

Что это за STORM такой и как он работает?

На первый взгляд, идея не нова — обернуть LLM в поисковик. Но дьявол, как всегда, в деталях. Вместо того чтобы тупо промптить модель в стиле «расскажи мне о X», STORM подходит к задаче куда хитрее. Весь процесс делится на два этапа:

  1. Pre-writing (Исследование): Система проводит интернет-исследование, чтобы собрать материал и составить план статьи.
  2. Writing (Написание): На основе собранных данных и плана генерируется полноценная статья с цитатами.

Ключевая фишка — в первом этапе. Чтобы сделать исследование глубоким и разносторонним, STORM использует две стратегии:

  • Perspective-Guided Question Asking: Система сначала изучает похожие статьи, чтобы понять, с каких разных точек зрения (например, академической, индустриальной, исторической) можно взглянуть на тему. А потом использует эти «перспективы», чтобы генерировать вопросы.
  • Simulated Conversation: STORM имитирует диалог между автором статьи и экспертом по теме. Эксперт «опирается» на найденные в интернете источники. Это помогает LLM не просто вываливать факты, а углублять своё понимание темы и задавать уточняющие, релевантные вопросы по ходу дела.

По сути, STORM не просто ищет информацию, а пытается воссоздать мыслительный процесс исследователя: сначала определяет разные углы обзора, а потом ведёт внутренний диалог, чтобы разобраться в теме. Это и отличает его от простых «summarizer»-ов.

Co-STORM: А если я хочу влезть в процесс?

Понимая, что полная автоматизация не всегда гуд, разработчики добавили режим Co-STORM. Он позволяет человеку активно участвовать в процессе. В этой симуляции есть три типа агентов:

  1. LLM-эксперты: Отвечают на вопросы, опираясь на внешние источники.
  2. Модератор: Задаёт наводящие вопросы, чтобы дискуссия не затухала.
  3. Человек: Может либо просто наблюдать за процессом, либо в любой момент вмешаться, задать свой вопрос и направить исследование в нужное русло.

Для удобства вся собранная информация организуется в виде динамической ментальной карты (mind map), что должно снижать когнитивную нагрузку, когда исследование становится слишком глубоким.

Как это пощупать?

Проект доступен на GitHub и легко ставится через pip:

pip install knowledge-storm

Дальше всё довольно модульно. Можно настраивать разные LLM (под капотом litellm, так что поддерживается почти всё, включая OpenAI, Azure и др.) и разные поисковые движки (Bing, You.com, Google, DuckDuckGo и т.д.).

Вот упрощённый пример запуска из документации:

import os
from knowledge_storm import STORMWikiRunnerArguments, STORMWikiRunner, STORMWikiLMConfigs
from knowledge_storm.lm import LitellmModel
from knowledge_storm.rm import YouRM # Или BingSearch, GoogleSearch...

# 1. Настраиваем модели
lm_configs = STORMWikiLMConfigs()
# Для симуляции диалога можно взять модель попроще и побыстрее
gpt_35 = LitellmModel(model='gpt-3.5-turbo', ...) 
# А для генерации самой статьи — что-то помощнее
gpt_4o = LitellmModel(model='gpt-4o', ...)
lm_configs.set_conv_simulator_lm(gpt_35)
lm_configs.set_article_gen_lm(gpt_4o)
# ... и другие компоненты

# 2. Настраиваем поисковик (retriever)
rm = YouRM(ydc_api_key=os.getenv('YDC_API_KEY'))

# 3. Запускаем движок
engine_args = STORMWikiRunnerArguments(...)
runner = STORMWikiRunner(engine_args, lm_configs, rm)

runner.run(
    topic="Challenges in Python's Global Interpreter Lock (GIL)",
    do_research=True,
    do_generate_outline=True,
    do_generate_article=True,
    do_polish_article=True,
)

runner.summary()

Выглядит довольно гибко. Можно запускать только нужные этапы, подсовывать свои поисковики и модели, что для кастомных задач самое то.

А для тех, кто не хочет ничего ставить, есть демо-сайт.

Так это заменит исследователей и авторов?

Конечно, нет. И заявления типа "STORM writes research papers like a PhD" — это классический пример заигрывания с мечтами людей, которые хотят волшебную таблетку.

STORM — это инструмент. Примерно как продвинутый IDE для программиста. Он не напишет за вас весь проект, но избавит от рутины, подсветит ошибки и ускорит работу. Здесь то же самое: STORM берёт на себя самую муторную часть — первоначальный сбор и структурирование информации.

Ценность ведь не в самом сгенерированном тексте (контенте), который и так можно надергать из сети. Ценность в том, чтобы на основе этого черновика сделать выводы, добавить собственную экспертизу и создать что-то действительно новое. А на это пока способны только человеки 🧠