Резюмирование тем с помощью LLM (GPT, BERT, ...)?

Уважаемая команда Discourse,

Discourse умеет подводить итоги длинных тем. Насколько я понимаю, для этого используются метрики вовлечённости, такие как реакции или количество ответов, чтобы определить, какие посты стоит сохранить. В моём сообществе (внутренняя коммуникация в компании) эта функция почти никогда не срабатывает, даже если тема занимает 20 страниц (количество ответов не самый подходящий триггер для нас).

Более мощным подходом было бы использование LLM, таких как GPT-3 или BERT, для подведения итогов всей темы по запросу (вместо простой фильтрации постов). Резюмирование — это тот случай, где LLM действительно сияют (почти эталонный пример), и я считаю, что это было бы гораздо эффективнее текущего подхода, основанного на слабых сигналах (в некоторых сообществах люди могут не использовать реакции или не отвечать на конкретные посты).

С другой стороны, запуск GPT для подведения итогов текста может быть дорогостоящим, до 0,02 доллара за 1 тыс. токенов. Эта функция, вероятно, имела бы больше смысла в некоторых частных сообществах, чем в высоконагруженных публичных.

Представляю себе работу функции следующим образом:

  • при первом чтении длинной темы (длина определяется настройкой), которая ещё не была подведена итог, предложить подвести её итоги по запросу.
  • итог будет вставлен в тему (например, всё, что было до него, будет суммировано).
  • ссылка на него будет размещена в верхней части темы (например, «перейти к итогу»).
  • в идеале должен быть механизм обратной связи с реакциями :+1: и :-1:.
  • после N новых ответов предлагать опубликовать новый итог и обновить ссылку вверху.
  • плагин будет настраиваться с использованием ключа OpenAI (предполагая, что используется именно эта LLM). В конечном счёте, если функция окажется успешной, можно будет предоставить доступ к разным моделям.

По крайней мере, такова теория :slight_smile:. На практике есть неизвестные моменты: насколько качественным будет итог и как настроить степень сжатия. Мое интуитивное ощущение: для некоторых сообществ это может дать чрезвычайно высокую отдачу. Самая частая проблема, о которой я слышу, — людям не нравится догонять ход обсуждения в темах. Это могло бы стать огромной помощью.

Что вы думаете?

8 лайков

Наша команда ИИ определённо исследует это направление. Резюмирование — одна из наиболее интересных возможностей.

Мы ответим здесь, как только у нас появятся результаты.

8 лайков

Кстати:

import openai
import requests
from bs4 import BeautifulSoup

openai.api_key = "KEY"

url = "https://meta.discourse.org/t/summarising-topics-with-an-llm-gpt-bert/254951.json"

response = requests.get(url)
data = response.json()

messages = []
messages.append("Заголовок: " + data["title"])
for post in data['post_stream']['posts']:
    soup = BeautifulSoup(post['cooked'], 'html.parser')
    messages.append("Сообщение #" + str(post["post_number"]) + " от " + post["username"])
    messages.append(soup.get_text())

text_blob = "\n".join(messages)

print(text_blob)

max_chunk_len = 4000  # Максимальная длина каждого фрагмента

chunks = [text_blob[i:i+max_chunk_len] for i in range(0, len(text_blob), max_chunk_len)]

summaries = []
for chunk in chunks:
    print("обработка фрагмента")
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt="запрос:\n" + chunk + "\nрезюме:",
        temperature=0.7,
        max_tokens=200,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0
    )
    summary = response.choices[0].text.strip()
    print("\nРЕЗЮМЕ")
    print(summary)
    print("\nРЕЗЮМЕ")

Discourse изучает возможность использования большой языковой модели (LLM), такой как GPT-3 или BERT, для суммирования длинных тем по запросу. Эта функция будет настраиваться с использованием ключа openai и может оказаться особенно полезной для частных сообществ. Суммаризация будет вставляться в тему, со ссылкой вверху и механизмом обратной связи. Команда AI в настоящее время изучает эту возможность и обновит информацию, когда будет что показать.

Это интересно, но довольно неравномерно

9 лайков

Ну что ж, я сегодня не удержался и попробовал:

Это очень экспериментальная версия, и на данный момент есть очень мало мер предосторожности на случай сбоев, так что для профессионального использования она точно не подходит (!!)

Обратите внимание: из-за ограничений по токенам система сейчас учитывает только первые ~40 постов (на основе активности одного из моих форумов).

Есть система дизлайков. Предпросмотр интерфейса:

(кстати, этот пример основан на довольно случайных данных из тестовых фикстур для разработки; на реальных данных он работает гораздо лучше).

Кстати, на создание этого я пока «потратил» $0,33 на вызовы :smiley:

($18 — это бесплатное выделение).

8 лайков

@Julienlavigne Я внес значительные улучшения в стабильность, гибкость и административную обратную связь.

Теперь ошибки, возвращаемые моделью, логируются, например, чтобы вы могли легко определить, превысили ли вы лимиты модели.

Если вы (или кто-либо еще) захотите попробовать, я, возможно, смогу некоторое время оказывать небольшую неформальную поддержку и, при необходимости, учитывать полученные отзывы.

Полный набор настроек теперь выглядит так:

5 лайков

@merefield Звучит потрясающе!

К сожалению, я использую бизнес-версию Discourse и не могу развернуть пользовательские плагины, поэтому не могу легко это протестировать. Однако я, возможно, попробую запустить Discourse локально с помощью резервной копии и поэкспериментировать с этим. Я буду держать вас в курсе.

3 лайка

@sam, есть ли какие-либо новости о прогрессе в этом направлении?

Мой плагин уже очень давно предоставляет эту функцию.

Позже CDCK выпустила плагин Discourse AI с похожим решением для суммаризации.

Всё в вашем распоряжении.

Спасибо, @merefield Robert, и да, я видел это. Спасибо за вашу работу в этом направлении. Однако я надеялся, что @sam (или кто-то из службы поддержки Discourse) работает над функцией суммирования на основе LLM с полной интеграцией в нативный Discourse. Очевидно, что если клиентам бизнес-плана Discourse просто нужно будет доплачивать за их собственные ключи OpenAI (или любого другого провайдера, который окажется актуальным), это будет гораздо проще с точки зрения настройки, совместимости и обслуживания. Всего наилучшего.

1 лайк

Я не могу говорить от имени CDCK, но суть в том, что, по моему мнению, многие сайты предпочитают сделать эту функцию опциональной, так как некоторые опасаются ИИ (в то время как другие хотят полностью принять его).

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

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

Я не могу комментировать вопросы биллинга или конфигурации аккаунта OpenAI.

Привет, Майк, мы недавно разблокировали AI-бота, см.:

Теперь эта функция доступна в вашей установке. Вы можете ввести учётные данные для Anthropic или OpenAI.

Что касается дорожной карты, следующим шагом мы планируем разблокировать «встраивание» (embedding), что позволит получать семантически связанные темы. Далее, вероятно, будут доступны AI-помощник и функция сводки.

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

Пользователи с самостоятельным размещением (self-hosters) и корпоративные клиенты уже могут пользоваться ими сегодня.


Создание сводок особенно интересно: мы покупаем несколько серверов A100, и они должны быть установлены в течение нескольких недель. Mistral удивительно эффективен и быстр. Как только мы увеличим мощности, возможно, сможем предоставлять функцию сводки даже пользователям бизнес-плана без использования собственных ключей (BYO keys). Однако сначала нам необходимо изучить характеристики производительности, прежде чем давать какие-либо обязательства.

4 лайка

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

1 лайк