militarybearz commited on
Commit
2bf58bd
·
verified ·
1 Parent(s): 37c9b76

Upload 3 files

Browse files
Files changed (3) hide show
  1. README.md +165 -0
  2. app.py +262 -0
  3. requirements.txt +10 -0
README.md ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: BGE Reranker v2-m3
3
+ emoji: 🔍
4
+ colorFrom: blue
5
+ colorTo: purple
6
+ sdk: gradio
7
+ sdk_version: "4.44.0"
8
+ app_file: app.py
9
+ pinned: false
10
+ license: apache-2.0
11
+ short_description: Advanced document reranking with BAAI/bge-reranker-v2-m3
12
+ tags:
13
+ - reranking
14
+ - information-retrieval
15
+ - nlp
16
+ - search
17
+ - text-similarity
18
+ ---
19
+
20
+ # 🔍 BGE Reranker v2-m3
21
+
22
+ Мощный сервис для реранжирования документов на основе модели **BAAI/bge-reranker-v2-m3** от Beijing Academy of Artificial Intelligence.
23
+
24
+ ## 🚀 Возможности
25
+
26
+ - **Высокая точность**: Использует современную модель BGE reranker v2-m3
27
+ - **Простой интерфейс**: Веб-интерфейс для быстрого тестирования
28
+ - **Batch обработка**: Обработка до 100 документов одновременно
29
+ - **Гибкая настройка**: Выбор количества топ результатов
30
+ - **Быстрая работа**: Оптимизированная для CPU обработка
31
+
32
+ ## 📖 Описание модели
33
+
34
+ **BAAI/bge-reranker-v2-m3** - это современная модель для реранжирования документов, которая:
35
+
36
+ - Поддерживает многоязычные тексты
37
+ - Показывает высокую точность на бенчмарках
38
+ - Оптимизирована для информационного поиска
39
+ - Может работать с документами различной длины
40
+
41
+ ## 🔧 Как использовать
42
+
43
+ ### Веб-интерфейс
44
+
45
+ 1. **Введите запрос**: Напишите поисковый запрос в текстовое поле
46
+ 2. **Добавьте документы**: Вставьте документы, каждый на новой строке
47
+ 3. **Настройте параметры**: Выберите количество результатов для возврата
48
+ 4. **Получите результаты**: Нажмите "Реранжировать" и получите отсортированные документы
49
+
50
+ ### Программный доступ
51
+
52
+ Вы можете использовать этот Space через Gradio Client:
53
+
54
+ ```python
55
+ from gradio_client import Client
56
+
57
+ client = Client("your-space-url")
58
+
59
+ query = "машинное обучение"
60
+ documents = """Глубокое обучение - это подраздел машинного обучения
61
+ Рецепт борща с капустой и свеклой
62
+ Нейронные сети используются в машинном обучении
63
+ Алгоритмы классификации в машинном обучении"""
64
+
65
+ result = client.predict(
66
+ query, # поисковый запрос
67
+ documents, # документы
68
+ 5, # top_k
69
+ api_name="/predict"
70
+ )
71
+
72
+ print(result)
73
+ ```
74
+
75
+ ## 📊 Примеры использования
76
+
77
+ ### Поиск в документах
78
+
79
+ **Запрос:** "искусственный интеллект"
80
+
81
+ **Документы:**
82
+ ```
83
+ Машинное обучение и ИИ меняют мир
84
+ История развития компьютеров
85
+ Нейронные сети в современной науке
86
+ Рецепты приготовления пиццы
87
+ Применение ИИ в медицине
88
+ ```
89
+
90
+ **Результат:** Документы будут отсортированы по релевантности к запросу об ИИ.
91
+
92
+ ### Семантический поиск
93
+
94
+ **Запрос:** "как готовить еду"
95
+
96
+ **Документы:**
97
+ ```
98
+ Инструкция по приготовлению борща
99
+ Физические законы термодинамики
100
+ Рецепт итальянской пасты
101
+ Химические реакции в кулинарии
102
+ История развития кулинарного искусства
103
+ ```
104
+
105
+ **Результат:** Кулинарные документы получат более высокие оценки релевантности.
106
+
107
+ ## ⚙️ Технические детали
108
+
109
+ ### Архитектура
110
+
111
+ - **Модель**: BAAI/bge-reranker-v2-m3
112
+ - **Backend**: Gradio + FlagEmbedding
113
+ - **Precision**: FP16 для ускорения инференса
114
+ - **Device**: CPU (подходит для HF Spaces)
115
+
116
+ ### Ограничения
117
+
118
+ - Максимум 100 документов за один запрос
119
+ - Длина документа ограничена контекстным окном модели
120
+ - Время обработки зависит от количества и длины документов
121
+
122
+ ### Производительность
123
+
124
+ - **Скорость**: ~1-5 секунд для 10-50 документов
125
+ - **Точность**: State-of-the-art результаты ��а бенчмарках
126
+ - **Память**: Оптимизировано для работы в ограниченных ресурсах
127
+
128
+ ## 🔗 Интеграция с LightRAG
129
+
130
+ Этот реранкер предназначен для интеграции с проектом LightRAG:
131
+
132
+ ```python
133
+ from lightrag.rerank import HuggingFaceReranker
134
+
135
+ # Инициализация реранкера
136
+ reranker = HuggingFaceReranker(
137
+ model_name="BAAI/bge-reranker-v2-m3",
138
+ space_url="your-space-url"
139
+ )
140
+
141
+ # Использование в RAG пайплайне
142
+ reranked_docs = reranker.rerank(query, documents, top_k=5)
143
+ ```
144
+
145
+ ## 📝 Лицензия
146
+
147
+ Этот проект использует модель под лицензией Apache 2.0. Модель BAAI/bge-reranker-v2-m3 также доступна под открытой лицензией.
148
+
149
+ ## 🤝 Вклад в проект
150
+
151
+ Этот Space является частью проекта LightRAG. Для участия в разработке:
152
+
153
+ 1. Посетите [репозиторий LightRAG](https://github.com/HKUDS/LightRAG)
154
+ 2. Создайте Issue или Pull Request
155
+ 3. Следуйте гайдлайнам проекта
156
+
157
+ ## 📚 Дополнительные ресурсы
158
+
159
+ - [Документация FlagEmbedding](https://github.com/FlagOpen/FlagEmbedding)
160
+ - [Статья о BGE моделях](https://arxiv.org/abs/2309.07597)
161
+ - [LightRAG Documentation](https://github.com/HKUDS/LightRAG/blob/main/README.md)
162
+
163
+ ---
164
+
165
+ **Создано для проекта LightRAG** 🚀
app.py ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import logging
3
+ from typing import List, Dict, Any, Tuple
4
+ import json
5
+ import asyncio
6
+ from concurrent.futures import ThreadPoolExecutor
7
+ import time
8
+
9
+ # Configure logging
10
+ logging.basicConfig(level=logging.INFO)
11
+ logger = logging.getLogger(__name__)
12
+
13
+ # Global variables for model
14
+ reranker = None
15
+ executor = ThreadPoolExecutor(max_workers=4)
16
+
17
+ def load_model():
18
+ """Load the BGE reranker model"""
19
+ global reranker
20
+ try:
21
+ from FlagEmbedding import FlagReranker
22
+ logger.info("Loading BAAI/bge-reranker-v2-m3 model...")
23
+
24
+ reranker = FlagReranker(
25
+ 'BAAI/bge-reranker-v2-m3',
26
+ use_fp16=True, # Use FP16 for faster inference
27
+ device='cpu' # HF Spaces typically use CPU
28
+ )
29
+ logger.info("Model loaded successfully!")
30
+ return True
31
+ except Exception as e:
32
+ logger.error(f"Error loading model: {str(e)}")
33
+ return False
34
+
35
+ def rerank_documents(query: str, documents: List[str], top_k: int = None) -> List[Dict[str, Any]]:
36
+ """
37
+ Rerank documents based on relevance to query
38
+
39
+ Args:
40
+ query: Search query
41
+ documents: List of documents to rerank
42
+ top_k: Number of top documents to return (None for all)
43
+
44
+ Returns:
45
+ List of documents with scores, sorted by relevance
46
+ """
47
+ global reranker
48
+
49
+ if reranker is None:
50
+ raise ValueError("Model not loaded. Please wait for initialization.")
51
+
52
+ if not documents:
53
+ return []
54
+
55
+ try:
56
+ # Prepare pairs for reranking
57
+ pairs = [[query, doc] for doc in documents]
58
+
59
+ # Get scores
60
+ scores = reranker.compute_score(pairs)
61
+
62
+ # Handle single document case
63
+ if not isinstance(scores, list):
64
+ scores = [scores]
65
+
66
+ # Combine documents with scores
67
+ doc_scores = [
68
+ {
69
+ "text": doc,
70
+ "score": float(score),
71
+ "index": idx
72
+ }
73
+ for idx, (doc, score) in enumerate(zip(documents, scores))
74
+ ]
75
+
76
+ # Sort by score (descending)
77
+ doc_scores.sort(key=lambda x: x["score"], reverse=True)
78
+
79
+ # Return top_k if specified
80
+ if top_k is not None:
81
+ doc_scores = doc_scores[:top_k]
82
+
83
+ return doc_scores
84
+
85
+ except Exception as e:
86
+ logger.error(f"Error during reranking: {str(e)}")
87
+ raise
88
+
89
+ def format_results(results: List[Dict[str, Any]]) -> str:
90
+ """Format reranking results for display"""
91
+ if not results:
92
+ return "No results to display."
93
+
94
+ formatted = "🔍 **Результаты реранжирования:**\n\n"
95
+
96
+ for i, result in enumerate(results, 1):
97
+ score = result["score"]
98
+ text = result["text"]
99
+ original_idx = result["index"]
100
+
101
+ # Truncate long texts for display
102
+ display_text = text[:200] + "..." if len(text) > 200 else text
103
+
104
+ formatted += f"**{i}. Документ #{original_idx + 1}** (Score: {score:.4f})\n"
105
+ formatted += f"{display_text}\n\n"
106
+
107
+ return formatted
108
+
109
+ def gradio_rerank(query: str, documents_text: str, top_k: int) -> Tuple[str, str]:
110
+ """Gradio interface function for reranking"""
111
+ try:
112
+ if not query.strip():
113
+ return "❌ Введите поисковый запрос", ""
114
+
115
+ if not documents_text.strip():
116
+ return "❌ Введите документы для реранжирования", ""
117
+
118
+ # Parse documents (one per line)
119
+ documents = [doc.strip() for doc in documents_text.split('\n') if doc.strip()]
120
+
121
+ if len(documents) == 0:
122
+ return "❌ Не найдено документов для обработки", ""
123
+
124
+ if len(documents) > 100:
125
+ return "❌ Слишком много документов (максимум 100)", ""
126
+
127
+ # Perform reranking
128
+ start_time = time.time()
129
+ results = rerank_documents(query, documents, top_k if top_k > 0 else None)
130
+ end_time = time.time()
131
+
132
+ # Format results
133
+ formatted_results = format_results(results)
134
+
135
+ # Prepare stats
136
+ stats = f"""
137
+ 📊 **Статистика обработки:**
138
+ - Количество документов: {len(documents)}
139
+ - Возвращено результатов: {len(results)}
140
+ - Время обработки: {end_time - start_time:.2f} сек
141
+ - Модель: BAAI/bge-reranker-v2-m3
142
+ """
143
+
144
+ return formatted_results, stats
145
+
146
+ except Exception as e:
147
+ error_msg = f"❌ Ошибка при обработке: {str(e)}"
148
+ logger.error(error_msg)
149
+ return error_msg, ""
150
+
151
+ def create_gradio_interface():
152
+ """Create Gradio interface"""
153
+
154
+ with gr.Blocks(
155
+ title="BGE Reranker v2-m3",
156
+ theme=gr.themes.Soft(),
157
+ css="""
158
+ .container { max-width: 1200px; margin: auto; }
159
+ .highlight { background-color: #f0f9ff; padding: 10px; border-radius: 5px; }
160
+ """
161
+ ) as demo:
162
+
163
+ gr.Markdown("""
164
+ # 🔍 BGE Reranker v2-m3
165
+
166
+ Этот сервис использует модель **BAAI/bge-reranker-v2-m3** для реранжирования документов по релевантности к поисковому запросу.
167
+
168
+ ## Как использовать:
169
+ 1. 📝 Введите поисковый запрос
170
+ 2. 📄 Добавьте документы (каждый документ на новой строке)
171
+ 3. 🔢 Укажите количество топ результатов (0 = все)
172
+ 4. 🚀 Нажмите "Реранжировать"
173
+ """)
174
+
175
+ with gr.Row():
176
+ with gr.Column(scale=2):
177
+ query_input = gr.Textbox(
178
+ label="🔍 Поисковый запрос",
179
+ placeholder="Введите ваш поисковый запрос здесь...",
180
+ lines=2
181
+ )
182
+
183
+ documents_input = gr.Textbox(
184
+ label="📄 Документы для реранжирования",
185
+ placeholder="Вставьте документы здесь, каждый на новой строке...",
186
+ lines=10
187
+ )
188
+
189
+ with gr.Row():
190
+ top_k_input = gr.Number(
191
+ label="📊 Количество топ результатов",
192
+ value=5,
193
+ minimum=0,
194
+ maximum=100,
195
+ step=1
196
+ )
197
+
198
+ rerank_btn = gr.Button("🚀 Реранжировать", variant="primary")
199
+
200
+ with gr.Row():
201
+ with gr.Column():
202
+ results_output = gr.Markdown(label="📋 Результаты")
203
+ stats_output = gr.Markdown(label="📊 Статистика")
204
+
205
+ # Event handlers
206
+ rerank_btn.click(
207
+ fn=gradio_rerank,
208
+ inputs=[query_input, documents_input, top_k_input],
209
+ outputs=[results_output, stats_output]
210
+ )
211
+
212
+ # Example
213
+ gr.Markdown("""
214
+ ## 💡 Пример использования:
215
+
216
+ **Запрос:** `машинное обучение`
217
+
218
+ **Документы:**
219
+ ```
220
+ Глубокое обучение - это подраздел машинного обучения
221
+ Рецепт борща с капустой и свеклой
222
+ Нейронные сети используются в машинном обучении
223
+ Как выбрать автомобиль в 2024 году
224
+ Алгоритмы классификации в машинном обучении
225
+ ```
226
+ """)
227
+
228
+ return demo
229
+
230
+ # Initialize model on startup
231
+ logger.info("Initializing BGE Reranker service...")
232
+ model_loaded = load_model()
233
+
234
+ if model_loaded:
235
+ logger.info("Creating Gradio interface...")
236
+ demo = create_gradio_interface()
237
+
238
+ if __name__ == "__main__":
239
+ demo.launch(
240
+ server_name="0.0.0.0",
241
+ server_port=7860,
242
+ share=False,
243
+ show_error=True
244
+ )
245
+ else:
246
+ logger.error("Failed to load model. Cannot start service.")
247
+
248
+ # Create error interface
249
+ def create_error_interface():
250
+ with gr.Blocks() as error_demo:
251
+ gr.Markdown("""
252
+ # ❌ Ошибка загрузки модели
253
+
254
+ Не удалось загрузить модель BAAI/bge-reranker-v2-m3.
255
+ Пожалуйста, проверьте логи для получения подробной информации.
256
+ """)
257
+ return error_demo
258
+
259
+ demo = create_error_interface()
260
+
261
+ if __name__ == "__main__":
262
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ gradio>=4.44.0
2
+ FlagEmbedding>=1.3.3
3
+ # torch will be installed as a dependency; default CPU wheel is fine on HF Spaces
4
+ torch>=2.3.0
5
+ transformers>=4.44.0
6
+ huggingface-hub>=0.23.0
7
+ numpy>=1.24.0
8
+ accelerate>=0.25.0
9
+ sentencepiece>=0.1.99
10
+