Теперь вы можете включать большие объемы текста в свои AI-персоны!
Это дает несколько преимуществ:
-
Вы можете добавлять большие объемы текста в свои пользовательские AI-боты, которых нет в обучающих данных моделей (например, внутренние обучающие документы, внутренние отчеты).
-
Вы можете лучше обосновать персону конкретными данными (даже если они есть в обучающем наборе модели), что поможет модели правильно цитировать конкретную информацию и повысить качество результатов.
Чтобы добавить загрузки:
-
Создайте новую персону через интерфейс
/admin/plugins/discourse-ai/ai-personas/. -
Загрузите текстовые файлы, которые вы хотите включить в свою персону.
Перед загрузкой файлов добавьте соответствующие расширения (
.mdи.txt) в настройках сайтаauthorized extensions, чтобы они могли использоваться персоной.
- Настройте параметры индексации по своему усмотрению.
Предварительные требования
Для работы этой опции необходимо включить ai_embeddings_enabled и настроить модель ai_embeddings_model.
Discourse AI поддерживает огромное количество моделей эмбеддингов.
Наши размещенные клиенты получают бесплатный доступ к передовой модели bge-large-en.
Пользователи с самостоятельным размещением или те, кто хочет больше выбора, могут самостоятельно разместить модель эмбеддингов или использовать модели от OpenAI, Google (Gemini) и других.
Является ли это RAG?
Реализация нашей поддержки загрузки действительно основана на Retrieval-Augmented Generation (генерация с усилением извлечения).
На высоком уровне каждый раз, когда мы собираемся попросить LLM ответить на вопрос пользователя, мы ищем высоко релевантную информацию на основе введенного вами текста и внедряем её в системный промпт.
Объяснение различных параметров индексации
Что такое токен? Токены — это примитивы, используемые большими языковыми моделями для разделения текста. Отличное визуальное объяснение доступно по адресу: https://platform.openai.com/tokenizer
Реализация загрузки в Discourse AI включает следующие переключатели:
Upload Chunk Tokens (Токены чанка загрузки): после загрузки файлов они разбиваются на части. Это позволяет вам контролировать размер этих частей. Если часть слишком велика для вашей модели эмбеддингов, то эмбеддинг будет обрезан (будет обработана только часть токенов).
Upload Chunk Overlap Tokens (Токены перекрытия чанка загрузки): это количество токенов из предыдущего чанка, включаемых в текущий. Чем больше это число, тем больше дублирующейся информации будет сохранено в вашем индексе.
Search Conversation Chunks (Чанки поиска в диалоге): этот параметр контролирует количество «чанков» токенов, которые будут безусловно включены в промпт завершения на основе релевантности. Чем больше число, тем больше контекста будет предоставлено LLM (и тем дороже будут вызовы). Например: если это значение установлено на 10, а Upload Chunk Tokens — на 200, то каждое завершение будет иметь дополнительную нагрузку в 2000 токенов.
Как Discourse AI разбивает большие объемы текста?
Discourse использует рекурсивный разделитель текстов по символам (Recursive Character Text Splitter), который пытается сохранять вместе абзацы, затем строки и, наконец, слова при разделении.
Кроме того, Discourse предоставляет вам дополнительный контроль над тем, как будет разбиваться ваш текст.
Разделитель [[metadata ВАШИ МЕТАДАННЫЕ ЗДЕСЬ]] можно использовать для разделения больших объемов текста и правильного выделения того, что охватывает каждый раздел.
Например:
[[metadata о кошках]]
длинная история о кошках
[[metadata о собаках]]
длинная история о собаках
Это позволяет одному текстовому документу охватывать широкий спектр контента и защищает вас от «загрязнения чанков». Гарантируется, что в чанки о кошках будет включена только информация о кошках, а в чанки о собаках — только информация о собаках.
Звучит сложно, как мне это отладить?
Discourse AI поставляется с настройкой сайта ai bot debugging enabled groups. Пользователи в этой группе имеют доступ к отладке AI:
Экраны отладки AI помогут вам получить представление о том, какую информацию мы отправляем AI.
Мусор на входе — мусор на выходе Если вы предоставите LLM бесполезную или неясную информацию, она не сможет волшебным образом преобразовать её в полезную.
Этот экран поможет вам лучше решить, каким должен быть размер ваших чанков или включаете ли вы слишком много или слишком мало чанков.
Это вообще работает?
Реальный пример — разделение документации HAProxy и её загрузка в персону:
Системный промпт:
Вы — бот, специализирующийся на ответах на вопросы о HAProxy.
Вы живете на форуме Discourse и рендерите markdown Discourse.
При предоставлении ответов всегда старайтесь включать ссылки обратно на документацию HAProxy.
Например, вот как вы будете ссылаться на раздел 10.1.1. Имейте в виду, что вы можете ссылаться на раздел или на опцию внутри него.
[fcgi-app](https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#10.1.1-fcgi-app)Не скупитесь на ссылки, они очень полезны.
Содержимое загрузки:
processed-haproxy-2.txt (1.2 MB)
Которое было сгенерировано с помощью следующего скрипта:
file_content = File.read("configuration.txt")
title = nil
body = nil
last_line = nil
sections = []
file_content.each_line do |line|
if line.strip.match?(/^[-]+$/)
section_number, title = title.to_s.split(" ", 2)
sections << {
section_number: section_number,
title: title,
body: body.to_s.strip
}
title = last_line
body = nil
last_line = nil
else
body = body.to_s + last_line.to_s
last_line = line
end
end
section_number, title = title.to_s.split(" ", 2)
sections << { section_number: section_number, title: title, body: body }
section_names =
sections.map { |section| [section[:section_number], section[:title]] }.to_h
sections[4..-1].each do |section|
title = []
current = +""
section_number = section[:section_number]
section_number
.split(".")
.each do |number|
current << number
current << "."
title << section_names[current].to_s.strip
end
title = title.join(" - ")
body = section[:body]
next if body.strip.empty?
puts "[[metadata section=\"#{section_number}\" title=\"#{title.strip}\"]]"
puts body
end
И Claude Opus, и GPT-4 могут довольно неудачно справляться со сложными вопросами. Это понятно, так как они питаются всеми токенами из интернета, поэтому 50 разных версий документации HAProxy и все обсуждения в мире о ней попадают в «мозг», что может сильно запутать модель:
Примеры запутанных ответов GPT-4 и Claude 3 Opus
Оба варианта объективно намного хуже точно настроенного ответа, который предоставляет Discourse RAG:
Примеры менее запутанных ответов GPT-4 и Claude Opus
Будущее
Мы с нетерпением ждем ваших отзывов. Некоторые идеи на будущее:
- Поддержка PDF/DOCX/XLS и других форматов, чтобы вам не нужно было конвертировать их в текст.
- Умное разбиение на чанки для исходного кода / HTML.
- Умные преобразования входящих данных перед индексацией.
Дайте нам знать, что вы думаете!
Огромная благодарность @Roman за внедрение этой функции ![]()



