Algo malo con las embeddings (temas relacionados siendo demasiado costosos)

Hola :wave:

Uso text-embedding-3-large para ai embeddings model y algo va mal con él. Es decir, tengo que recargar mi cuenta de OpenAI dos veces desde el (30 de noviembre), lo cual es una locura porque debería ser suficiente para meses… ¿Ha cambiado algo relacionado con temas? Quizás rellena siempre temas que ya están hechos o no lo sé. :thinking:

Genera ~ 24 millones de tokens de entrada / día

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

2 Me gusta

Por favor, comparte los valores de todos los ajustes 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 me gusta
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 me gusta

¿Cuántos embeddings tienes?

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

¿Cuántos temas tienes?

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

1 me gusta

¿Cuántas incrustaciones tienes?
5964

¿Cuántos temas tienes?
5563

1 me gusta

Revisé el mío. Explotó el 27.11. y antes de eso eran menos de 100k tokens al día, pero luego aumentó a 7 millones y aumenta cada día y ayer estuvo cerca de los 20 millones.

Edición: Octubre, el costo de los embeddings fue de 46 centavos. Ahora, diciembre, cerca de cuatro días: casi 6 dólares.

Sí. Desactivé los embeddings.

2 Me gusta

24 millones al día es todo tu foro, eso parece tener errores. A menos que reciba actualizaciones en todos esos temas todos los días, eso es ciertamente un error.

1 me gusta

Una cosa que puede estar relacionada es que solíamos omitir la llamada a la API de embeddings cuando el resumen del tema no cambiaba, pero hemos revertido esto en gen_bulk_reprensentations @Roman.

@Don, ¿sabes cuántas solicitudes de embeddings estás haciendo al día?

2 Me gusta

No soy Don, pero mis solicitudes de API han aumentado de 80-100 a 3825.

2 Me gusta

Generalmente ~150 - 200 solicitudes / día

pero a finales de noviembre aumentó.

1 me gusta

Lo siento mucho, esto fue un error en el nuevo código que agregamos para rellenar incrustaciones más rápido. Debería solucionarse con:

Por favor, házmelo saber si las cosas no vuelven a la normalidad.

6 Me gusta

Dado el límite de 250 por hora, tenemos un límite estricto de 6k por día. Estos números todavía están dentro del límite.

Sin embargo, si solo se activan por nuestra “actualización de una muestra aleatoria” de temas, debería limitarse al 10% de eso, lo que, en el peor de los casos, serían 600 solicitudes.

@Roman ¿no se está aplicando este límite aquí de alguna manera? ¿O el problema está en otro lugar?

1 me gusta

Sí, creo que el error que corregí reveló otro que la verificación de resumen estaba ocultando.

Creo que el error está aquí:

Lo cambié de find_each a find_in_batches la semana pasada (el primero usa lotes internamente), y dado que ambos dependen de limit para especificar el tamaño del lote, se ignora el límite original de limit - rebaked. Deberíamos usar pluck + each_slice en su lugar.

4 Me gusta

Gracias por la corrección :hugs:

He actualizado mi sitio pero parece que hay un problema en /logs. No estoy seguro si está relacionado con esto…

Mensaje

Excepción de trabajo: ERROR: sintaxis de entrada no válida para el tipo halfvec: "[NULL]"
LÍNEA 2: ...1, 1, 'e358a54a79f71861a4ebd17ecebbad6932fc1f9a', '[NULL]', ...
                                                             ^


Rastreo

/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 me gusta

A primera vista, no parece relacionado. Parece que falló al generar el embedding y está intentando insertar NULL. ¿Podría ser que OpenAI esté devolviendo un error? ¿Quizás algo relacionado con las cuotas?

¿Puedes ejecutar esto desde una consola?

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

Debería registrar el error en tus registros si genera un Net::HTTPBadResponse.

1 me gusta

Volví a la consola: truet? y nada en /logs.

Quizás esto sea un retraso de OpenAI porque recargué mi cuenta hace una hora y probablemente este proceso no sea instantáneo…

Eso significa que puede generar embeddings entonces. ¿Persisten estos errores? Deberías ver estos errores cada cinco minutos si es así.

Ejecuté algunas pruebas en mi instancia local contra nuestro servicio de embeddings autoalojado y confirmé que el rellenado funciona bajo las siguientes condiciones:

  • No hay embeddings.
  • El digest está desactualizado y el updated_at de los embeddings es anterior a 6 horas.
  • El digest no está desactualizado y el updated_at de los embeddings es anterior a 6 horas (en este caso no se actualiza).
1 me gusta

No, ya no veo esos errores en /logs, todo funciona ahora. Gracias :slight_smile:

1 me gusta

Hemos fusionado otra corrección hace 5 horas, por favor actualiza de nuevo.

Después de eso, por favor, házmelo saber cómo se ve la tasa.

cc @Jagster.

2 Me gusta

No sé nada sobre límites, pero la cantidad de solicitudes de API, etc. volvió a la normalidad después de la corrección anterior. Así que gracias, chicos, por su rápida reacción.

2 Me gusta