Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
| 1 |
import streamlit as st
|
| 2 |
import pandas as pd
|
| 3 |
-
from datetime import datetime
|
| 4 |
import json
|
| 5 |
import os
|
| 6 |
import logging
|
|
@@ -335,6 +334,41 @@ def load_models():
|
|
| 335 |
""")
|
| 336 |
raise
|
| 337 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 338 |
# Подключение к SQLite базе
|
| 339 |
def get_db_connection(db_path):
|
| 340 |
try:
|
|
@@ -628,7 +662,7 @@ def get_answer(question):
|
|
| 628 |
return answer
|
| 629 |
|
| 630 |
# 5. Ответ по умолчанию
|
| 631 |
-
answer = "К сожалению, не удалось найти точный
|
| 632 |
save_log(question, answer)
|
| 633 |
return answer
|
| 634 |
|
|
@@ -710,18 +744,48 @@ if st.sidebar.button("Запустить диагностику BM25"):
|
|
| 710 |
st.write(f"'{test_question}'")
|
| 711 |
|
| 712 |
try:
|
| 713 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 714 |
|
| 715 |
if not results:
|
| 716 |
-
|
|
|
|
|
|
|
| 717 |
else:
|
|
|
|
| 718 |
for i, res in enumerate(results, 1):
|
| 719 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 720 |
st.write(f"**Текст:** {res['text']}")
|
| 721 |
-
st.write(f"**Источник:** {res
|
| 722 |
st.write("---")
|
|
|
|
| 723 |
except Exception as e:
|
| 724 |
-
|
|
|
|
|
|
|
| 725 |
|
| 726 |
# Проверка содержимого SQLite базы
|
| 727 |
if st.sidebar.button("Проверить SQLite на наличие термина"):
|
|
|
|
| 1 |
import streamlit as st
|
| 2 |
import pandas as pd
|
|
|
|
| 3 |
import json
|
| 4 |
import os
|
| 5 |
import logging
|
|
|
|
| 334 |
""")
|
| 335 |
raise
|
| 336 |
|
| 337 |
+
def run_bm25_diagnostic(hybrid_search, question, top_k=5):
|
| 338 |
+
"""Отдельная функция для диагностики BM25 с явной передачей hybrid_search"""
|
| 339 |
+
try:
|
| 340 |
+
logger.info(f"Запуск диагностики BM25 для вопроса: '{question}'")
|
| 341 |
+
|
| 342 |
+
if not hybrid_search:
|
| 343 |
+
error_msg = "Гибридный поиск (hybrid_search) не инициализирован"
|
| 344 |
+
logger.error(error_msg)
|
| 345 |
+
raise ValueError(error_msg)
|
| 346 |
+
|
| 347 |
+
if not hybrid_search.bm25:
|
| 348 |
+
error_msg = "BM25 не был создан при инициализации HybridSearch"
|
| 349 |
+
logger.error(error_msg)
|
| 350 |
+
raise ValueError(error_msg)
|
| 351 |
+
|
| 352 |
+
# Запуск поиска с подробным логированием
|
| 353 |
+
logger.info(f"Поиск BM25 с top_k={top_k}")
|
| 354 |
+
results = hybrid_search.search(question, top_k=top_k)
|
| 355 |
+
|
| 356 |
+
if not results:
|
| 357 |
+
logger.info("BM25 вернул 0 результатов (возможно, низкие оценки)")
|
| 358 |
+
else:
|
| 359 |
+
logger.info(f"Найдено результатов BM25: {len(results)}")
|
| 360 |
+
for i, res in enumerate(results, 1):
|
| 361 |
+
logger.info(
|
| 362 |
+
f"Результат #{i}: Оценка={res['score']:.2f}, "
|
| 363 |
+
f"Тип={res.get('type', 'unknown')}, "
|
| 364 |
+
f"Текст={res['text'][:50]}..."
|
| 365 |
+
)
|
| 366 |
+
|
| 367 |
+
return results
|
| 368 |
+
except Exception as e:
|
| 369 |
+
logger.error(f"Ошибка в run_bm25_diagnostic: {str(e)}", exc_info=True)
|
| 370 |
+
raise
|
| 371 |
+
|
| 372 |
# Подключение к SQLite базе
|
| 373 |
def get_db_connection(db_path):
|
| 374 |
try:
|
|
|
|
| 662 |
return answer
|
| 663 |
|
| 664 |
# 5. Ответ по умолчанию
|
| 665 |
+
answer = "К сожалению, не удалось найти точный ответ. Попробуйте переформулировать вопрос."
|
| 666 |
save_log(question, answer)
|
| 667 |
return answer
|
| 668 |
|
|
|
|
| 744 |
st.write(f"'{test_question}'")
|
| 745 |
|
| 746 |
try:
|
| 747 |
+
# Логирование начала диагностики
|
| 748 |
+
logger.info(f"Запущена диагностика BM25 для вопроса: '{test_question}'")
|
| 749 |
+
|
| 750 |
+
# Проверка инициализации
|
| 751 |
+
if not hybrid_search:
|
| 752 |
+
error_msg = "HybridSearch не инициализирован!"
|
| 753 |
+
logger.error(error_msg)
|
| 754 |
+
st.error(error_msg)
|
| 755 |
+
st.stop()
|
| 756 |
+
|
| 757 |
+
if not hybrid_search.bm25:
|
| 758 |
+
error_msg = "BM25 не был инициализирован в HybridSearch!"
|
| 759 |
+
logger.error(error_msg)
|
| 760 |
+
st.error(error_msg)
|
| 761 |
+
st.stop()
|
| 762 |
+
|
| 763 |
+
# Выполнение поиска
|
| 764 |
+
results = hybrid_search.search(test_question, top_k=5)
|
| 765 |
+
logger.info(f"Найдено результатов BM25: {len(results)}")
|
| 766 |
|
| 767 |
if not results:
|
| 768 |
+
msg = "BM25 не вернул результатов (возможно, низкие оценки совпадения)"
|
| 769 |
+
logger.warning(msg)
|
| 770 |
+
st.warning(msg)
|
| 771 |
else:
|
| 772 |
+
st.success(f"Найдено результатов: {len(results)}")
|
| 773 |
for i, res in enumerate(results, 1):
|
| 774 |
+
logger.info(
|
| 775 |
+
f"Результат {i}: Оценка={res['score']:.2f}, "
|
| 776 |
+
f"Тип={res.get('type', 'unknown')}, "
|
| 777 |
+
f"Текст={res['text'][:50]}..."
|
| 778 |
+
)
|
| 779 |
+
|
| 780 |
+
st.markdown(f"#### Результат {i} (оценка: {res['score']:.2f})")
|
| 781 |
st.write(f"**Текст:** {res['text']}")
|
| 782 |
+
st.write(f"**Источник:** {res.get('source', 'нет данных')}")
|
| 783 |
st.write("---")
|
| 784 |
+
|
| 785 |
except Exception as e:
|
| 786 |
+
error_msg = f"Критическая ошибка при диагностике BM25: {str(e)}"
|
| 787 |
+
logger.exception(error_msg)
|
| 788 |
+
st.error(error_msg)
|
| 789 |
|
| 790 |
# Проверка содержимого SQLite базы
|
| 791 |
if st.sidebar.button("Проверить SQLite на наличие термина"):
|