Module: Mxrb::Semantic::Embedder

Defined in:
lib/mxrb/semantic/embedder.rb

Overview

Builds optional embedding backends and ranks artifacts in pure Ruby.

Class Method Summary collapse

Class Method Details

.artifact_text(artifact) ⇒ Object



23
24
25
26
27
28
29
# File 'lib/mxrb/semantic/embedder.rb', line 23

def artifact_text(artifact)
   = artifact. || {}
  [
    artifact.qualified_name, artifact.name, artifact.kind,
    artifact.module_name, [:documentation]
  ].compact.join(' ')
end

.build(backend: :auto) ⇒ Object



14
15
16
17
18
19
20
21
# File 'lib/mxrb/semantic/embedder.rb', line 14

def build(backend: :auto)
  case backend
  when :tfidf then TfidfEmbedder.new
  when :onnx  then OnnxEmbedder.new
  when :auto  then OnnxEmbedder.available? ? OnnxEmbedder.new : TfidfEmbedder.new
  else raise ArgumentError, "unknown embedding backend: #{backend.inspect}"
  end
end

.dot(left, right) ⇒ Object

Raises:

  • (ArgumentError)


44
45
46
47
48
# File 'lib/mxrb/semantic/embedder.rb', line 44

def dot(left, right)
  raise ArgumentError, 'embedding dimensions do not match' unless left.size == right.size

  left.each_index.sum { left[_1] * right[_1] }
end

.rank(artifacts, query, embedder:, limit:) ⇒ Object



31
32
33
# File 'lib/mxrb/semantic/embedder.rb', line 31

def rank(artifacts, query, embedder:, limit:)
  rank_with_distance(artifacts, query, embedder:, limit:).map(&:artifact).freeze
end

.rank_with_distance(artifacts, query, embedder:, limit:) ⇒ Object



35
36
37
38
39
40
41
42
# File 'lib/mxrb/semantic/embedder.rb', line 35

def rank_with_distance(artifacts, query, embedder:, limit:)
  query_vector = embedder.embed(query.to_s)
  scored = artifacts.map do |artifact|
    similarity = dot(query_vector, embedder.embed(artifact_text(artifact)))
    RankedArtifact.new(artifact, similarity, 1.0 - similarity)
  end
  scored.sort_by { [-_1.similarity, _1.artifact.qualified_name] }.first(limit).freeze
end