Spaces:
Sleeping
Sleeping
| """ | |
| 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() |