エンベディングで何か問題(関連トピックが高価になりすぎている)

こんにちは :wave:

ai embeddings modeltext-embedding-3-large を使用していますが、何か問題があるようです。 (11月30日) からすでに2回もOpenAIアカウントにチャージしなければならず、これは数ヶ月分のはずなので信じられません… 関連トピックで何か変更がありましたか? 既に完了したトピックを常にバックフィルしているのでしょうか、それとも分かりません。 :thinking:

1日あたり約2400万トークンが生成されます。

以前 (11月30日) は約6万〜22万トークンでした。

「いいね!」 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に爆発し、それ以前は1日あたり10万トークン未満でしたが、その後700万に増加し、毎日増加しており、昨日は2000万近くでした。

編集:10月、埋め込みのコストは46セントでした。現在、12月は4日近くで6ドル近くです。

はい。埋め込みを無効にしました。

「いいね!」 2

1日あたり24Mというのは、あなたのフォーラム全体ですか?バグがあるように見えます。毎日すべてのトピックで更新が行われない限り、それは間違いなくバグです。

「いいね!」 1

トピックダイジェストが変わらない場合は、embeddings APIの呼び出しをスキップしていましたが、gen_bulk_reprensentationsでこれを後退させてしまいました。@Roman

@Donは、1日に何件のembeddingsリクエストを行っているかご存知ですか?

「いいね!」 2

ドンではありませんが、APIリクエストが80〜100から3825に増加しました。

「いいね!」 2

通常、1日のリクエストは150〜200件です。

しかし、11月末に増加しました。

「いいね!」 1

申し訳ありません。これは、埋め込みをより高速にバックフィルするために追加した新しいコードのバグでした。これは以下で修正されるはずです。

状況が正常に戻らない場合は、お知らせください。

「いいね!」 6

1時間あたり250件なので、1日あたり6,000件のハードリミットがあります。これらの数値はまだ制限内です。

しかし、トピックの「ランダムサンプルの更新」によってのみトリガーされている場合、それはその10%に制限されるはずであり、最悪の場合でも600リクエストになります。

@Roman、この制限は適用されていないのでしょうか?それとも問題は別の場所にあるのでしょうか?

「いいね!」 1

はい、修正したバグが、ダイジェストチェックが隠していた別のバグを明らかにしたと思います。

バグはここにあると思います。

先週、find_eachfind_in_batches に変更しました(前者は内部でバッチを使用します)。どちらもバッチサイズを指定するために limit を使用しているため、元の limit - rebaked の limit は無視されます。代わりに pluck + each_slice を使用する必要があります。

「いいね!」 4

修正ありがとうございます :hugs:

サイトを更新しましたが、/logs に問題があるようです。これに関連しているかどうかわかりません…

Message

Job exception: ERROR:  invalid input syntax for type halfvec: "[NULL]"
LINE 2: ...1, 1, 'e358a54a79f71861a4ebd17ecebbad6932fc1f9a', '[NULL]', ...
                                                             ^


Backtrace

/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からの遅延でしょう。1時間前にアカウントにチャージしたばかりで、この処理は即時ではないと思われます…

つまり、埋め込みを生成できるということですね。これらのエラーは継続していますか?もしそうなら、5分ごとにこれらのエラーが表示されるはずです。

ローカルインスタンスでセルフホストの埋め込みサービスに対してテストを実行し、バックフィリングが以下の条件下で機能することを確認しました。

  • 埋め込みが存在しない。
  • ダイジェストが古い場合、および埋め込みの updated_at が6時間より古い場合。
  • ダイジェストが古くない場合、および埋め込みの updated_at が6時間より古い場合(この場合は更新されません)。
「いいね!」 1

いいえ、/logs でこれらのエラーはもう表示されず、すべて正常に動作しています。ありがとうございます :slight_smile:

「いいね!」 1

5時間前に別の修正をマージしました。再度更新してください。

その後、レートがどうなっているか教えてください。

cc @Jagster

「いいね!」 2

APIリクエスト数などの制限については何も知りませんが、以前の修正後、通常に戻りました。迅速な対応をありがとうございました。

「いいね!」 2