opex792 commited on
Commit
153b40f
·
verified ·
1 Parent(s): f13beaa

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +36 -42
app.py CHANGED
@@ -38,10 +38,12 @@ logging.info(f"Загрузка модели {model_name}...")
38
  model = SentenceTransformer(model_name)
39
  logging.info("Модель загружена успешно.")
40
 
41
- # Jina AI API Key
42
- JINA_API_KEY = os.environ.get("JINA_API_KEY")
 
43
  if JINA_API_KEY is None:
44
  raise ValueError("JINA_API_KEY environment variable not set.")
 
45
 
46
  # Имена таблиц
47
  embeddings_table = "movie_embeddings"
@@ -78,9 +80,6 @@ batch_size = 32
78
  # Количество потоков для параллельной обработки
79
  num_threads = 5
80
 
81
- # Количество потоков для параллельного реранкинга (Jina AI не имеет жестких ограничений)
82
- rerank_threads = 5
83
-
84
  def get_db_connection():
85
  """Устанавливает соединение с базой данных."""
86
  try:
@@ -298,14 +297,9 @@ def get_movie_embeddings(conn):
298
  logging.error(f"Ошибка при загрузке эмбеддингов фильмов: {e}")
299
  return movie_embeddings
300
 
301
- def rerank_with_jina(query, results, top_n):
302
- """Переранжирует результаты с помощью Jina AI."""
303
- url = 'https://api.jina.ai/v1/rerank'
304
- headers = {
305
- 'Content-Type': 'application/json',
306
- 'Authorization': f'Bearer {JINA_API_KEY}'
307
- }
308
-
309
  documents = []
310
  for movie_id, _ in results:
311
  movie = next((m for m in movies_data if m['id'] == movie_id), None)
@@ -314,43 +308,43 @@ def rerank_with_jina(query, results, top_n):
314
  documents.append({"text": movie_info})
315
 
316
  data = {
317
- "model": "jina-reranker-v2-base-multilingual",
318
  "query": query,
319
- "top_n": top_n,
320
  "documents": documents
321
  }
322
-
323
- logging.info(f"Отправка запроса к Jina AI для переранжирования {len(documents)} документов...")
324
-
 
 
 
 
325
  try:
326
- response = requests.post(url, headers=headers, json=data)
327
- response.raise_for_status()
328
  response_json = response.json()
329
-
330
- reranked_results = []
331
- for result in response_json['results']:
332
- reranked_results.append((results[result['index']][0], result['relevance_score']))
333
 
334
- logging.info(f"Jina AI: Успешно переранжировано. Задействовано токенов: {response_json['usage']['total_tokens']}")
 
 
 
 
 
 
 
 
335
  return reranked_results
336
 
337
  except requests.exceptions.RequestException as e:
338
- logging.error(f"Ошибка запроса к Jina AI: {e}")
339
  return []
340
- except KeyError as e:
341
- logging.error(f"Ошибка обработки ответа от Jina AI: {e}. Полный ответ: {response_json}")
342
  return []
343
-
344
- def rerank_results(query, results, top_k):
345
- """Переранжирует результаты поиска с помощью Jina AI."""
346
- logging.info(f"Начало переранжирования для запроса: '{query}'")
347
-
348
- # Jina AI не имеет жестких ограничений, поэтому можем обрабатывать все результаты за раз
349
- reranked_results = rerank_with_jina(query, results, top_k)
350
-
351
- reranked_results = sorted(reranked_results, key=lambda x: x[1], reverse=True)
352
- logging.info("Переранжирование завершено.")
353
- return reranked_results
354
 
355
  def search_movies(query, top_k=20):
356
  """Выполняет поиск фильмов по запросу."""
@@ -395,7 +389,7 @@ def search_movies(query, top_k=20):
395
  FROM {embeddings_table} m, query_embedding
396
  ORDER BY similarity DESC
397
  LIMIT %s
398
- """, (query_crc32, int(top_k * 2))) # Увеличиваем лимит до * 2
399
 
400
  results = cur.fetchall()
401
  logging.info(f"Найдено {len(results)} предварительных результатов поиска.")
@@ -404,7 +398,7 @@ def search_movies(query, top_k=20):
404
  results = []
405
 
406
  # Переранжируем результаты
407
- reranked_results = rerank_results(query, results, top_k)
408
 
409
  output = ""
410
  for movie_id, score in reranked_results[:top_k]:
@@ -414,7 +408,7 @@ def search_movies(query, top_k=20):
414
  output += f"<h3>{movie['name']} ({movie['year']})</h3>\n"
415
  output += f"<p><strong>Жанры:</strong> {movie['genreslist']}</p>\n"
416
  output += f"<p><strong>Описание:</strong> {movie['description']}</p>\n"
417
- output += f"<p><strong>Релевантность (Jina AI reranker score):</strong> {score:.4f}</p>\n"
418
  output += "<hr>\n"
419
 
420
  search_time = time.time() - start_time
 
38
  model = SentenceTransformer(model_name)
39
  logging.info("Модель загружена успешно.")
40
 
41
+ # Jina AI Reranker API
42
+ JINA_API_URL = 'https://api.jina.ai/v1/rerank'
43
+ JINA_API_KEY = os.environ.get("JINA_API_KEY") # Получение ключа из переменной окружения
44
  if JINA_API_KEY is None:
45
  raise ValueError("JINA_API_KEY environment variable not set.")
46
+ JINA_RERANKER_MODEL = "jina-reranker-v2-base-multilingual"
47
 
48
  # Имена таблиц
49
  embeddings_table = "movie_embeddings"
 
80
  # Количество потоков для параллельной обработки
81
  num_threads = 5
82
 
 
 
 
83
  def get_db_connection():
84
  """Устанавливает соединение с базой данных."""
85
  try:
 
297
  logging.error(f"Ошибка при загрузке эмбеддингов фильмов: {e}")
298
  return movie_embeddings
299
 
300
+ def rerank_with_api(query, results):
301
+ """Переранжирует результаты с помощью Jina AI Reranker API."""
302
+ logging.info(f"Начало переранжирования для запроса: '{query}'")
 
 
 
 
 
303
  documents = []
304
  for movie_id, _ in results:
305
  movie = next((m for m in movies_data if m['id'] == movie_id), None)
 
308
  documents.append({"text": movie_info})
309
 
310
  data = {
311
+ "model": JINA_RERANKER_MODEL,
312
  "query": query,
313
+ "top_n": len(results),
314
  "documents": documents
315
  }
316
+ logging.info(f"Отправка данных на реранк (Jina AI API):\n{data}")
317
+
318
+ headers = {
319
+ 'Content-Type': 'application/json',
320
+ 'Authorization': f'Bearer {JINA_API_KEY}'
321
+ }
322
+
323
  try:
324
+ response = requests.post(JINA_API_URL, headers=headers, json=data)
325
+ response.raise_for_status() # Проверка на ошибки HTTP
326
  response_json = response.json()
327
+ logging.info(f"Ответ от Jina AI API: {response_json}")
 
 
 
328
 
329
+ reranked_results = []
330
+ for result in response_json.get("results", []):
331
+ index = result.get("index")
332
+ score = result.get("relevance_score")
333
+ if index is not None and score is not None:
334
+ reranked_results.append((results[index][0], score))
335
+
336
+ reranked_results.sort(key=lambda x: x[1], reverse=True)
337
+ logging.info("Переранжирование завершено.")
338
  return reranked_results
339
 
340
  except requests.exceptions.RequestException as e:
341
+ logging.error(f"Ошибка при запросе к Jina AI Reranker API: {e}")
342
  return []
343
+ except (KeyError, ValueError) as e:
344
+ logging.error(f"Ошибка при обработке ответа от Jina AI Reranker API: {e}")
345
  return []
346
+ finally:
347
+ time.sleep(0.5)
 
 
 
 
 
 
 
 
 
348
 
349
  def search_movies(query, top_k=20):
350
  """Выполняет поиск фильмов по запросу."""
 
389
  FROM {embeddings_table} m, query_embedding
390
  ORDER BY similarity DESC
391
  LIMIT %s
392
+ """, (query_crc32, int(top_k * 1.1)))
393
 
394
  results = cur.fetchall()
395
  logging.info(f"Найдено {len(results)} предварительных результатов поиска.")
 
398
  results = []
399
 
400
  # Переранжируем результаты
401
+ reranked_results = rerank_with_api(query, results)
402
 
403
  output = ""
404
  for movie_id, score in reranked_results[:top_k]:
 
408
  output += f"<h3>{movie['name']} ({movie['year']})</h3>\n"
409
  output += f"<p><strong>Жанры:</strong> {movie['genreslist']}</p>\n"
410
  output += f"<p><strong>Описание:</strong> {movie['description']}</p>\n"
411
+ output += f"<p><strong>Релевантность (reranker score):</strong> {score:.4f}</p>\n"
412
  output += "<hr>\n"
413
 
414
  search_time = time.time() - start_time