opex792 commited on
Commit
c5d3b95
·
verified ·
1 Parent(s): 496ca18

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +59 -69
app.py CHANGED
@@ -96,52 +96,45 @@ def encode_string(text, model, prompt=None):
96
  else:
97
  return model.encode(text, convert_to_tensor=True, normalize_embeddings=True, batch_size=batch_size)
98
 
99
- def process_movies(model, embeddings_file, movie_embeddings, movies_queue, processing_complete_flag, lock, model_name):
100
  """
101
  Обрабатывает фильмы из очереди, создавая для них эмбеддинги.
102
  """
 
 
103
  while True:
104
- if model_name == "HIT-TMG/KaLM-embedding-multilingual-mini-instruct-v1.5" and search_in_progress_kalm:
105
- time.sleep(1) # Ждем, пока поиск не завершится
106
- continue
107
- elif model_name == "BAAI/bge-m3" and search_in_progress_bge:
108
- time.sleep(1) # Ждем, пока поиск не завершится
109
- continue
110
-
111
- batch = []
112
- while not movies_queue.empty() and len(batch) < batch_size:
113
- try:
114
- movie = movies_queue.get(timeout=1)
115
- batch.append(movie)
116
- except queue.Empty:
117
- break
118
-
119
- if not batch:
120
- print(f"Очередь фильмов для {model_name} пуста.")
121
- if model_name == "HIT-TMG/KaLM-embedding-multilingual-mini-instruct-v1.5":
122
- global processing_complete_kalm
123
- processing_complete_kalm = True
124
- elif model_name == "BAAI/bge-m3":
125
- global processing_complete_bge
126
- processing_complete_bge = True
127
- break
128
-
129
- titles = [movie["name"] for movie in batch]
130
- embedding_strings = [
131
- f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
132
- for movie in batch
133
- ]
134
-
135
- print(f"Создаются эмбеддинги для фильмов ({model_name}): {', '.join(titles)}...")
136
- embeddings = model.encode(embedding_strings, convert_to_tensor=True, batch_size=batch_size, normalize_embeddings=True).tolist()
137
-
138
- with lock:
139
- for title, embedding in zip(titles, embeddings):
140
- movie_embeddings[title] = embedding
141
- # Сохраняем эмбеддинги в файл после обработки каждого пакета
142
- with open(embeddings_file, "w", encoding="utf-8") as f:
143
- json.dump(movie_embeddings, f, ensure_ascii=False, indent=4)
144
- print(f"Эмбеддинги для фильмов ({model_name}): {', '.join(titles)} созданы и сохранены.")
145
 
146
  print(f"Обработка фильмов для {model_name} завершена.")
147
 
@@ -164,7 +157,7 @@ def get_query_embedding(query, model, query_embeddings, query_embeddings_file, p
164
  print(f"Эмбеддинг для запроса '{query}' создан и сохранен.")
165
  return embedding
166
 
167
- def search_movies(query, model, movie_embeddings, movies_data, top_k=10, search_in_progress_flag=None, query_prompt=None):
168
  """
169
  Ищет наиболее похожие фильмы по запросу с использова��ием инструкции.
170
 
@@ -174,43 +167,38 @@ def search_movies(query, model, movie_embeddings, movies_data, top_k=10, search_
174
  movie_embeddings: Словарь с эмбеддингами фильмов.
175
  movies_data: Данные о фильмах.
176
  top_k: Количество возвращаемых результатов.
177
- search_in_progress_flag: Флаг, указывающий, что выполняется поиск.
178
 
179
  Returns:
180
  Строку с результатами поиска в формате HTML.
181
  """
182
- if search_in_progress_flag is not None:
183
- if model == model_kalm:
184
- global search_in_progress_kalm
185
  search_in_progress_kalm = True
186
- elif model == model_bge:
187
- global search_in_progress_bge
188
  search_in_progress_bge = True
 
189
  start_time = time.time()
190
  print(f"\n\033[1mПоиск по запросу: '{query}'\033[0m")
191
 
192
  print(f"Начало создания эмбеддинга для запроса: {time.strftime('%Y-%m-%d %H:%M:%S')}")
193
- if model == model_kalm:
194
- query_embedding_tensor = encode_string(query, model_kalm, prompt=query_prompt)
195
- else:
196
- query_embedding_tensor = encode_string(query, model)
197
-
198
  print(f"Окончание создания эмбеддинга для запроса: {time.strftime('%Y-%m-%d %H:%M:%S')}")
199
 
200
  if model == model_kalm:
201
- with movie_embeddings_lock_kalm:
202
- current_movie_embeddings = movie_embeddings.copy()
203
  elif model == model_bge:
204
- with movie_embeddings_lock_bge:
205
- current_movie_embeddings = movie_embeddings.copy()
206
 
207
  if not current_movie_embeddings:
208
- if search_in_progress_flag is not None:
209
- if model == model_kalm:
210
  search_in_progress_kalm = False
211
- elif model == model_bge:
212
  search_in_progress_bge = False
213
- return "<p>Пока что нет обработанных фильмов. Попробуйте позже.</p>"
214
 
215
  # Преобразуем эмбеддинги фильмов в тензор
216
  movie_titles = list(current_movie_embeddings.keys())
@@ -242,25 +230,27 @@ def search_movies(query, model, movie_embeddings, movies_data, top_k=10, search_
242
  end_time = time.time()
243
  execution_time = end_time - start_time
244
  print(f"Поиск завершен за {execution_time:.4f} секунд.")
245
- if search_in_progress_flag is not None:
246
- if model == model_kalm:
247
  search_in_progress_kalm = False
248
- elif model == model_bge:
249
  search_in_progress_bge = False
 
250
  return results_html
251
 
252
  # Потоки для обработки фильмов
253
- processing_thread_kalm = threading.Thread(target=process_movies, args=(model_kalm, embeddings_file_kalm, movie_embeddings_kalm, movies_queue_kalm, processing_complete_kalm, movie_embeddings_lock_kalm, model_name_kalm))
254
- processing_thread_bge = threading.Thread(target=process_movies, args=(model_bge, embeddings_file_bge, movie_embeddings_bge, movies_queue_bge, processing_complete_bge, movie_embeddings_lock_bge, model_name_bge))
255
 
256
  # Запускаем потоки для обработки фильмов
257
  processing_thread_kalm.start()
258
  processing_thread_bge.start()
259
 
260
  def search_with_kalm(query):
261
- return search_movies(query, model_kalm, movie_embeddings_kalm, movies_data, top_k=10, search_in_progress_flag=search_in_progress_kalm, query_prompt=query_prompt_kalm)
 
262
  def search_with_bge(query):
263
- return search_movies(query, model_bge, movie_embeddings_bge, movies_data, top_k=10, search_in_progress_flag=search_in_progress_bge)
264
 
265
  with gr.Blocks() as demo:
266
  with gr.Tab("KaLM"):
 
96
  else:
97
  return model.encode(text, convert_to_tensor=True, normalize_embeddings=True, batch_size=batch_size)
98
 
99
+ def process_movies(model, embeddings_file, movie_embeddings, movies_queue, lock, model_name):
100
  """
101
  Обрабатывает фильмы из очереди, создавая для них эмбеддинги.
102
  """
103
+ global processing_complete_kalm, processing_complete_bge # Добавлено
104
+
105
  while True:
106
+ batch = []
107
+ while not movies_queue.empty() and len(batch) < batch_size:
108
+ try:
109
+ movie = movies_queue.get(timeout=1)
110
+ batch.append(movie)
111
+ except queue.Empty:
112
+ break
113
+
114
+ if not batch:
115
+ print(f"Очередь фильмов для {model_name} пуста.")
116
+ if model_name == model_name_kalm:
117
+ processing_complete_kalm = True
118
+ elif model_name == model_name_bge:
119
+ processing_complete_bge = True
120
+ break
121
+
122
+ titles = [movie["name"] for movie in batch]
123
+ embedding_strings = [
124
+ f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
125
+ for movie in batch
126
+ ]
127
+
128
+ print(f"Создаются эмбеддинги для фильмов ({model_name}): {', '.join(titles)}...")
129
+ embeddings = model.encode(embedding_strings, convert_to_tensor=True, batch_size=batch_size, normalize_embeddings=True).tolist()
130
+
131
+ with lock:
132
+ for title, embedding in zip(titles, embeddings):
133
+ movie_embeddings[title] = embedding
134
+ # Сохраняем эмбеддинги в файл после обработки каждого пакета
135
+ with open(embeddings_file, "w", encoding="utf-8") as f:
136
+ json.dump(movie_embeddings, f, ensure_ascii=False, indent=4)
137
+ print(f"Эмбеддинги для фильмов ({model_name}): {', '.join(titles)} созданы и сохранены.")
 
 
 
 
 
 
 
 
 
138
 
139
  print(f"Обработка фильмов для {model_name} завершена.")
140
 
 
157
  print(f"Эмбеддинг для запроса '{query}' создан и сохранен.")
158
  return embedding
159
 
160
+ def search_movies(query, model, movie_embeddings, movies_data, query_embeddings, query_embeddings_file, top_k=10, query_prompt=None):
161
  """
162
  Ищет наиболее похожие фильмы по запросу с использова��ием инструкции.
163
 
 
167
  movie_embeddings: Словарь с эмбеддингами фильмов.
168
  movies_data: Данные о фильмах.
169
  top_k: Количество возвращаемых результатов.
170
+ query_prompt: Инструкция для запроса (для KaLM).
171
 
172
  Returns:
173
  Строку с результатами поиска в формате HTML.
174
  """
175
+ global search_in_progress_kalm, search_in_progress_bge # Добавлено
176
+
177
+ if model == model_kalm:
178
  search_in_progress_kalm = True
179
+ elif model == model_bge:
 
180
  search_in_progress_bge = True
181
+
182
  start_time = time.time()
183
  print(f"\n\033[1mПоиск по запросу: '{query}'\033[0m")
184
 
185
  print(f"Начало создания эмбеддинга для запроса: {time.strftime('%Y-%m-%d %H:%M:%S')}")
186
+ query_embedding_tensor = torch.tensor(get_query_embedding(query, model, query_embeddings, query_embeddings_file, prompt=query_prompt))
 
 
 
 
187
  print(f"Окончание создания эмбеддинга для запроса: {time.strftime('%Y-%m-%d %H:%M:%S')}")
188
 
189
  if model == model_kalm:
190
+ with movie_embeddings_lock_kalm:
191
+ current_movie_embeddings = movie_embeddings.copy()
192
  elif model == model_bge:
193
+ with movie_embeddings_lock_bge:
194
+ current_movie_embeddings = movie_embeddings.copy()
195
 
196
  if not current_movie_embeddings:
197
+ if model == model_kalm:
 
198
  search_in_progress_kalm = False
199
+ elif model == model_bge:
200
  search_in_progress_bge = False
201
+ return "<p>Пока что нет обработанных фильмов. Попробуйте позже.</p>"
202
 
203
  # Преобразуем эмбеддинги фильмов в тензор
204
  movie_titles = list(current_movie_embeddings.keys())
 
230
  end_time = time.time()
231
  execution_time = end_time - start_time
232
  print(f"Поиск завершен за {execution_time:.4f} секунд.")
233
+
234
+ if model == model_kalm:
235
  search_in_progress_kalm = False
236
+ elif model == model_bge:
237
  search_in_progress_bge = False
238
+
239
  return results_html
240
 
241
  # Потоки для обработки фильмов
242
+ processing_thread_kalm = threading.Thread(target=process_movies, args=(model_kalm, embeddings_file_kalm, movie_embeddings_kalm, movies_queue_kalm, movie_embeddings_lock_kalm, model_name_kalm))
243
+ processing_thread_bge = threading.Thread(target=process_movies, args=(model_bge, embeddings_file_bge, movie_embeddings_bge, movies_queue_bge, movie_embeddings_lock_bge, model_name_bge))
244
 
245
  # Запускаем потоки для обработки фильмов
246
  processing_thread_kalm.start()
247
  processing_thread_bge.start()
248
 
249
  def search_with_kalm(query):
250
+ return search_movies(query, model_kalm, movie_embeddings_kalm, movies_data, query_embeddings_kalm, query_embeddings_file_kalm, top_k=10, query_prompt=query_prompt_kalm)
251
+
252
  def search_with_bge(query):
253
+ return search_movies(query, model_bge, movie_embeddings_bge, movies_data, query_embeddings_bge, query_embeddings_file_bge, top_k=10)
254
 
255
  with gr.Blocks() as demo:
256
  with gr.Tab("KaLM"):