Problème avec les embeddings (les sujets liés deviennent trop coûteux)

Bonjour :wave:

J’utilise text-embedding-3-large pour le modèle d'intégration IA et quelque chose ne va pas avec. Je veux dire, j’ai dû recharger mon compte OpenAI deux fois depuis (le 30 novembre), ce qui est fou car cela devrait suffire pour des mois… Est-ce que quelque chose a changé concernant les sujets liés ? Il remplit peut-être toujours les sujets qui sont déjà faits ou je ne sais pas. :thinking:

Il génère environ 24 millions de jetons d’entrée / jour

Avant (le 30 novembre), c’était environ 60 - 220k

2 « J'aime »

Veuillez partager les valeurs de tous les paramètres d’intégration :

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 « J'aime »
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 « J'aime »

Combien d’embeddings avez-vous ?

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

Combien de sujets avez-vous ?

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

1 « J'aime »

Combien d’intégrations avez-vous ?
5964

Combien de sujets avez-vous ?
5563

1 « J'aime »

J’ai vérifié le mien. Il a explosé le 27.11. et avant cela, il était inférieur à 100 000 jetons par jour, mais il est ensuite passé à 7 millions et augmente chaque jour et hier, il était proche de 20 millions.

Edit : En octobre, le coût des embeddings était de 46 cents. Maintenant, en décembre, près de quatre jours : près de 6 dollars.

Oui. J’ai désactivé les embeddings.

2 « J'aime »

24 millions par jour est votre forum entier, cela semble buggé. À moins que vous n’obteniez des mises à jour dans tous ces sujets chaque jour, c’est très certainement un bug.

1 « J'aime »

Une chose qui pourrait être liée est que nous avions l’habitude de ne pas appeler l’API d’embeddings lorsque le résumé du sujet ne changeait pas, mais nous avons régressé cela sur gen_bulk_reprensentations @Roman.

@Don, savez-vous combien de requêtes d’embeddings vous effectuez par jour ?

2 « J'aime »

Je ne suis pas Don, mais mes requêtes API sont passées de 80-100 à 3825.

2 « J'aime »

Il y a généralement 150 à 200 requêtes par jour

mais fin novembre, cela a augmenté.

1 « J'aime »

Je suis vraiment désolé, c’était un bug dans le nouveau code que nous avons ajouté pour remplir plus rapidement les embeddings. Cela devrait être corrigé par :

Veuillez me faire savoir si les choses ne reviennent pas à la normale.

6 « J'aime »

Compte tenu des 250 par heure, nous avons une limite stricte de 6 000 par jour. Ces chiffres sont toujours dans la limite.

Cependant, s’ils ne sont déclenchés que par notre « mise à jour d’un échantillon aléatoire » de sujets, cela devrait être limité à 10 % de cela, ce qui, au pire, serait de 600 requêtes.

@Roman cette limite n’est-elle pas appliquée d’une manière ou d’une autre ? Ou le problème se situe-t-il ailleurs ?

1 « J'aime »

Oui, je pense que le bug que j’ai corrigé en a révélé un autre que la vérification du résumé masquait.

Je pense que le bug se trouve ici :

Je l’ai changé de find_each à find_in_batches la semaine dernière (le premier utilise des lots en interne), et comme les deux s’appuient sur limit pour spécifier la taille du lot, la limite d’origine de limit - rebaked est ignorée. Nous devrions utiliser pluck + each_slice à la place.

4 « J'aime »

Merci pour la correction :hugs:

J’ai mis à jour mon site mais il semble y avoir un problème dans /logs. Je ne suis pas sûr si cela est lié à cela…

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 « J'aime »

À première vue, cela ne semble pas lié. On dirait qu’il n’a pas réussi à générer l’embedding et qu’il essaie d’insérer NULL. Est-ce qu’OpenAI renvoie une erreur ? Peut-être quelque chose lié aux quotas ?

Pouvez-vous s’il vous plaît exécuter ceci depuis une console ?

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

Cela devrait enregistrer l’erreur dans vos journaux si une Net::HTTPBadResponse est levée.

1 « J'aime »

Je suis retourné dans la console : truet? et rien dans /logs.

C’est peut-être un délai de la part d’OpenAI car j’ai rechargé mon compte il y a une heure et ce processus n’est probablement pas instantané…

Cela signifie qu’il peut générer des embeddings alors. Ces erreurs persistent-elles ? Vous devriez voir ces erreurs toutes les cinq minutes si c’est le cas.

J’ai effectué quelques tests sur mon instance locale par rapport à notre service d’embeddings auto-hébergé et j’ai confirmé que le backfilling fonctionne dans les conditions suivantes :

  • Il n’y a pas d’embeddings.
  • Le digest est obsolète et updated_at des embeddings est antérieur à 6 heures.
  • Le digest n’est pas obsolète et updated_at des embeddings est antérieur à 6 heures (il ne se met pas à jour dans ce cas).
1 « J'aime »

Non, je ne vois plus ces erreurs dans /logs, tout fonctionne maintenant. Merci :slight_smile:

1 « J'aime »

Nous avons fusionné une autre correction il y a 5 heures, veuillez mettre à jour à nouveau.

Après cela, faites-moi savoir comment le taux se présente.

cc @Jagster.

2 « J'aime »

Je ne sais rien des limites, mais le nombre de requêtes API, etc. est revenu à la normale après la correction précédente. Donc merci les gars pour votre réaction rapide.

2 « J'aime »