Spaces:
Sleeping
Sleeping
| title: RAG QA (BM25 + Dense + Reranker) | |
| emoji: 🔎 | |
| colorFrom: indigo | |
| colorTo: pink | |
| sdk: gradio | |
| sdk_version: "6.1.0" | |
| python_version: "3.10" | |
| app_file: app.py | |
| pinned: false | |
| short_description: RAG QA demo BM25 + Dense + reranker | |
| # RAG QA (BM25 + Dense + OpenAI-compatible providers) | |
| Це навчальний проєкт **Retrieval-Augmented Generation (RAG)** для задачі **Question Answering**: система знаходить релевантні уривки в корпусі документів і відповідає на питання, спираючись лише на знайдений контекст. :contentReference[oaicite:2]{index=2} | |
| ## Demo | |
| - Hugging Face Space: *(посилання після деплою)* | |
| - GitHub: https://github.com/DunasAnastasiia/llm-chat-project | |
| --- | |
| ## Як працює система (архітектура) | |
| **Джерело даних (Dataset)** | |
| - Hugging Face dataset: `rag-datasets/rag-mini-wikipedia` :contentReference[oaicite:3]{index=3} | |
| **Chunking** | |
| - Простий character-based chunking з overlap: `chunk_chars=900`, `overlap_chars=150` | |
| **Retriever** | |
| - **BM25** (лексичний пошук по ключових словах) | |
| - **Dense retrieval** (Sentence-Transformers embeddings) | |
| - Можна **вмикати/вимикати** BM25 та Dense окремо (для порівняння якості). | |
| **Reranker (optional)** | |
| - Cross-encoder `cross-encoder/ms-marco-MiniLM-L-6-v2` для реранкінгу кандидатів (опціонально). | |
| **LLM (Generation)** | |
| - Використовується **OpenAI-compatible Chat Completions API** через бібліотеку `openai` із параметром `base_url`. | |
| - Працює з провайдерами типу **Groq** / **OpenRouter** (ключ вводиться в UI). | |
| **Citations** | |
| - В промпті LLM проситься цитувати чанки як `[1] [2] ...`, а в UI показується список retrieved chunks з `source_id` / `chunk_id`. | |
| **UI** | |
| - Gradio (web app), тумблери `Use BM25 / Use Dense / Use Reranker`, поле для API key. :contentReference[oaicite:9]{index=9} | |
| ## Приклади запитів: де BM25 кращий, а де Dense | |
| ### Запити, де краще справляється BM25 | |
| **Q:** Was Abraham Lincoln the first President of the United States? | |
| **Очікувана відповідь:** No | |
| **Чому BM25 кращий:** запит містить дуже конкретні ключові слова (Abraham Lincoln, first President, United States). BM25 добре працює, коли відповідь лежить у чанку з тими самими словами/формулюванням. | |
| **Q:** Who was the general in charge at the Battle of Antietam? | |
| **Очікувана відповідь:** General McClellan | |
| **Чому BM25 кращий:** тут є точні “якорі” (Battle of Antietam, general in charge). BM25 зазвичай підтягує уривок, де ці терміни зустрічаються буквально. | |
| --- | |
| ### Запити, де кращі результати повертає Dense retriever | |
| **Q:** Who assassinated Lincoln? | |
| **Очікувана відповідь:** John Wilkes Booth | |
| **Чому dense кращий:** типовий приклад “семантичного” запиту — відповідь може бути в уривку, який не повторює точну форму запиту (наприклад, “Lincoln was assassinated by …”). Dense краще ловить перефразування й зв’язки “подія ↔ учасник”. | |
| **Q:** What caused Calvin Jr.'s death? | |
| **Очікувана відповідь:** heart attack | |
| **Чому dense кращий:** питання може збігатися з текстом не дослівно (наприклад, у корпусі “died of a heart attack”). Dense часто краще дістає такі уривки навіть без точного збігу слів. | |
| --- | |
| ## Швидкий старт локально | |
| ### 1) Встановлення | |
| ```bash | |
| python -m venv .venv | |
| source .venv/bin/activate # Windows: .venv\Scripts\activate | |
| pip install -r requirements.txt | |