Felipe Albernaz
Assistente RAG do setor de energia (gemma-search + gemma-naive-rag)
abdb45a
Raw
History Blame Contribute Delete
3.72 kB
"""Assistente RAG do setor de energia.
Dois modelos selecionáveis (só um carregado por vez):
- gemma-search: agêntico (search_document -> document_query -> resposta).
- gemma-naive-rag: RAG simples (consultar_base_conhecimento -> resposta).
"""
import logging
import streamlit as st
import config
from backend import ensure_llm, load_retriever, run_agent, run_naive_agent
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
st.set_page_config(layout="centered", page_title="Assistente RAG - Energia", page_icon="⚡")
st.title("Case Mobile")
# ---------------------------------------------------------------------------
# Seletor de modelo
# ---------------------------------------------------------------------------
model_key = st.selectbox(
"Modelo",
list(config.MODELS.keys()),
index=list(config.MODELS).index(config.DEFAULT_MODEL),
)
# Trocar de modelo limpa o histórico (contexto/fluxo diferente)
if st.session_state.get("ui_model_key") != model_key:
st.session_state.history = []
st.session_state.ui_model_key = model_key
# ---------------------------------------------------------------------------
# Carregamento (retriever cacheado; LLM trocado conforme o seletor)
# ---------------------------------------------------------------------------
if "retriever" not in st.session_state:
with st.spinner("Carregando banco vetorial (1º start baixa o banco; pode demorar)..."):
st.session_state.retriever = load_retriever()
if st.session_state.get("llm_key") != model_key:
with st.spinner(f"Carregando modelo '{model_key}' (descarrega o anterior; pode demorar)..."):
ensure_llm(model_key)
model = st.session_state.llm_model
tokenizer = st.session_state.llm_tokenizer
if "history" not in st.session_state:
st.session_state.history = [] # lista de (pergunta, resposta)
# Histórico
for pergunta, resposta in st.session_state.history:
with st.chat_message("user"):
st.markdown(pergunta)
with st.chat_message("assistant"):
st.markdown(resposta)
def _format_event(name: str, args: dict) -> str:
if name == "search_document":
return f"🔎 **search_document** — `{args.get('query', '')}`"
if name == "document_query":
return (
f"📄 **document_query** — `{args.get('document_id', '')}` "
f"· _{args.get('query', '')}_"
)
if name == "consultar_base_conhecimento":
return f"🔎 **consultar_base_conhecimento** — `{args.get('termo_busca', '')}`"
return f"🛠️ **{name}** — `{args}`"
if pergunta := st.chat_input("Pergunte sobre as regulamentações do setor de energia..."):
with st.chat_message("user"):
st.markdown(pergunta)
runner = run_naive_agent if config.MODELS[model_key]["flow"] == "naive" else run_agent
with st.chat_message("assistant"):
with st.status("Consultando a base de conhecimento...", expanded=True) as status:
def on_event(name, args):
status.write(_format_event(name, args))
try:
resposta = runner(
model,
tokenizer,
st.session_state.retriever,
pergunta,
on_event=on_event,
)
status.update(label="Concluído", state="complete", expanded=False)
except Exception as exc:
logging.exception("Erro no agente")
resposta = f"Ocorreu um erro ao processar a pergunta: {exc}"
status.update(label="Erro", state="error")
st.markdown(resposta)
st.session_state.history.append((pergunta, resposta))