AI:embeddings:backfill - Gestion de l'erreur 400 d'OpenAI pour tokens excessifs dans les embeddings

J’essaie d’exécuter cette tâche rake en utilisant les embeddings OpenAI :

J'obtiens un message d'erreur

[:/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 ’
/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

Vous n’avez pas besoin de le lire, j’ai compris le problème.

Une HTTPBadResponse est levée à partir de la ligne ci-dessous :

La page /logs affiche ceci :

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
  }
}

Fondamentalement, il semble qu’il y ait quelque chose qui contient trop de mots. Je ne suis pas sûr de la différence entre le « prompt » et la « completion » dans ce contexte. Quoi qu’il en soit, cela m’empêche de faire le backfill.

J’ai modifié la limite maximale de publication dans les paramètres du site, donc peut-être que cela est causé par une publication très longue ? Dans ce cas, je m’attendrais à ce que le contenu de cette publication soit tronqué ou peut-être que cette publication soit simplement ignorée ? Quoi qu’il en soit, cela bloque complètement le processus de backfill.

1 « J'aime »

Merci pour le rapport, j’y jetterai un coup d’œil lundi.

2 « J'aime »

Nous tronquons le contenu avant de l’envoyer en utilisant notre propre tokenizer OpenAI, il s’agit donc d’une erreur inattendue.

Pouvez-vous partager le texte problématique ?

Tout ce que je peux voir, c’est la trace de la pile et l’erreur 400. Y a-t-il un endroit où je peux regarder pour voir quelle était la requête ? Sinon, je ne sais pas quel texte cause le problème.

Puisque vous exécutez la tâche rake, pouvez-vous modifier le fichier à l’adresse

et ajouter un puts t.id entre les lignes 18 et 19 pour imprimer l’ID du sujet.

Merci pour vos conseils. Je pense avoir trouvé un cas limite incroyable.

Le problème était le texte Zalgo

C’est-à-dire, ce truc :

Ce « hello world » devient 607 caractères avec toutes ces saletés dessus

Il y avait un post avec un tas de ça, donc je l’ai supprimé. Le remplissage a pu continuer. Ce n’est probablement pas un problème de haute priorité, mais je ne suis pas le seul à avoir un post comme celui-ci sur mon forum.

Ohh c’est intéressant. Je suppose que cela déclenche un problème avec le tokenizer OpenAI, ce qui fausse notre comptage.

2 « J'aime »

Ceci pourrait en fait être un bug dans le tokenizer officiel !!

Nos décomptes correspondent parfaitement !

Aussi… en regardant les décomptes de tokens, le texte zalgo est une sacrée attaque contre l’IA, étant donné qu’il gonfle les décomptes de tokens pour si peu de valeur.

@piffy y a-t-il une chance que vous puissiez coller le texte exact que vous aviez dans https://platform.openai.com/tokenizer pour voir si les décomptes de tokens correspondent à ce que dit l’API, il pourrait y avoir une reproduction pour Open AI ici.

2 « J'aime »


Ci-dessus se trouve le contenu brut du message que je vois lorsque je clique sur « Modifier »

Pour plus de contexte, il s’agissait d’un échec de l’intégration du sujet, donc je ne connais pas les détails d’implémentation sur la façon dont un sujet complet est intégré. Mais je peux vous dire que la suppression de ce message a permis de passer de l’échec au succès.

Je peux vous envoyer le message original par chat, j’ai l’impression que le publier dans ce fil recréerait le problème ici :laughing:

Corrigé dans

1 « J'aime »