Class: Maglev::Answerer
- Inherits:
-
Object
- Object
- Maglev::Answerer
- Defined in:
- lib/maglev/answerer.rb
Instance Method Summary collapse
- #ask(question, limit:, owner: nil, user: nil) ⇒ Object
-
#initialize(model_class, retriever: Retriever.new(model_class), generation_adapter: Maglev.configuration.generation_adapter, authorization: Authorization.new) ⇒ Answerer
constructor
A new instance of Answerer.
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 = 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.(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.(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 |