Uma engine Rails que permite consultar o banco de dados com linguagem natural, usando RAG e LLMs. Sem precisar escrever cĂłdigo.
Todo projeto Rails chega num ponto em que alguém do time (produto, suporte, gestão, etc.) precisa de um dado, mas ninguém tem tempo de parar para compreender a necessidade e escrever uma query. A mensagem no Slack, o card aberto, o pedido de CSV que some no backlog. Quem nunca.
Foi isso que me fez pensar no Glancer.
Glancer Ă© uma engine Ruby on Rails que monta uma interface de chat em /glancer
dentro da sua aplicação. VocĂȘ digita uma pergunta em linguagem natural, ele busca o contexto relevante do sistema, gera um SELECT
(ou uma expressão ActiveRecord), valida, executa com segurança e retorna o resultado.
"Quantos pedidos foram feitos nos Ășltimos 30 dias, agrupados por status?"
â SELECT executado, resultados exibidos, resposta escrita em portuguĂȘs.
A inspiração direta foi o Blazer, uma gem que jĂĄ usei bastante. A ideia aqui Ă© dar um passo a mais: em vez de escrever o SQL, vocĂȘ sĂł pergunta.
Adicione no Gemfile
:
gem "glancer"
Execute o gerador:
rails generate glancer:install
rails db:migrate
rails glancer:index:all
Acesse /glancer
e comece a perguntar.
O gerador cria um initializer onde vocĂȘ configura o provider de LLM. Uma configuração mĂnima com Gemini:
Glancer.configure do |config|
config.llm_provider = :gemini
config.llm_model = "gemini-2.0-flash"
config.gemini_api_key = ENV["GEMINI_API_KEY"]
config.schema_permission = true
end
OpenAI e OpenRouter também são suportados. Ela roda em cima do RubyLLM então os modelos que ele suportar, o Glancer suportarå. Då para usar modelos diferentes por papel, por exemplo, um modelo mais capaz para gerar a query e um mais barato para escrever a resposta.
Alguns pontos que vale conhecer:
Segurança por padrão: Toda query roda dentro de uma transaction que sempre faz rollback. Um blocklist de palavras rejeita DELETE
, UPDATE
, INSERT
, DROP
e afins antes mesmo de chegar no executor. TambĂ©m Ă© possĂvel apontar para uma rĂ©plica de leitura.
Sem infraestrutura adicional: Os embeddings ficam no seu banco existente, numa coluna JSON. Sem Pinecone, sem Weaviate, sem nada extra para subir. Raramente serĂĄ muita coisa, por isso essa abordagem.
Ensina o contexto do seu negĂłcio. VocĂȘ coloca um arquivo Markdown em config/glancer/llm_context.glancer.md
e explica as regras do domĂnio: o que os valores de status
significam, como a receita Ă© calculada, quais colunas/tabelas/modelos ignorar, etc:
- `orders.status`: "pending" | "paid" | "shipped" | "refunded"
- Receita mensal = SUM(orders.total) WHERE status = "paid"
- Para perguntas sobre "churn", usar a coluna `churned_at` em `subscriptions`
InformaçÔes adicionais mais dinùmicas podem ser adicionadas em um campo texto nas configuraçÔes. Entretanto, não serå gerado embedding disso pois serå utilizado de contexto ao modelo base.
A interface tem uns detalhes legais. Os resultados aparecem em tabela com export CSV de um clique. Gråficos são gerados automaticamente quando fazem sentido. O processo de execução foi pensado para não travar a thread principal da aplicação. Då para digitar @nome_da_tabela
para fixar e ser mais assertivo sobre uma tabela especĂfica na pergunta, editar o SQL gerado e reexecutar, e atĂ© ditar a pergunta pelo microfone. Tem tambĂ©m um visualizador de schema em /glancer/db-schema
.
Integração com Blazer. Se vocĂȘ jĂĄ usa o Blazer, o Glancer mostra um botĂŁo para abrir o SQL gerado direto lĂĄ.
Comecei isso como projeto de estudo. Estudei bastante sobre RAG e LLMs ao longo do ano passado e quando a ideia surgiu eu nunca tinha publicado uma gem antes e queria experimentar o processo completo, de engine a gemspec a CI. Com isso, juntei o Ăștil ao agradĂĄvel. Como mostrei para alguns colegas e eles acharam Ăștil, entĂŁo decidi abrir para a comunidade.
Atualmente estĂĄ na versĂŁo 1.0.0.
Se vocĂȘ testar, adoraria saber o que achou, seja sobre o cĂłdigo ou sobre a ideia. Issues e pull requests sĂŁo bem-vindos.
Se gostar do projeto, uma estrela no repositĂłrio ajuda bastante a divulgar para mais pessoas da comunidade.
GitHub: https://github.com/ErnaneJ/glancer
RubyGems: https://rubygems.org/gems/glancer