rag / app.py
arrividerci666's picture
Update app.py
8ffdd1a verified
Raw
History Blame Contribute Delete
3.46 kB
"""
Gradio UI для RAG QA.
- ключ Groq береться із секрету GROQ_API_KEY; поле в UI — fallback;
- перемикачі: BM25 / dense / reranker;
- вивід відповіді з цитатами [n] + перелік пронумерованих чанків.
"""
import os
import gradio as gr
import rag
SECRET_KEY = os.environ.get("GROQ_API_KEY", "")
print("Loading corpus + building indexes...")
CHUNKS = rag.load_corpus()
RETR = rag.Retrievers(CHUNKS)
RERANKER = rag.Reranker()
print(f"Ready. {len(CHUNKS)} chunks indexed.")
def run(query, api_key, use_bm25, use_dense, use_reranker):
query = (query or "").strip()
if not query:
return "Введіть запитання.", ""
# секрет має пріоритет; поле UI — лише запасний варіант
key = SECRET_KEY or (api_key or "").strip()
if not key:
return "Groq-ключ не заданий (ні в секреті, ні в полі).", ""
candidates = RETR.search(query, k=8, use_bm25=use_bm25, use_dense=use_dense)
if not candidates:
return "Увімкніть хоча б один метод пошуку.", ""
final = RERANKER.rerank(query, candidates, top_n=4) if use_reranker else candidates[:4]
try:
ans = rag.answer(query, final, api_key=key)
except Exception as e:
return f"Помилка виклику Groq: {e}", ""
sources = "\n\n".join(
f"**[{i + 1}]** ({c.source})\n{c.text}" for i, c in enumerate(final)
)
return ans, sources
with gr.Blocks(title="RAG Question Answering") as demo:
gr.Markdown(
"# RAG Question Answering\n"
"Система відповідає на запитання, спираючись на статті з "
"`rag-mini-wikipedia`. Пошук релевантних чанків — BM25 (ключові слова) "
"та семантичний (dense), з опційним cross-encoder реранкером. "
"Відповідь генерує Groq LLM і цитує джерела у форматі `[n]`."
)
with gr.Row():
with gr.Column(scale=2):
query = gr.Textbox(label="Запитання", placeholder="Was Abraham Lincoln a president?")
api_key = gr.Textbox(
label="Groq API key", type="password", placeholder="gsk_...",
visible=not SECRET_KEY,
)
with gr.Row():
use_bm25 = gr.Checkbox(value=True, label="BM25 (ключові слова)")
use_dense = gr.Checkbox(value=True, label="Dense (семантичний)")
use_reranker = gr.Checkbox(value=True, label="Reranker")
btn = gr.Button("Запитати", variant="primary")
with gr.Column(scale=3):
answer_box = gr.Markdown(label="Відповідь")
sources_box = gr.Markdown(label="Джерела")
btn.click(run, [query, api_key, use_bm25, use_dense, use_reranker],
[answer_box, sources_box])
gr.Examples(
examples=[
["How did Abraham Lincoln's life come to an end?"],
["Who was Lincoln's Secretary of War?"],
["What did Lincoln do about slavery during his presidency?"],
["What programming language was used to build this app?"],
],
inputs=query,
)
if __name__ == "__main__":
demo.launch()