Class: Phronomy::KnowledgeSource::RAGKnowledge

Inherits:
Base
  • Object
show all
Defined in:
lib/phronomy/knowledge_source/rag_knowledge.rb

Overview

A KnowledgeSource that retrieves semantically relevant chunks from a VectorStore.

On each #fetch call, the query is embedded and the k nearest documents are returned as knowledge chunks.

Examples:

store = Phronomy::VectorStore::InMemory.new
embeddings = Phronomy::Embeddings::RubyLLMEmbeddings.new(model: "text-embedding-3-small")
ks = Phronomy::KnowledgeSource::RAGKnowledge.new(
  store: store,
  embeddings: embeddings,
  k: 5
)

Instance Method Summary collapse

Methods inherited from Base

#static?

Constructor Details

#initialize(store:, embeddings:, k: 5, type: :rag, source: nil) ⇒ RAGKnowledge

Returns a new instance of RAGKnowledge.

Parameters:

  • store (Phronomy::VectorStore::Base)

    vector store holding documents

  • embeddings (Phronomy::Embeddings::Base)

    embeddings adapter

  • k (Integer) (defaults to: 5)

    number of chunks to retrieve

  • type (Symbol) (defaults to: :rag)

    semantic tag (default :rag)

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

    default source label; falls back to each document's :source metadata when nil



25
26
27
28
29
30
31
# File 'lib/phronomy/knowledge_source/rag_knowledge.rb', line 25

def initialize(store:, embeddings:, k: 5, type: :rag, source: nil)
  @store = store
  @embeddings = embeddings
  @k = k
  @type = type
  @source = source
end

Instance Method Details

#fetch(query: nil) ⇒ Array<Hash>

Embed the query and retrieve the k nearest chunks from the vector store.

Returns an empty array when query is nil or blank.

Parameters:

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

Returns:

  • (Array<Hash>)


39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/phronomy/knowledge_source/rag_knowledge.rb', line 39

def fetch(query: nil)
  return [] if query.nil? || query.strip.empty?

  vector = @embeddings.embed(query)
  results = @store.search(query_embedding: vector, k: @k)
  results.map do |doc|
    chunk = {content: doc[:metadata][:content], type: @type}
    src = @source || doc[:metadata][:source]
    chunk[:source] = src if src
    chunk
  end
end