KI:embeddings:backfill - Umgang mit dem 400-Fehler von OpenAI bei übermäßigen Tokens in Embeddings

Ich versuche, diese Rake-Aufgabe mit den OpenAI-Embeddings durchzuführen:

Ich erhalte eine Fehlermeldung

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

Sie müssen es nicht lesen, ich habe das Problem herausgefunden.

Ein HTTPBadResponse wird von der folgenden Zeile ausgelöst:

Die Seite /logs zeigt dies:

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

Im Grunde scheint es, dass etwas zu viele Wörter sind. Ich bin mir nicht sicher, was der Unterschied zwischen dem “Prompt” und der “Completion” in diesem Kontext ist. Auf jeden Fall verhindert dies, dass ich die Rückfüllung durchführe.

Ich habe das maximale Beitrags-Limit in den Website-Einstellungen geändert, also wird es vielleicht durch einen wirklich langen Beitrag verursacht? In diesem Fall würde ich erwarten, dass der Inhalt dieses Beitrags abgeschnitten wird oder dass der Beitrag einfach übersprungen wird? Auf jeden Fall blockiert es den Rückfüllungsprozess vollständig.

1 „Gefällt mir“

Danke für den Bericht, ich werde ihn am Montag prüfen.

2 „Gefällt mir“

Wir kürzen den Inhalt, bevor wir ihn mit unserem eigenen OpenAI Tokenizer versenden. Dies ist also ein unerwarteter Fehler.

Können Sie den problematischen Text teilen?

Alles, was ich sehen kann, ist der Stacktrace und der 400-Fehler. Gibt es eine Stelle, an der ich nachsehen kann, was die Anfrage war? Andernfalls weiß ich nicht, welcher Text das Problem verursacht.

Da Sie die Rake-Aufgabe ausführen, können Sie die Datei unter

bearbeiten und ein puts t.id zwischen Zeile 18 und 19 einfügen, um die Topic-ID auszugeben.

Vielen Dank für Ihre Anleitung. Ich glaube, ich habe einen verdammt guten Grenzfall gefunden.

Das Problem war Zalgo-Text

Das heißt, dieser Kram:

Dieses “Hallo Welt” wird mit all dem Müll darauf zu 607 Zeichen

Es gab einen Beitrag mit einer Menge davon, also habe ich ihn gelöscht. Das Backfill konnte fortgesetzt werden. Wahrscheinlich kein Problem mit hoher Priorität, aber ich kann nicht der Einzige sein, der einen solchen Beitrag in seinem Forum hat.

Oh, das ist interessant. Ich vermute, das löst ein Problem mit dem OpenAI-Tokenizer aus, wodurch unsere Zählung falsch wird.

2 „Gefällt mir“

Dies könnte tatsächlich ein Fehler im offiziellen Tokenizer sein!!

Unsere Zählungen stimmen völlig überein!

Außerdem… wenn man sich die Token-Anzahl ansieht, ist Zalgo-Text ein Höllenangriff auf KI, da er die Token-Anzahl bei so geringem Wert aufbläht.

@piffy Hast du eine Chance, den exakten Text, den du hattest, in https://platform.openai.com/tokenizer einzufügen, um zu sehen, ob die Token-Anzahl mit dem übereinstimmt, was die API sagt? Es könnte hier eine Reproduktion für Open AI geben.

2 „Gefällt mir“


Oben ist der rohe Beitrag, den ich sehe, wenn ich auf „Bearbeiten“ klicke.

Als weiteren Kontext kann ich sagen, dass dies ein Fehler beim Einbetten des Themas war, daher kenne ich die Implementierungsdetails nicht, wie ein vollständiges Thema eingebettet wird. Aber ich kann Ihnen sagen, dass das Entfernen dieses einen Beitrags dazu führte, dass es von nicht funktionierend zu funktionierend wurde.

Ich kann Ihnen die ursprüngliche Nachricht per Chat senden. Ich glaube, dass die Veröffentlichung in diesem Thread das Problem hier wieder aufleben lassen könnte :laughing:

Behoben in

1 „Gefällt mir“