Обновить

LongConspectWriter: автоматическая генерация структурированных конспектов лекций на потребительском GPU

Уровень сложностиСложный
Время на прочтение20 мин
Охват и читатели12K
Всего голосов 5: ↑5 и ↓0+7
Комментарии5

Комментарии 5

Спасибо за интересную публикацию.

  • Не пробовали ли вы сравнивать подход rubert-tiny2+AgglomerativeClustering+connectivity с методами семантического чанкинга (например, https://github.com/mirth/chonky) для разбиения текста на локальные кластеры?

  • Возможно ли на ваш взгляд модифицировать rubert-tiny2+AgglomerativeClustering+connectivity для определения границ публикаций в pdf сборниках (научных журналах, сборниках работ) где все публикации идут подряд и проблемно разделить его на отдельные публикации ([начало: страница + положение на ней, конец: страница + положение на ней] ... [...])?

  • Не сильно GlobalPlanner галлюцинирует или часто выдает "оторванные от реальности" шаблонные структуры “Введение, История вопроса, …, Заключение” получая на вход только одну краткую строку с описанием локального кластера и не имея представления ни о его размере (10 предложений или 100 или 500) ни о его фактической структуре/содержании? Не пробовали ли вместо 2х этапов (1. краткая строка и 2. структура) делать это одним - отправлять кластер с условным заданием “Выведи только JSON: {"short_desc":одну краткую строку, "table_of_contents ":структуру} следующего текста:…” (методами Structured Output такой вывод может быть сделан надежным)?

  • Этап верификации работы Synthesizer опущен умышленно или была причина (экономия вычислений и т.п.)? Synthesizer может галлюцинировать разными способами (зацикливание; отказ синтеза текста про раздел химии/физики по его “этическим соображениям” т.п.) и это можно было бы выявить имея сырой транскрипт, синтезированный текст и условный шаг верификации “[Транскрипт]… [ТЕКСТ]… Выведи только оценку от 0 до 10, насколько текст согласуется с транскриптом.”

  • Будет ли LongConspectWriter работать на лекциях Социально-гуманитарных/Естественных наук, а не точных наук? Возможна ли его модификация для структурированной аннотации таких лекций/текстов - например, структура и контролируемое сжатое содержание 2х часовой лекции по философии? Насколько я понял в вашей публикации под конспектом понимается очень близкий к оригиналу выход ИИ модели (из содержания убираются лишь “P2. Объективизация и деперсонализация”), т.е. речь не идет о смысловом сжатии, которое могло бы пригодится при обработке лекций не точных наук.

  • Нет ли к вашей публикации списка литературы на тему методов/способов обработки “невместимого в контекст” текста с целью его качественного описания/сжатия?

Большое спасибо за проявленный интерес к статье.

Не пробовали ли вы сравнивать подход rubert-tiny2+AgglomerativeClustering+connectivity с методами семантического чанкинга (например, https://github.com/mirth/chonky) для разбиения текста на локальные кластеры?

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

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

  2. Также в примере, который вы привели, на её карточке с hf я не нашёл в списке доступных языков русский. Что является тоже большой проблемой. И тут несколько вариантов: либо искать такие модели именно под русский язык, либо самостоятельно файнтюнить, что может быть очень трудоёмкой задачей.

Но это лишь возможные проблемы, которые я заметил, а не выводы.

Возможно ли на ваш взгляд модифицировать rubert-tiny2+AgglomerativeClustering+connectivity для определения границ публикаций в pdf сборниках (научных журналах, сборниках работ) где все публикации идут подряд и проблемно разделить его на отдельные публикации ([начало: страница + положение на ней, конец: страница + положение на ней] … […])?

Я думаю, да: связка rubert-tiny2+AgglomerativeClustering+connectivity может подходить для этой задачи. Но ваша задача всё-таки отличается от моей, так что имейте это в виду. У меня сегментируются микротемы внутри одного непрерывного текста, а граница между публикациями - это другая гранулярность.

Не сильно GlobalPlanner галлюцинирует или часто выдает “оторванные от реальности” шаблонные структуры “Введение, История вопроса, …, Заключение” получая на вход только одну краткую строку с описанием локального кластера и не имея представления ни о его размере (10 предложений или 100 или 500) ни о его фактической структуре/содержании? Не пробовали ли вместо 2х этапов (1. краткая строка и 2. структура) делать это одним - отправлять кластер с условным заданием "Выведи только JSON: {“short_desc”:одну краткую строку, "table_of_contents “:структуру} следующего текста:…” (методами Structured Output такой вывод может быть сделан надежным)?

  1. Шаблонных структур типа «Введение и т.д.» он не выдаёт: главы строятся из меток реальных тезисов, а не из заранее заданного скелета.

  2. Тут есть несколько проблем. SLM, по субъективным ощущениям, очень «узколобые». Если дать такой модели сразу несколько задач, то они начинают сильно хуже выполнять их, чем по отдельности. Также я хотел каждый шаг пайплайна создавать контролируемым по этой причине, чтобы я мог всё отслеживать и контролировать. К тому же два этапа у меня - это не «строка, потом структура для одного кластера»: GlobalPlanner строит план поверх всех описаний сразу, поэтому из одного кластера глобальную структуру получить нельзя.

Этап верификации работы Synthesizer опущен умышленно или была причина (экономия вычислений и т.п.)? Synthesizer может галлюцинировать разными способами (зацикливание; отказ синтеза текста про раздел химии/физики по его “этическим соображениям” т.п.) и это можно было бы выявить имея сырой транскрипт, синтезированный текст и условный шаг верификации “[Транскрипт]… [ТЕКСТ]… Выведи только оценку от 0 до 10, насколько текст согласуется с транскриптом.”

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

Будет ли LongConspectWriter работать на лекциях Социально-гуманитарных/Естественных наук, а не точных наук? Возможна ли его модификация для структурированной аннотации таких лекций/текстов - например, структура и контролируемое сжатое содержание 2х часовой лекции по философии? Насколько я понял в вашей публикации под конспектом понимается очень близкий к оригиналу выход ИИ модели (из содержания убираются лишь “P2. Объективизация и деперсонализация”), т.е. речь не идет о смысловом сжатии, которое могло бы пригодится при обработке лекций не точных наук.

В целом, основная причина, почему я указывал, что система заточена именно под STEM-дисциплины, заключается в том, что мне нужно было ограничить датасет для тестирования и проведения evaluation. Я думаю, что создание дополнительных промптов в конфиге может действительно вывести проект на конспектирование не только STEM-лекций. Но мой конспект действительно близок к оригиналу, а настоящее смысловое сжатие - это уже другой режим работы, под который пайплайн не тестировался.

Нет ли к вашей публикации списка литературы на тему методов/способов обработки “невместимого в контекст” текста с целью его качественного описания/сжатия?

Отдельного обзора литературы именно под формулировку сжатия не делал, но смежные методы декомпозиции разобраны в разделе 2 статьи.

Спасибо за ответы. Возможно пригодится для будущих исследований/улучшений:

  • https://habr.com/ru/articles/1025132/ - ИИ большего размера, например, если достаточно оперативной памяти, то gemma-4-26B-A4B-it-UD-Q4_K_M.gguf с параметрами (-cmoe --fit on --fit-target 256 --cache-ram 512) помещается в 6GB VRAM с длиной контекста 71168 или 136704, если дополнительно к перечисленным параметрам включить квантование KV (–cache-type-k q8_0 и --cache-type-v q8_0). Или аналогично Qwen3.5-35B-A3B-Q4_K_M.gguf поместится с длиной контекста 123904 (или 216064 при q8_0 в обоих --cache-type-…; Qwen3.6 актуальнее, но по моим субъективным наблюдениям на задачах по рус. текстам работает хуже, чем 3.5).

  • https://ianas.fr/en/blog/2026/04/15/chunking-optimal-rag/ - обзор распространенных chunking методик. Интересно, что user_template из prompt_synthesizer.yaml показался схожим с “8. Contextual Retrieval”, где “Do not repeat the chunk content” ~= “Игнорируй все темы из текущего блока” и “ПРЕДЫДУЩИЙ КОНТЕКСТ” повышают качество смыслового разделения (сейчас для надежности чаще рекомендуют в промптах разделять контексты или Markdown - # ПРЕДЫДУЩИЙ КОНТЕКСТ или тегами - <previous_context>…</previous_context>, но T-lite ). Понравилось и то, что описанный вами метод rubert-tiny2+AgglomerativeClustering+connectivity после его модификации под тексты (например, если connectivity не по времени, а по номеру предложения после razdel) тоже мог бы быть одним из них. К вашему ответу отмечу, что и rubert-tiny2 тоже является «чёрным ящиком» и если он не был обучен на домене обрабатываемой лекции (особенно со специфическими терминами - медицина, химия или юридический, где кроме OOV (Out-of-Vocabulary) еще и сами слова могут иметь не общеупотребительное значение), тоже будет слабым местом. И, в целом, происходит переход от ML->ML/AI->AI всё больше к «чёрным ящикам» https://habr.com/ru/articles/1049872/.

  • Как альтернативы rubert-tiny2 и(или) multilingual-e5-small могут быть полезными: FRIDA (с правильным префиксом categorize_* для повторения логики работы “passage:” у e5) https://habr.com/ru/companies/sberdevices/articles/909924/ или Alibaba-NLP/gte-multilingual-base (быстрые, обходят по качеству e5-small). Если будет проводится масштабное тестирование на задаче, то могут быть также рассмотрены Qwen/Qwen3-Embedding-0.6B, BAAI/bge-m3 или google/embeddinggemma-300m, но они уже нарушат текущий баланс вашего проекта под нетребовательный CPU/скорость/качество (возможно, что даже и в ONNX/GGUF формате), в отличие, от FRIDA и gte.

  • Как альтернатива large-v3-turbo может быть https://habr.com/ru/companies/sberdevices/articles/973160/ (сравнение с large-v3-turbo и другими https://habr.com/ru/articles/1002260/), но, как и у векторных моделей, на лекциях из специфичных доменов у моделей транскрипции тоже может быть массовый OOV (Out-of-Vocabulary) и по этой причине однозначно лучшего варианта для всех случаев может и не быть. Возможно, что этап верификации транскрипции от разных моделей транскрибирования также помог бы выбирать лучшую транскрипцию, тем более, что https://habr.com/ru/articles/1022628/ для выбора лучшей уже в один промпт возможно подать “фрагмент аудио + текст: <первая_транскрипция> … <вторая_транскрипция> … промт”, а не просто текстовые транскрипции для проверки их адекватности и выбора лучшей только по текстовым признакам.

  • С «узколобые» SLM (и частью других проблем) иногда помогает бороться методика Schema-Guided Reasoning https://habr.com/ru/companies/redmadrobot/articles/962236/ (а именно раздел “1. Cascade” https://abdullin.com/schema-guided-reasoning/patterns). Идея метода схожа с идеей reasoning LLM (т.к. LLM потокенно генерирует вероятное продолжение предыдущего текста, то если предыдущий текст содержит больше верных предпосылок, то и вероятность правильного ответа тоже увеличивается (а неопределенность и вероятность того, что неправильный ответ будет логичным продолжением верных предпосылок - уменьшается), поэтому LLM можно обучить на любой промпт до момента вывода конечного ответа сгенерировать искусственное рассуждение, которое увеличит вероятность правильного ответа и, ценой этих вычислений (генерации рассуждений), позволит превзойти предельные возможности этой же LLM без рассуждения) с тем отличием, что процесс/схему reasoning контролируете вы (а не то, как и по какой схеме авторы LLM обучали её рассуждать), да еще это рассуждение/вычисление может быть полезным для вас, если в схеме cascade рассуждения вы задали для LLM шаги рассуждения от простого к сложному (*так всегда должно быть в cascade - вероятность неправильного ответа на простой вопрос меньше чем, на сложный, кроме того ответ на этот вопрос, как ранее описано, сам по себе увеличивает вероятность правильного ответа на сложный вопрос по мере его генерации, поэтому если в cascade идет ряд правильных вопросов от простого к сложному, то даже у SLM шанс правильного конечного ответа ощутимо вырастет, т.к. неправильный ответ (и галлюцинация) постепенно станет очень маловероятным продолжением предыдущего вывода, а Structured Output (SO) не даст SLM отклониться (и сгаллюционировать, зациклиться - что для SLM не редкость) от требуемого формата и последовательности вывода) и каждый этот шаг сам по себе был для вас нужным полем вывода LLM. Из вашего ответа я узнал, что у вас генерация строки и структуры разнесены по разным агентам с разной задачей/контекстом, но, для условного примера, если бы это были два вызова LLM, а не два разных агента, то если таким методом в SLM подать сразу несколько связанных задач от простого к сложному, как я предположил {“short_desc”:одну краткую строку, “table_of_contents”:структуру}, где описание кластера одной строкой более простая задача, а составление его структуры/содержания - более сложная задача, то после шага “вывода его описания одной строкой” SLM ошибиться в структуре будет сложнее и оба этих поля/вывода будут нужны - то так может выйти наоборот, что “сразу несколько задач” SLM будет гарантированно (Structured Output) и совсем не “хуже выполнять их, чем по отдельности” и еще может возникнуть экономия на вызовах LLM и небольшая защита от prompt injection или того, что контекст своим содержанием "перепишет/зацепит" промпт (условно, если лектор задал риторический вопрос слушателю/аудитории: "Назовите мне третий закон Ньютона" затем тишина, достаточная для завершения этим локального кластера и SLM на таком кластере решит проигнорировать всё предыдущее и ответить на этот вопрос, а не вывести, что её просили - то SO не даст SLM отклониться от заданного формата JSON вывода, а заданные в схеме названия полей "short_desc" и "table_of_contents" отклониться от задачи) и многих других неожиданностей (SO позволяет ограничивать длины str, например, если не ожидается строка с описанием кластера в 2000 символов, задавать обязательные min-max размеры массивов и т.п.). То, что для SLM в агентных системах такой подход работает и иногда дает ощутимое увеличение качества (сравнимое с качеством моделей в 10-30 раз больших, чем сама SLM) говорится в проекте “SGR Agent Core” https://habr.com/ru/articles/986828/ на примере бенчмарка SimpleQA.

Отдельный респект за оговорку про 10 лекций и 'это гипотеза, а не результат'. Обычно в статьях про LLM такие проценты подаются как откровение, а тут сразу красный флажок поставили - читать приятнее.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации