Ai:embeddings:backfill - 임베딩에서 OpenAI 400 오류(토큰 초과) 처리

OpenAI 임베딩을 사용하여 이 rake 작업을 실행하려고 합니다:

에러 메시지가 발생합니다

[…]:/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 <main>' /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

읽지 않아도 됩니다. 문제가 무엇인지 파악했거든요.

아래 라인에서 HTTPBadResponse가 발생하고 있습니다:

/logs 페이지에는 다음과 같은 내용이 표시됩니다:

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

대략적으로 보면, 단어 수가 너무 많은 것 같습니다. 이 컨텍스트에서 "prompt"와 "completion"의 차이가 무엇인지 정확히 알지 못합니다. 어쨌든, 이로 인해 백필링(backfilling)을 진행할 수 없습니다.

사이트 설정에서 최대 게시물 길이를 변경했으므로, 아주 긴 게시물 때문일 수 있습니다. 하지만 이 경우라면 해당 게시물 내용이 잘리거나, 혹은 해당 게시물이 건너뛰어져야 한다고 생각됩니다. 어쨌든, 백필링 프로세스 전체가 차단되고 있습니다.

1개의 좋아요

리포트 감사합니다. 월요일에 확인해 보겠습니다.

2개의 좋아요

자체 OpenAI 토크나이저를 사용하여 콘텐츠를 전송하기 전에 잘라내는 과정이 있으므로, 이는 예상치 못한 오류입니다.

문제가 있는 텍스트를 공유해 주시겠습니까?

지금 제가 볼 수 있는 것은 스택 트레이스와 400 에러뿐입니다. 어떤 요청이었는지 확인할 수 있는 곳이 있을까요? 그렇지 않으면 어떤 텍스트가 문제를 일으키는지 알 수 없습니다.

rake 작업을 실행하고 계신데, 다음 파일의

https://github.com/discourse/discourse-ai/blob/main/lib/tasks/modules/embeddings/database.rake#L18-L19

18행과 19행 사이에 puts t.id를 추가하여 토픽 ID를 출력해 주실 수 있을까요?

가이드에 감사드립니다. 정말 지독한 엣지 케이스를 하나 찾았네요.

문제는 Zalgo 텍스트였어요.

즉, 이런 종류의 텍스트 말입니다:

이 hello world 텍스트는 붙어 있는 불필요한 문자들 때문에 607자로 늘어납니다.

이런 텍스트가 가득 담긴 게시글이 있어서 삭제했습니다. 백필이 정상적으로 진행되었습니다. 우선순위가 높지는 않은 문제일 수 있지만, 제 포럼뿐 아니라 다른 곳에도 이런 게시글이 있는 사람이 저만은 아니겠죠.

오, 흥미롭네요. OpenAI 토크나이저에서 문제가 발생하는 것 같고, 이로 인해 우리의 카운트가 잘못 계산되는 것 같습니다.

2개의 좋아요

이건 실제로 공식 토크나이저의 버그일 수도 있습니다!!

우리의 카운트가 정확히 일치합니다!

그리고… 토큰 수를 보면, zalgo 텍스트는 AI에 대한 강력한 공격 수단이라고 할 수 있습니다. 그 이유는 가치 대비 토큰 수를 크게 부풀리기 때문입니다.

@piffy 혹시 https://platform.openai.com/tokenizer 에 정확한 텍스트를 붙여넣어 API가 말하는 토큰 수와 일치하는지 확인해 주실 수 있을까요? 여기에서 Open AI의 재현 사례가 있을 수 있습니다.

2개의 좋아요


위 내용은 제가 "편집"을 클릭할 때 보이는 원본 게시물 콘텐츠입니다.

더 자세한 맥락을 말씀드리면, 이는 토픽이 임베드되지 못한 실패 사례였습니다. 그래서 전체 토픽이 임베드되는 방식에 대한 구현 세부 사항은 잘 모르겠습니다. 하지만 이 게시물 하나를 제거하니 작동하지 않던 것이 작동하게 되었습니다.

원본 메시지를 채팅으로 보내드릴 수 있습니다. 이 스레드에 게시물을 올리면 여기서도 문제가 재현될 것 같아서요 :laughing:

수정됨

1개의 좋아요