Spaces:
Sleeping
A newer version of the Gradio SDK is available:
6.9.0
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) Встановлення
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt