Class: Maglev::Answerer

Inherits:
Object
  • Object
show all
Defined in:
lib/maglev/answerer.rb

Instance Method Summary collapse

Constructor Details

#initialize(model_class, retriever: Retriever.new(model_class), generation_adapter: Maglev.configuration.generation_adapter, authorization: Authorization.new) ⇒ Answerer

Returns a new instance of Answerer.



14
15
16
17
18
19
20
21
# File 'lib/maglev/answerer.rb', line 14

def initialize(model_class, retriever: Retriever.new(model_class),
  generation_adapter: Maglev.configuration.generation_adapter,
  authorization: Authorization.new)
  @model_class = model_class
  @retriever = retriever
  @generation_adapter = generation_adapter || Adapters::RubyLLMGeneration.new
  @authorization = authorization
end

Instance Method Details

#ask(question, limit:, owner: nil, user: nil) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/maglev/answerer.rb', line 23

def ask(question, limit:, owner: nil, user: nil)
  @authorization.authorize(record: owner, user: user) if owner

  results = if user
    @retriever.search(question, limit: limit, owner: owner, user: user)
  else
    @retriever.search(question, limit: limit, owner: owner)
  end
  results = results.select { |result| @authorization.authorized?(record: result.owner, user: user) }
  return Response.insufficient_context(question: question) if results.empty?

  context = nil
  ActiveSupport::Notifications.instrument("maglev.query.retrieval", model: @model_class.name, result_count: results.size) do
    context = ContextAssembler.new.assemble(results)
  end
  return Response.insufficient_context(question: question) if context.sources.empty?

  prompt = PromptBuilder.new.build(question: question, context: context.text)
  text = nil
  ActiveSupport::Notifications.instrument("maglev.query.generation", model: @model_class.name) do
    text = ProviderCall.new.call(operation: "generate") { @generation_adapter.generate(prompt) }
  end
  Response.new(
    text: text,
    sources: context.sources,
    metadata: context..merge(question: question, owner_scope: owner && owner_scope(owner))
  )
end