| name | rubyllm-embeddings |
| description | Generate vector embeddings with RubyLLM. Use this skill for semantic search, recommendations, content similarity, RAG applications, and any task requiring numerical text representations.
|
RubyLLM Embeddings
Transform text into numerical vectors for semantic search, recommendations, and content similarity.
Basic Usage
embedding = RubyLLM.embed("Ruby is elegant")
vector = embedding.vectors
puts "Dimension: #{vector.length}"
embeddings = RubyLLM.embed(["Ruby", "Python", "JavaScript"])
puts "Vectors: #{embeddings.vectors.length}"
embedding = RubyLLM.embed("text", model: 'text-embedding-3-large')
puts "Model: #{embedding.model}"
puts "Input tokens: #{embedding.input_tokens}"
Models
| Model | Provider | Dimensions | Input/$1M |
|---|
| text-embedding-3-small | OpenAI | 1536 | $0.02 |
| text-embedding-3-large | OpenAI | 3072 | $0.13 |
| gemini-embedding-3 | Google | 768 | $0.025 |
RubyLLM.embed("text", model: 'text-embedding-3-small')
RubyLLM.embed("text", model: 'gemini-embedding-3')
Similarity Calculation
def cosine_similarity(a, b)
dot = a.zip(b).sum { |x, y| x * y }
dot / (Math.sqrt(a.sum { |x| x**2 }) * Math.sqrt(b.sum { |y| y**2 }))
end
vec1 = RubyLLM.embed("cat").vectors
vec2 = RubyLLM.embed("dog").vectors
vec3 = RubyLLM.embed("car").vectors
puts cosine_similarity(vec1, vec2)
puts cosine_similarity(vec1, vec3)
RAG Example
class DocumentSearch
def initialize(documents)
@documents = documents
@index = build_index
end
def search(query, limit: 5)
query_embedding = RubyLLM.embed(query).vectors
@documents.map do |doc|
{
doc: doc,
similarity: cosine_similarity(query_embedding, doc.embedding)
}
end.sort_by { |d| -d[:similarity] }.first(limit)
end
private
def build_index
@documents.map do |doc|
{
doc: doc,
embedding: RubyLLM.embed(doc.content).vectors
}
end
end
def cosine_similarity(a, b)
dot = a.zip(b).sum { |x, y| x * y }
dot / (Math.sqrt(a.sum { |x| x**2 }) * Math.sqrt(b.sum { |y| y**2 }))
end
end
docs = Document.all
searcher = DocumentSearch.new(docs)
results = searcher.search("Ruby programming", limit: 3)
Rails Integration
With pgvector
class CreateDocuments < ActiveRecord::Migration[7.2]
def change
create_table :documents do |t|
t.text :content
t.vector :embedding, limit: 1536
end
add_index :documents, :embedding, using: :ivfflat, opclass: :vector_cosine_ops
end
end
class Document < ApplicationRecord
before_save :generate_embedding, if: :content_changed?
def self.search_similar(query, limit: 5)
query_embedding = RubyLLM.embed(query).vectors
where("embedding <=> :embedding < 0.5", embedding: query_embedding.to_s)
.order("embedding <=> :embedding", embedding: query_embedding)
.limit(limit)
end
private
def generate_embedding
self.embedding = RubyLLM.embed(content).vectors
end
end
Batch Processing
texts = Document.pluck(:content)
batches = texts.each_slice(100)
batches.each do |batch|
embeddings = RubyLLM.embed(batch)
end
Async Embeddings
require 'async'
Async do
documents.map do |doc|
Async do
doc.update(embedding: RubyLLM.embed(doc.content).vectors)
end
end.map(&:wait)
end
See Also
- Main RubyLLM: rubyllm
- RAG Pattern: See rubyllm-agents for workflow examples