Самохостинг Sentiment и Emotion для DiscourseAI

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

Discourse AI поддерживает два типа классификации, для каждого из которых требуется своя модель:

  • Тональность — классифицирует сообщения как позитивные, негативные или нейтральные (с использованием cardiffnlp/twitter-roberta-base-sentiment-latest)
  • Эмоции — классифицирует сообщения по 28 меткам эмоций, таким как радость, гнев, удивление и т. д. (с использованием SamLowe/roberta-base-go_emotions)

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

Запуск с использованием HuggingFace TEI

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

Модель тональности

mkdir -p /opt/tei-sentiment-cache
docker run --rm --gpus all --shm-size 1g -p 8081:80 \
  -v /opt/tei-sentiment-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id cardiffnlp/twitter-roberta-base-sentiment-latest \
  --revision refs/pr/30

Это должно запустить локальный экземпляр cardiffnlp/twitter-roberta-base-sentiment-latest — открытой модели, способной классифицировать сообщения на позитивные/негативные/нейтральные.

Вы можете проверить, работает ли она, выполнив:

curl http://localhost:8081/ \
    -X POST \
    -H 'Content-Type: application/json' \
    -d "{ \"inputs\": \"I am happy\" }"

При нормальной работе должен быть возвращен массив значений уверенности для каждой метки.

Модель эмоций

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

mkdir -p /opt/tei-emotion-cache
docker run --rm --gpus all --shm-size 1g -p 8082:80 \
  -v /opt/tei-emotion-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id SamLowe/roberta-base-go_emotions

Поддерживаемые модели

Доступность для вашего экземпляра Discourse

В большинстве случаев вы будете запускать это на выделенном сервере из-за ускорения работы GPU. В таком случае рекомендуется использовать обратный прокси-сервер, завершать TLS-соединения и защищать конечную точку так, чтобы к ней мог подключаться только ваш экземпляр Discourse.

Настройка Discourse AI

Discourse AI включает настройки сайта для конфигурации сервера вывода для моделей с открытым исходным кодом. Укажите адрес вашего сервера с помощью настройки ai_sentiment_model_configs.

Эта настройка принимает JSON-массив конфигураций моделей. Каждая запись требует:

Поле Описание
model_name Идентификатор модели HuggingFace (например, cardiffnlp/twitter-roberta-base-sentiment-latest)
endpoint URL-адрес вашего экземпляра TEI (например, https://your-server:8081)
api_key API-ключ для конечной точки (можно оставить пустым, если не требуется)

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

  • Запись 1: model_name cardiffnlp/twitter-roberta-base-sentiment-latest, endpoint https://your-server:8081
  • Запись 2: model_name SamLowe/roberta-base-go_emotions, endpoint https://your-server:8082

После этого включите классификацию, переключив ai_sentiment_enabled.

3 лайка

Планируется ли поддержка других моделей на языках, отличных от английского?

1 лайк

@Falco, если кто-то решит запускать это на том же сервере, где работает Discourse (например, у нас очень маленькая развёрнутая система с несколькими тысячами сообщений), могли бы вы обновить инструкции, чтобы описать:

  1. Как Discourse может интегрироваться с локальным экземпляром контейнерного образа HuggingFace TEI.
  2. Предложения по дополнительному объёму оперативной памяти и дискового пространства, необходимому для запуска вышеуказанного (например, если базовый Discourse работает на 2 ГБ ОЗУ и 20 ГБ дискового пространства).

Итак, я настроил новый самописный экземпляр Discourse и пытаюсь настроить анализ тональности. Вот моя конфигурация ai_sentiment_model_configs:

Ключ Значение
model name cardiffnlp/twitter-roberta-base-sentiment-latest
endpoint https://my_own_instance
api_key [пусто]

Это работает, отчасти: я получаю столбчатую диаграмму тональности.

Однако таблица «Эмоции» пуста. Эта документация выглядит неполной или сформулирована так, что мне трудно понять, что именно нужно сделать.

Мне нужно запустить ещё один контейнер Docker с другим идентификатором модели (roberta-base-go_emotions?) или что-то ещё? Что мне нужно сделать, чтобы заполнить таблицу эмоций?

Предпочёл бы, по возможности, самостоятельно разместить эти сервисы. Заранее спасибо, если кто-то сможет подсказать правильное направление.

Для работы с эмоциями вам также нужно запустить

.

3 лайка

Спасибо. Я просто запустил второй контейнер Docker с некоторыми изменениями, например:

mkdir -p /opt/tei-cache2
docker run --detach --rm --gpus all --shm-size 1g -p 8082:80 \
  -v /opt/tei-cache2:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id SamLowe/roberta-base-go_emotions

и добавил новую запись в ai_sentiment_model_configs. Теперь всё работает. Спасибо. :slight_smile:

1 лайк

Натыкаюсь лбом на кирпичную стену непонимания того, что именно я делаю, пытаясь заставить это работать на экземпляре EC2 без GPU. По крайней мере, в пределах моих крайне ограниченных способностей и понимания, попытка сделать это на экземпляре только с процессором означает гораздо больше работы по настройке, чем я могу осмыслить. Версии cpu образа ghcr.io/huggingface/text-embeddings-inference отказываются загружать ни одну из двух перечисленных моделей; Claude и GPT5 говорят мне, что мне нужно преобразовать их в модели ONNX с помощью набора инструментов на Python, и именно здесь я сдался.

(Также вполне возможно, что я просто туплю и упускаю какой-то очевидный шаг!)

Одно из наших планов — позволить LLM выполнять анализ тональности.

Таким образом, вы сможете подключить недорогую модель, например Gemini Flash 2.5 (или даже nano), и использовать её для анализа тональности.

6 лайков

Мы пытаемся использовать эту функцию с Azure AI Language (из нашего самохостингового экземпляра Discourse), поскольку уже используем нашу подписку Azure для интеграции GPT-4.5 с Discourse (для функций суммирования и чат-бота):

— однако в панели мониторинга настроенных данных ничего не отображается, а в логах мы видим следующие ошибки:

Discourse AI: Ошибки при массовой классификации: Не удалось классифицировать 208 сообщений (примеры ID: 2256, 909, 2270, 2260, 2797) : JSON::ParserError : Пустая строка не является допустимой строкой JSON.

Трассировка показывает, что Discourse, возможно, пытается использовать HuggingFace. Являются ли это единственными поддерживаемыми на данный момент моделями?

Спасибо,

N

Да, у нас есть очень специфичная реализация, и мы думаем, как сделать её более универсальной.

Я оптимистично настроен в отношении того, чтобы LLM возвращали структурированный вывод для анализа тональности, так как это открывает множество возможностей. Мне кажется, что в качестве тренда «гиперспецифичные» API заменяются на «гиперуниверсальные» API, которые предоставляют LLM.

3 лайка

Существует ли простой способ запустить это на самостоятельно размещённом WordPress без необходимости разворачивать собственный экземпляр для классификации тональности?

Спасибо, Сэм — это было бы отлично. Тем временем мы изучим возможность запуска одной из поддерживаемых моделей HuggingFace на виртуальной машине Azure…

Я пытаюсь настроить локальную модель анализа тональности, но при запуске Docker-образа получаю ошибки:

0: ошибка запроса: ошибка клиента HTTP (404 Not Found) для URL (https://huggingface.co/cardiffnlp/twitter-roberta-base-sentiment-latest/resolve/main/tokenizer.json)
1: ошибка клиента HTTP (404 Not Found) для URL (https://huggingface.co/cardiffnlp/twitter-roberta-base-sentiment-latest/resolve/main/tokenizer.json)

Я использую следующую команду: docker run --rm --shm-size 1g -p 8083:80 -v /opt/tei-sentiment-cache:/data ghcr.io/huggingface/text-embeddings-inference:cpu-1.9 --model-id cardiffnlp/twitter-roberta-base-sentiment-latest

Неужели это не поддерживается без GPU, или что-то изменилось в настройке?

Похоже, они ещё не приняли мой PR к модели, поэтому вам нужно указывать напрямую на мою ветку. Я обновил команду Docker для модели анализа тональности выше — попробуйте запустить её с дополнительной строкой, указывающей на ветку.

2 лайка

Спасибо, похоже, это сработало!

1 лайк