Class: SwarmMemory::Embeddings::InformersEmbedder

Inherits:
Embedder
  • Object
show all
Defined in:
lib/swarm_memory/embeddings/informers_embedder.rb

Overview

Embedder implementation using Informers gem (fast ONNX inference)

Uses sentence-transformers models via ONNX for fast, local embedding generation. Supports quantized models for even better performance.

Examples:

embedder = InformersEmbedder.new
vector = embedder.embed("This is a test sentence")
vector.size # => 384

Constant Summary collapse

DEFAULT_MODEL =
"sentence-transformers/multi-qa-MiniLM-L6-cos-v1"
EMBEDDING_DIMENSIONS =
384

Instance Method Summary collapse

Constructor Details

#initialize(model: nil, quantized: false, cache_dir: nil) ⇒ InformersEmbedder

Initialize embedder with model configuration

Model can be configured via SWARM_MEMORY_EMBEDDING_MODEL environment variable.

Available models:

  • sentence-transformers/all-MiniLM-L6-v2 (default, general purpose, 256 tokens)
  • sentence-transformers/multi-qa-MiniLM-L6-cos-v1 (Q&A optimized, 512 tokens)

Note: The original sentence-transformers model uses unquantized ONNX (90MB). For a smaller quantized version (22MB), use model: "Xenova/all-MiniLM-L6-v2", quantized: true

Parameters:

  • model (String, nil) (defaults to: nil)

    HuggingFace model identifier (defaults to env var or DEFAULT_MODEL)

  • quantized (Boolean) (defaults to: false)

    Use quantized variant (default: false for original model)

  • cache_dir (String, nil) (defaults to: nil)

    Optional custom cache directory

Raises:



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/swarm_memory/embeddings/informers_embedder.rb', line 33

def initialize(model: nil, quantized: false, cache_dir: nil)
  super()

  unless defined?(Informers)
    raise EmbeddingError,
      "Informers gem is not available. Install with: gem install informers"
  end

  # Use env var if available, otherwise use provided model or default
  @model_name = model || ENV["SWARM_MEMORY_EMBEDDING_MODEL"] || DEFAULT_MODEL
  @quantized = quantized
  @model = nil # Lazy load

  # Optional: Set custom cache directory
  Informers.cache_dir = cache_dir if cache_dir
end

Instance Method Details

#cached?Boolean

Check if model is already cached locally

Examples:

embedder = InformersEmbedder.new
if embedder.cached?
  puts "Ready to use!"
else
  puts "Will download on first use (~80MB)"
end

Returns:

  • (Boolean)

    True if model files exist in cache



77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/swarm_memory/embeddings/informers_embedder.rb', line 77

def cached?
  cache_dir = Informers.cache_dir

  # Different models have different file names
  # Original sentence-transformers: model.onnx (unquantized)
  # Xenova version: model_quantized.onnx (quantized)
  suffix = @quantized ? "_quantized" : ""

  # Check for required model files
  model_file = File.join(cache_dir, @model_name, "onnx", "model#{suffix}.onnx")
  tokenizer_file = File.join(cache_dir, @model_name, "tokenizer.json")

  File.exist?(model_file) && File.exist?(tokenizer_file)
end

#dimensionsInteger

Get embedding dimensionality

Returns:

  • (Integer)

    Vector dimensions (384 for all-MiniLM-L6-v2)



130
131
132
# File 'lib/swarm_memory/embeddings/informers_embedder.rb', line 130

def dimensions
  EMBEDDING_DIMENSIONS
end

#embed(text) ⇒ Array<Float>

Generate embedding for single text

Parameters:

  • text (String)

    Text to embed

Returns:

  • (Array<Float>)

    384-dimensional embedding vector

Raises:



97
98
99
100
101
102
103
104
105
106
107
# File 'lib/swarm_memory/embeddings/informers_embedder.rb', line 97

def embed(text)
  raise ArgumentError, "text is required" if text.nil? || text.to_s.strip.empty?

  begin
    ensure_model_loaded
    # Informers handles single strings directly - returns single embedding array
    @model.call(text)
  rescue StandardError => e
    raise EmbeddingError, "Failed to generate embedding: #{e.message}"
  end
end

#embed_batch(texts) ⇒ Array<Array<Float>>

Generate embeddings for multiple texts (batched)

Parameters:

  • texts (Array<String>)

    Texts to embed

Returns:

  • (Array<Array<Float>>)

    Array of embedding vectors

Raises:



114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/swarm_memory/embeddings/informers_embedder.rb', line 114

def embed_batch(texts)
  raise ArgumentError, "texts must be an array" unless texts.is_a?(Array)
  raise ArgumentError, "texts cannot be empty" if texts.empty?

  begin
    ensure_model_loaded
    # Batch call - returns array of embedding arrays
    @model.call(texts)
  rescue StandardError => e
    raise EmbeddingError, "Failed to generate embeddings: #{e.message}"
  end
end

#preload!self

Explicitly pre-load the model (triggers download if not cached)

Call this during initialization to download the model immediately rather than waiting for the first embedding call.

Examples:

embedder = InformersEmbedder.new
embedder.preload!  # Downloads ~80MB model on first call
embedder.embed("text")  # No download wait

Returns:

  • (self)


61
62
63
64
# File 'lib/swarm_memory/embeddings/informers_embedder.rb', line 61

def preload!
  ensure_model_loaded
  self
end