mirror of
https://github.com/discourse/discourse-ai.git
synced 2025-03-08 18:29:32 +00:00
74 lines
2.4 KiB
Ruby
74 lines
2.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class NewEmbeddingsTables < ActiveRecord::Migration[7.2]
|
|
def up
|
|
create_table :ai_topics_embeddings, id: false do |t|
|
|
t.bigint :topic_id, null: false
|
|
t.bigint :model_id, null: false
|
|
t.integer :model_version, null: false
|
|
t.integer :strategy_id, null: false
|
|
t.integer :strategy_version, null: false
|
|
t.text :digest, null: false
|
|
t.column :embeddings, "halfvec", null: false
|
|
t.timestamps
|
|
|
|
t.index %i[model_id strategy_id topic_id],
|
|
unique: true,
|
|
name: "index_ai_topics_embeddings_on_model_strategy_topic"
|
|
end
|
|
|
|
create_table :ai_posts_embeddings, id: false do |t|
|
|
t.bigint :post_id, null: false
|
|
t.bigint :model_id, null: false
|
|
t.integer :model_version, null: false
|
|
t.integer :strategy_id, null: false
|
|
t.integer :strategy_version, null: false
|
|
t.text :digest, null: false
|
|
t.column :embeddings, "halfvec", null: false
|
|
t.timestamps
|
|
|
|
t.index %i[model_id strategy_id post_id],
|
|
unique: true,
|
|
name: "index_ai_posts_embeddings_on_model_strategy_post"
|
|
end
|
|
|
|
create_table :ai_document_fragments_embeddings, id: false do |t|
|
|
t.bigint :rag_document_fragment_id, null: false
|
|
t.bigint :model_id, null: false
|
|
t.integer :model_version, null: false
|
|
t.integer :strategy_id, null: false
|
|
t.integer :strategy_version, null: false
|
|
t.text :digest, null: false
|
|
t.column :embeddings, "halfvec", null: false
|
|
t.timestamps
|
|
|
|
t.index %i[model_id strategy_id rag_document_fragment_id],
|
|
unique: true,
|
|
name: "index_ai_fragments_embeddings_on_model_strategy_fragment"
|
|
end
|
|
|
|
# Copied from 20241008054440_create_binary_indexes_for_embeddings
|
|
%w[topics posts document_fragments].each do |type|
|
|
# our supported embeddings models IDs and dimensions
|
|
[
|
|
[1, 768],
|
|
[2, 1536],
|
|
[3, 1024],
|
|
[4, 1024],
|
|
[5, 768],
|
|
[6, 1536],
|
|
[7, 2000],
|
|
[8, 1024],
|
|
].each { |model_id, dimensions| execute <<-SQL }
|
|
CREATE INDEX ai_#{type}_embeddings_#{model_id}_1_search_bit ON ai_#{type}_embeddings
|
|
USING hnsw ((binary_quantize(embeddings)::bit(#{dimensions})) bit_hamming_ops)
|
|
WHERE model_id = #{model_id} AND strategy_id = 1;
|
|
SQL
|
|
end
|
|
end
|
|
|
|
def down
|
|
raise ActiveRecord::IrreversibleMigration
|
|
end
|
|
end
|