Ai:embeddings:backfill — обработка ошибки 400 от OpenAI из-за превышения лимита токенов в эмбеддингах

Я пытаюсь выполнить эту задачу rake, используя встраивания OpenAI:

Я получаю сообщение об ошибке

[…]:/var/www/discourse# rake ai:embeddings:backfill --trace
** Invoke ai:embeddings:backfill (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute ai:embeddings:backfill
.rake aborted!
Net::HTTPBadResponse: Net::HTTPBadResponse (Net::HTTPBadResponse)
/var/www/discourse/plugins/discourse-ai/lib/inference/open_ai_embeddings.rb:27:in perform!' /var/www/discourse/plugins/discourse-ai/lib/embeddings/vector_representations/text_embedding_ada_002.rb:36:in vector_from’
/var/www/discourse/plugins/discourse-ai/lib/embeddings/vector_representations/base.rb:144:in generate_representation_from' /var/www/discourse/plugins/discourse-ai/lib/tasks/modules/embeddings/database.rake:19:in block (2 levels) in ’
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/relation/batches.rb:71:in each' /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/relation/batches.rb:71:in block in find_each’
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/relation/batches.rb:138:in block in find_in_batches' /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/relation/batches.rb:245:in block in in_batches’
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/relation/batches.rb:229:in loop' /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/relation/batches.rb:229:in in_batches’
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/relation/batches.rb:137:in find_in_batches' /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/relation/batches.rb:70:in find_each’
/var/www/discourse/plugins/discourse-ai/lib/tasks/modules/embeddings/database.rake:17:in block in <main>' /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:281:in block in execute’
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:281:in each' /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:281:in execute’
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:219:in block in invoke_with_call_chain' /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:199:in synchronize’
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:199:in invoke_with_call_chain' /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/task.rb:188:in invoke’
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:182:in invoke_task' /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:138:in block (2 levels) in top_level’
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:138:in each' /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:138:in block in top_level’
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:147:in run_with_threads' /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:132:in top_level’
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:83:in block in run' /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:208:in standard_exception_handling’
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.1.0/lib/rake/application.rb:80:in run' bin/rake:13:in <top (required)>’
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:58:in load' /usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:58:in kernel_load’
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:23:in run' /usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:451:in exec’
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/command.rb:28:in run' /usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in invoke_command’
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor.rb:527:in dispatch' /usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:34:in dispatch’
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/base.rb:584:in start' /usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:28:in start’
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/exe/bundle:28:in block in <top (required)>' /usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/friendly_errors.rb:117:in with_friendly_errors’
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/exe/bundle:20:in <top (required)>' /usr/local/bin/bundle:25:in load’
/usr/local/bin/bundle:25:in `’
Tasks: TOP => ai:embeddings:backfill

Хотя вам и не обязательно его читать, я уже понял, в чём проблема.

Ошибка HTTPBadResponse возникает в строке ниже:

На странице /logs отображается следующее:

OpenAI Embeddings failed with status: 400 body: {
  "error": {
    "message": "This model's maximum context length is 8192 tokens, however you requested 8506 tokens (8506 in your prompt; 0 for the completion). Please reduce your prompt; or completion length.",
    "type": "invalid_request_error",
    "param": null,
    "code": null
  }
}

В целом, похоже, что где-то слишком много слов. Я не уверен, в чём разница между «prompt» (запросом) и «completion» (завершением) в данном контексте. В любом случае, это мешает мне выполнить заполнение данных (backfill).

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

1 лайк

Спасибо за отчет, посмотрю в понедельник.

2 лайка

Мы усекли содержимое перед отправкой, используя наш собственный токенизатор OpenAI, поэтому эта ошибка является неожиданной.

Можете ли вы предоставить проблемный текст?

Я вижу только стектрейс и ошибку 400. Есть ли где-то, где я могу посмотреть, каким был запрос? Иначе я не знаю, какой текст вызывает проблему.

Поскольку вы запускаете задачу rake, отредактируйте файл по адресу

и добавьте puts t.id между строками 18 и 19, чтобы вывести ID темы.

Спасибо за ваши рекомендации. Я думаю, я нашел чертовски интересный крайний случай.

Проблема заключалась в тексте Залго.

То есть, вот это:

Это «Hello world» превращается в 607 символов со всем этим мусором вокруг.

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

О, это интересно. Похоже, это вызывает проблему с токенизатором OpenAI, из-за чего наш подсчёт оказывается неверным.

2 лайка

Это может быть баг в официальном токенизаторе!!

Наши подсчёты полностью совпадают!

Кстати… судя по количеству токенов, текст «зальго» — это настоящий удар по ИИ, так как он сильно раздувает счётчик токенов при минимальной пользе.

@piffy, не могли бы вы вставить точный текст, который вы использовали, в https://platform.openai.com/tokenizer, чтобы проверить, совпадают ли количества токенов с тем, что показывает API? Возможно, здесь есть возможность воспроизвести ошибку у OpenAI.

2 лайка


Выше показано содержимое исходного поста, которое я вижу при нажатии «Редактировать».

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

Я могу отправить вам оригинальное сообщение в чате; мне кажется, что публикация его в этой ветке может просто воспроизвести проблему здесь :laughing:

Исправлено в

1 лайк