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
- .artifact_text(artifact) ⇒ Object
- .build(backend: :auto) ⇒ Object
- .dot(left, right) ⇒ Object
- .rank(artifacts, query, embedder:, limit:) ⇒ Object
- .rank_with_distance(artifacts, query, embedder:, limit:) ⇒ Object
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
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 = .(query.to_s) scored = artifacts.map do |artifact| similarity = dot(query_vector, .(artifact_text(artifact))) RankedArtifact.new(artifact, similarity, 1.0 - similarity) end scored.sort_by { [-_1.similarity, _1.artifact.qualified_name] }.first(limit).freeze end |