Algo de ruim com embeddings (tópicos relacionados ficando muito caros)

Olá :wave:

Eu uso o text-embedding-3-large para o modelo de embeddings de IA e algo está errado com ele. Quero dizer, tive que recarregar minha conta OpenAI duas vezes desde (30 de novembro), o que é loucura porque deveria ser suficiente por meses… Algo mudou em tópicos relacionados? Talvez ele sempre preencha tópicos que já foram feitos ou eu não sei. :thinking:

Ele gera ~ 24 milhões de tokens de entrada / dia

Antes (30 de novembro) era ~ 60 - 220k

2 curtidas

Por favor, compartilhe os valores de todas as configurações de embeddings:

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

Quantos embeddings você tem?

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

Quantos tópicos você tem?

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

1 curtida

Quantos embeddings você tem?
5964

Quantos tópicos você tem?
5563

1 curtida

Eu verifiquei o meu. Explodiu em 27/11 e antes disso eram menos de 100 mil tokens por dia, mas depois aumentou para 7 milhões e está aumentando a cada dia, e ontem chegou perto de 20 milhões.

Editar: Em outubro, o custo dos embeddings era de 46 centavos. Agora, em dezembro, em quase quatro dias: quase 6 dólares.

Sim. Desativei os embeddings.

2 curtidas

24M por dia é todo o seu fórum, isso parece apresentar falhas. A menos que você receba atualizações em todos esses tópicos todos os dias, isso é certamente uma falha.

1 curtida

Uma coisa que pode estar relacionada é que costumávamos pular a chamada da API de embeddings quando o resumo do tópico não mudava, mas regredimos isso em gen_bulk_reprensentations @Roman.

@Don você sabe quantas requisições de embeddings você está fazendo por dia?

2 curtidas

Eu não sou o Don, mas minhas solicitações de API aumentaram de 80-100 para 3825.

2 curtidas

Geralmente ~150 - 200 solicitações / dia

mas no final de novembro aumentou.

1 curtida

Peço desculpas, isso foi um bug no novo código que adicionamos para preencher embeddings mais rapidamente. Deve ser corrigido por:\n\nhttps://github.com/discourse/discourse-ai/pull/1001\n\nPor favor, me avise se as coisas voltarem ao normal.

6 curtidas

Dado o limite de 250 por hora, temos um limite rígido de 6 mil por dia. Esses números ainda estão dentro do limite.

No entanto, se eles forem acionados apenas pela nossa “atualização de uma amostra aleatória” de tópicos, isso deve ser limitado a 10% disso, o que, na pior das hipóteses, seriam 600 solicitações.

@Roman esse limite não está sendo aplicado de alguma forma? Ou o problema está em outro lugar?

1 curtida

Sim, acho que o bug que corrigi revelou outro que a verificação de resumo estava ocultando.

Acho que o bug está aqui:

Eu o alterei de find_each para find_in_batches na semana passada (o primeiro usa lotes internamente), e como ambos dependem de limit para especificar o tamanho do lote, o limit original de limit - rebaked é ignorado. Devemos usar pluck + each_slice em vez disso.

4 curtidas

Obrigado pela correção :hugs:

Atualizei meu site, mas parece que há um problema em /logs. Não tenho certeza se está relacionado a isso…

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 curtida

À primeira vista, não parece relacionado. Parece que falhou ao gerar o embedding e está tentando inserir NULL. Pode ser que a OpenAI esteja retornando um erro? Talvez algo relacionado a cotas?

Você pode, por favor, executar isso de um console?

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

Isso deve registrar o erro em seus logs se ele levantar um Net::HTTPBadResponse.

1 curtida

Voltei ao console: truet? e nada em /logs.

Talvez seja um atraso da OpenAI porque recarreguei minha conta novamente há uma hora e provavelmente esse processo não é instantâneo…

Isso significa que ele pode gerar embeddings então. Esses erros persistem? Você deveria ver esses erros a cada cinco minutos, se for o caso.

Executei alguns testes na minha instância local contra nosso serviço de embeddings auto-hospedado e confirmei que o backfilling funciona nas seguintes condições:

  • Não há embeddings.
  • O digest está desatualizado e o updated_at dos embeddings é anterior a 6 horas.
  • O digest não está desatualizado e o updated_at dos embeddings é anterior a 6 horas (ele não atualiza neste caso).
1 curtida

Não, não vejo mais esses erros em /logs, tudo funciona agora. Obrigado :slight_smile:

1 curtida

Nós mesclamos outro conserto há 5 horas, por favor, atualize novamente.

Depois disso, por favor, me diga como está a taxa.

cc @Jagster.

2 curtidas

Não sei nada sobre limites, mas a quantidade de solicitações de API, etc. voltou ao normal após o reparo anterior. Então, obrigado pessoal pela rápida reação.

2 curtidas