Update app.py
Browse files
app.py
CHANGED
@@ -7,6 +7,7 @@ import queue
|
|
7 |
import torch
|
8 |
import psycopg2
|
9 |
import zlib
|
|
|
10 |
from urllib.parse import urlparse
|
11 |
import logging
|
12 |
|
@@ -87,7 +88,7 @@ def setup_database():
|
|
87 |
cur.execute("CREATE EXTENSION IF NOT EXISTS vector;")
|
88 |
|
89 |
# Удаляем существующие таблицы если они есть
|
90 |
-
|
91 |
|
92 |
# Создаем таблицу для хранения эмбеддингов фильмов
|
93 |
cur.execute(f"""
|
@@ -98,7 +99,6 @@ def setup_database():
|
|
98 |
model_name TEXT,
|
99 |
embedding vector(1024)
|
100 |
);
|
101 |
-
CREATE INDEX ON {embeddings_table} USING ivfflat (embedding vector_cosine_ops);
|
102 |
CREATE INDEX ON {embeddings_table} (string_crc32);
|
103 |
""")
|
104 |
|
@@ -111,7 +111,6 @@ def setup_database():
|
|
111 |
embedding vector(1024),
|
112 |
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
113 |
);
|
114 |
-
CREATE INDEX ON {query_cache_table} USING ivfflat (embedding vector_cosine_ops);
|
115 |
CREATE INDEX ON {query_cache_table} (query_crc32);
|
116 |
CREATE INDEX ON {query_cache_table} (created_at);
|
117 |
""")
|
@@ -169,7 +168,7 @@ def get_embedding_from_db(conn, table_name, crc32_column, crc32_value, model_nam
|
|
169 |
(crc32_value, model_name))
|
170 |
result = cur.fetchone()
|
171 |
if result and result[0]:
|
172 |
-
return
|
173 |
except Exception as e:
|
174 |
logging.error(f"Ошибка при получении эмбеддинга из БД: {e}")
|
175 |
return None
|
@@ -267,7 +266,7 @@ def get_movie_embeddings(conn):
|
|
267 |
# Находим название фильма по ID
|
268 |
for movie in movies_data:
|
269 |
if movie['id'] == movie_id:
|
270 |
-
movie_embeddings[movie['name']] =
|
271 |
break
|
272 |
logging.info(f"Загружено {len(movie_embeddings)} эмбеддингов фильмов.")
|
273 |
except Exception as e:
|
@@ -313,9 +312,9 @@ def search_movies(query, top_k=10):
|
|
313 |
FROM {query_cache_table}
|
314 |
WHERE query_crc32 = %s
|
315 |
)
|
316 |
-
SELECT m.movie_id, m.embedding <=> (SELECT embedding FROM query_embedding) as
|
317 |
FROM {embeddings_table} m, query_embedding
|
318 |
-
ORDER BY
|
319 |
LIMIT %s
|
320 |
""", (query_crc32, top_k))
|
321 |
|
@@ -326,7 +325,7 @@ def search_movies(query, top_k=10):
|
|
326 |
results = []
|
327 |
|
328 |
results_html = "<ol>"
|
329 |
-
for movie_id,
|
330 |
# Находим название фильма по ID
|
331 |
movie_title = None
|
332 |
for movie in movies_data:
|
@@ -335,7 +334,6 @@ def search_movies(query, top_k=10):
|
|
335 |
break
|
336 |
|
337 |
if movie_title:
|
338 |
-
similarity = 1 - distance # Конвертируем расстояние в сходство
|
339 |
results_html += f"<li><strong>{movie_title}</strong> (Сходство: {similarity:.4f})</li>"
|
340 |
results_html += "</ol>"
|
341 |
|
|
|
7 |
import torch
|
8 |
import psycopg2
|
9 |
import zlib
|
10 |
+
import numpy as np
|
11 |
from urllib.parse import urlparse
|
12 |
import logging
|
13 |
|
|
|
88 |
cur.execute("CREATE EXTENSION IF NOT EXISTS vector;")
|
89 |
|
90 |
# Удаляем существующие таблицы если они есть
|
91 |
+
cur.execute(f"DROP TABLE IF EXISTS {embeddings_table}, {query_cache_table};")
|
92 |
|
93 |
# Создаем таблицу для хранения эмбеддингов фильмов
|
94 |
cur.execute(f"""
|
|
|
99 |
model_name TEXT,
|
100 |
embedding vector(1024)
|
101 |
);
|
|
|
102 |
CREATE INDEX ON {embeddings_table} (string_crc32);
|
103 |
""")
|
104 |
|
|
|
111 |
embedding vector(1024),
|
112 |
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
113 |
);
|
|
|
114 |
CREATE INDEX ON {query_cache_table} (query_crc32);
|
115 |
CREATE INDEX ON {query_cache_table} (created_at);
|
116 |
""")
|
|
|
168 |
(crc32_value, model_name))
|
169 |
result = cur.fetchone()
|
170 |
if result and result[0]:
|
171 |
+
return np.array(result[0])
|
172 |
except Exception as e:
|
173 |
logging.error(f"Ошибка при получении эмбеддинга из БД: {e}")
|
174 |
return None
|
|
|
266 |
# Находим название фильма по ID
|
267 |
for movie in movies_data:
|
268 |
if movie['id'] == movie_id:
|
269 |
+
movie_embeddings[movie['name']] = np.array(embedding)
|
270 |
break
|
271 |
logging.info(f"Загружено {len(movie_embeddings)} эмбеддингов фильмов.")
|
272 |
except Exception as e:
|
|
|
312 |
FROM {query_cache_table}
|
313 |
WHERE query_crc32 = %s
|
314 |
)
|
315 |
+
SELECT m.movie_id, 1 - (m.embedding <=> (SELECT embedding FROM query_embedding)) as similarity
|
316 |
FROM {embeddings_table} m, query_embedding
|
317 |
+
ORDER BY similarity DESC
|
318 |
LIMIT %s
|
319 |
""", (query_crc32, top_k))
|
320 |
|
|
|
325 |
results = []
|
326 |
|
327 |
results_html = "<ol>"
|
328 |
+
for movie_id, similarity in results:
|
329 |
# Находим название фильма по ID
|
330 |
movie_title = None
|
331 |
for movie in movies_data:
|
|
|
334 |
break
|
335 |
|
336 |
if movie_title:
|
|
|
337 |
results_html += f"<li><strong>{movie_title}</strong> (Сходство: {similarity:.4f})</li>"
|
338 |
results_html += "</ol>"
|
339 |
|