Что-то не так с эмбеддингами (связанные темы становятся слишком дорогими)

Привет :wave:

Я использую text-embedding-3-large как модель для векторных вложений, и с ней что-то не так. Я имею в виду, что мне пришлось дважды пополнить счёт OpenAI с 30 ноября, что безумие, ведь этого должно хватать на месяцы… Не изменилось ли что-то в связанных темах? Возможно, система постоянно догоняет темы, которые уже были обработаны, или я не знаю. :thinking:

Она генерирует около 24 миллионов входных токенов в день.

До 30 ноября это было примерно 60–220 тысяч.

2 лайка

Пожалуйста, предоставьте значения всех настроек эмбеддингов:

ai_embeddings_enabled
ai_embeddings_discourse_service_api_endpoint
ai_embeddings_discourse_service_api_endpoint_srv
ai_embeddings_discourse_service_api_key
ai_embeddings_model
ai_embeddings_per_post_enabled
ai_embeddings_generate_for_pms
ai_embeddings_semantic_related_topics_enabled
ai_embeddings_semantic_related_topics
ai_embeddings_semantic_related_include_closed_topics
ai_embeddings_backfill_batch_size
ai_embeddings_semantic_search_enabled
ai_embeddings_semantic_search_hyde_model
ai_embeddings_semantic_search_hyde_model_allowed_seeded_models
ai_embeddings_semantic_quick_search_enabled
1 лайк
ai_embeddings_enabled: true
ai_embeddings_discourse_service_api_endpoint: ""
ai_embeddings_discourse_service_api_endpoint_srv: ""
ai_embeddings_discourse_service_api_key: ""
ai_embeddings_model: text-embedding-3-large
ai_embeddings_per_post_enabled: false
ai_embeddings_generate_for_pms: false
ai_embeddings_semantic_related_topics_enabled: true
ai_embeddings_semantic_related_topics: 5
ai_embeddings_semantic_related_include_closed_topics: true
ai_embeddings_backfill_batch_size: 250
ai_embeddings_semantic_search_enabled: true
ai_embeddings_semantic_search_hyde_model: Gemini 1.5 Flash
ai_embeddings_semantic_search_hyde_model_allowed_seeded_models: ""
ai_embeddings_semantic_quick_search_enabled: false
1 лайк

Сколько у вас эмбеддингов?

SELECT COUNT(*) FROM ai_topic_embeddings WHERE model_id = 7;

Сколько у вас тем?

SELECT COUNT(*) FROM topics WHERE deleted_at IS NULL AND archetype = 'regular';

1 лайк

Сколько у вас эмбеддингов?
5964

Сколько у вас тем?
5563

1 лайк

Я проверил свой счёт. Взрыв произошёл 27.11. До этого расход составлял менее 100 тысяч токенов в день, но затем он вырос до 7 миллионов и продолжает расти каждый день. Вчера он был уже около 20 миллионов.

Редакция: В октябре стоимость вложений (embeddings) составляла 46 центов. Сейчас, в декабре, за почти четыре дня — почти 6 долларов.

Да. Я отключил вложения (embeddings).

2 лайка

24M в день — это весь ваш форум, это выглядит как ошибка. Если только вы не получаете обновления во всех этих темах каждый день, то это точно баг.

1 лайк

Одно из возможных объяснений связано с тем, что ранее мы пропускали вызов API для генерации эмбеддингов, если дайджест тем не менялся, но в функции gen_bulk_reprensentations это поведение было нарушено @Roman.

@Don, подскажите, сколько запросов на генерацию эмбеддингов вы делаете в день?

2 лайка

Я не Дон, но количество моих API-запросов выросло с 80–100 до 3825.

2 лайка

Обычно это около 150–200 запросов в день

но в конце ноября количество увеличилось.

1 лайк

Приношу извинения, это была ошибка в новом коде, который мы добавили для ускорения заполнения пропущенных эмбеддингов. Проблема должна быть исправлена в:

Пожалуйста, дайте знать, если всё не вернётся в норму.

6 лайков

Учитывая лимит в 250 запросов в час, у нас есть жёсткое ограничение в 6000 запросов в день. Эти цифры всё ещё в пределах лимита.

Однако, если они срабатывают только при нашем «обновлении случайной выборки» тем, это должно быть ограничено 10% от этого значения, то есть в худшем случае — 600 запросов.

@Roman, не применяется ли этот лимит каким-то образом? Или проблема где-то ещё?

1 лайк

Да, я думаю, что исправленная мной ошибка выявила другую, которую скрывала проверка дайджеста.

Я думаю, ошибка здесь:

На прошлой неделе я заменил find_each на find_in_batches (первый использует батчи внутренне), и поскольку оба метода полагаются на limit для указания размера батча, исходный лимит limit - rebaked игнорируется. Вместо этого следует использовать pluck + each_slice.

4 лайка

Спасибо за исправление :hugs:

Я обновил свой сайт, но похоже, что в /logs возникла проблема. Не уверен, связана ли она с этим…

Сообщение

Исключение в задаче: ERROR: некорректный синтаксис входных данных для типа halfvec: "[NULL]"
LINE 2: ...1, 1, 'e358a54a79f71861a4ebd17ecebbad6932fc1f9a', '[NULL]', ...
                                                             ^


Трассировка стека

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/patches/db/pg.rb:110:in `exec'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/patches/db/pg.rb:110:in `async_exec'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_sql-1.6.0/lib/mini_sql/postgres/connection.rb:217:in `run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_sql-1.6.0/lib/mini_sql/active_record_postgres/connection.rb:38:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_sql-1.6.0/lib/mini_sql/active_record_postgres/connection.rb:34:in `block in with_lock'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_sql-1.6.0/lib/mini_sql/active_record_postgres/connection.rb:34:in `with_lock'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_sql-1.6.0/lib/mini_sql/active_record_postgres/connection.rb:38:in `run'
/var/www/discourse/lib/mini_sql_multisite_connection.rb:109:in `run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_sql-1.6.0/lib/mini_sql/postgres/connection.rb:196:in `exec'
/var/www/discourse/plugins/discourse-ai/lib/embeddings/vector_representations/base.rb:423:in `save_to_db'
/var/www/discourse/plugins/discourse-ai/lib/embeddings/vector_representations/base.rb:86:in `block in gen_bulk_reprensentations'
/var/www/discourse/plugins/discourse-ai/lib/embeddings/vector_representations/base.rb:86:in `each'
/var/www/discourse/plugins/discourse-ai/lib/embeddings/vector_representations/base.rb:86:in `gen_bulk_reprensentations'
/var/www/discourse/plugins/discourse-ai/app/jobs/scheduled/embeddings_backfill.rb:131:in `block in populate_topic_embeddings'
/var/www/discourse/plugins/discourse-ai/app/jobs/scheduled/embeddings_backfill.rb:130:in `each'
/var/www/discourse/plugins/discourse-ai/app/jobs/scheduled/embeddings_backfill.rb:130:in `each_slice'
/var/www/discourse/plugins/discourse-ai/app/jobs/scheduled/embeddings_backfill.rb:130:in `populate_topic_embeddings'
/var/www/discourse/plugins/discourse-ai/app/jobs/scheduled/embeddings_backfill.rb:36:in `execute'
/var/www/discourse/app/jobs/base.rb:308:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:295:in `block in perform'
/var/www/discourse/app/jobs/base.rb:291:in `each'
/var/www/discourse/app/jobs/base.rb:291:in `perform'
/var/www/discourse/app/jobs/base.rb:362:in `perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.17.0/lib/mini_scheduler/manager.rb:137:in `process_queue'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.17.0/lib/mini_scheduler/manager.rb:77:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.17.0/lib/mini_scheduler/manager.rb:63:in `block (2 levels) in ensure_worker_threads'
1 лайк

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

Пожалуйста, выполните это из консоли:

DiscourseAi::Embeddings::VectorRepresentations::Base
          .find_representation(SiteSetting.ai_embeddings_model)
          .new(DiscourseAi::Embeddings::Strategies::Truncation.new)
          .vector_from("this is a test")
          .present?

Если возникнет ошибка Net::HTTPBadResponse, она должна быть записана в ваши логи.

1 лайк

В консоли я получил: truet?, а в /logs ничего нет.

Возможно, это задержка со стороны OpenAI, так как я пополнял счёт час назад, и этот процесс, вероятно, не происходит мгновенно…

Это означает, что он может генерировать эмбеддинги. Сохраняются ли эти ошибки? Если да, то вы должны видеть их каждые пять минут.

Я провел несколько тестов на локальном экземпляре против нашего самохостингового сервиса эмбеддингов и подтвердил, что заполнение работает при следующих условиях:

  • Эмбеддинги отсутствуют.
  • Дигест устарел, а updated_at эмбеддингов старше 6 часов.
  • Дигест не устарел, но updated_at эмбеддингов старше 6 часов (в этом случае обновление не происходит).
1 лайк

Нет, я больше не вижу этих ошибок в /logs, теперь всё работает. Спасибо :slight_smile:

1 лайк

Мы объединили ещё одно исправление 5 часов назад, пожалуйста, обновитесь снова.

После этого сообщите, пожалуйста, как обстоят дела с производительностью.

cc @Jagster.

2 лайка

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

2 лайка