antimoda1 commited on
Commit
0aa6d2c
·
1 Parent(s): f7f823c
Files changed (4) hide show
  1. app.py +3 -3
  2. retrieval.py +1 -0
  3. tests/test_lemmatization.py +12 -46
  4. tests/test_vocabular.py +2 -0
app.py CHANGED
@@ -105,7 +105,7 @@ with gr.Blocks(title="RAG Application", theme=gr.themes.Soft()) as iface:
105
  with gr.Row():
106
  search_query_input = gr.Textbox(
107
  label="Запрос для поиска",
108
- placeholder="Введите запрос для поиска - как в поисковиках, чтобы запросить информацию для дальнейшей работы",
109
  lines=1,
110
  scale=3
111
  )
@@ -155,7 +155,7 @@ with gr.Blocks(title="RAG Application", theme=gr.themes.Soft()) as iface:
155
  with gr.Column(scale=2):
156
  # Большое текстовое поле для результатов retrieval
157
  retrieval_results = gr.Textbox(
158
- label="Результаты retrieval",
159
  placeholder="Результаты поиска появятся здесь",
160
  lines=15,
161
  max_lines=30,
@@ -166,7 +166,7 @@ with gr.Blocks(title="RAG Application", theme=gr.themes.Soft()) as iface:
166
  with gr.Column(scale=1):
167
  # Ввод вопроса для LLM
168
  llm_query_input = gr.Textbox(
169
- label="Ваш вопрос",
170
  placeholder="Введите вопрос по историческим документам...",
171
  lines=2
172
  )
 
105
  with gr.Row():
106
  search_query_input = gr.Textbox(
107
  label="Запрос для поиска",
108
+ placeholder="Введите запрос для поиска",
109
  lines=1,
110
  scale=3
111
  )
 
155
  with gr.Column(scale=2):
156
  # Большое текстовое поле для результатов retrieval
157
  retrieval_results = gr.Textbox(
158
+ label="Результаты поиска",
159
  placeholder="Результаты поиска появятся здесь",
160
  lines=15,
161
  max_lines=30,
 
166
  with gr.Column(scale=1):
167
  # Ввод вопроса для LLM
168
  llm_query_input = gr.Textbox(
169
+ label="Ваш вопрос по результатам поиска",
170
  placeholder="Введите вопрос по историческим документам...",
171
  lines=2
172
  )
retrieval.py CHANGED
@@ -84,6 +84,7 @@ class Retrieval:
84
  # Инициализируем CrossEncoder
85
  # self.cross_encoder = CrossEncoder('DiTy/cross-encoder-russian-msmarco')
86
  self.embedder = SentenceTransformer('cointegrated/rubert-tiny2', cache_folder="/tmp")
 
87
  self.embeddings_of_summary = self.embedder.encode(self.paragraphs_df['summary'], convert_to_tensor=True)
88
 
89
  print("RAG система готова к использованию")
 
84
  # Инициализируем CrossEncoder
85
  # self.cross_encoder = CrossEncoder('DiTy/cross-encoder-russian-msmarco')
86
  self.embedder = SentenceTransformer('cointegrated/rubert-tiny2', cache_folder="/tmp")
87
+ # TODO: кэшировать эмбеддинги!
88
  self.embeddings_of_summary = self.embedder.encode(self.paragraphs_df['summary'], convert_to_tensor=True)
89
 
90
  print("RAG система готова к использованию")
tests/test_lemmatization.py CHANGED
@@ -7,7 +7,6 @@ import sys
7
  from pathlib import Path
8
  from dataclasses import dataclass
9
 
10
- # Добавляем родительскую директорию в path
11
  sys.path.insert(0, str(Path(__file__).parent.parent))
12
 
13
  from lemmatizer import RussianLemmatizer
@@ -49,16 +48,6 @@ TESTS_LETTER_E = [
49
 
50
 
51
  def lemmas_in_sentence(query: str, sentence: str) -> bool:
52
- """
53
- Проверяет, есть ли леммы из query в sentence после лемматизации.
54
-
55
- Args:
56
- query: поисковое слово
57
- sentence: предложение для проверки
58
-
59
- Returns:
60
- True если есть пересечение лемм
61
- """
62
  query_lemmas = set(lemmatizer.tokenize_text(query))
63
  sentence_lemmas = set(lemmatizer.tokenize_text(sentence))
64
 
@@ -66,64 +55,41 @@ def lemmas_in_sentence(query: str, sentence: str) -> bool:
66
  return len(query_lemmas & sentence_lemmas) > 0
67
 
68
 
69
- def run_test_suite(test_set_name: str, test_set: list[TestSearch]) -> tuple[int, int]:
70
- """Запускает набор тестов и возвращает (пройдено, провалено)"""
71
-
72
- print(f"НАБОР ТЕСТОВ: {test_set_name}")
73
-
74
  passed = 0
75
  failed = 0
76
 
77
- for test in test_set:
78
- word = test.word
79
- sentence = test.sentence
80
-
81
  # Проверяем, есть ли леммы слова в предложении
82
- success = lemmas_in_sentence(word, sentence, lemmatizer)
83
 
84
- status = "PASS" if success else "FAIL"
85
  passed += 1 if success else 0
86
  failed += 0 if success else 1
87
-
88
- print(f"\nТест {i}: {status}")
89
- print(f" Поиск: '{word}'")
90
- print(f" Предложение: '{sentence[:70]}...'")
91
-
92
- # Анализ для неудачных тестов
93
- if not success:
94
- query_lemmas = lemmatizer.tokenize_text(word)
95
- sent_lemmas = lemmatizer.tokenize_text(sentence)
96
-
97
- print(f" Леммы запроса: {query_lemmas}")
98
- print(f" Леммы предложения: {sent_lemmas}")
99
-
100
- # Итоговый результат
101
- print("\n" + "-"*70)
102
  print(f"РЕЗУЛЬТАТ: {passed} пройдено, {failed} провалено из {len(test_set)}")
103
-
104
  return passed, failed
105
 
106
 
107
  def test_lemmatization():
108
- """Запускает все наборы тестов"""
109
-
110
  total_passed = 0
111
  total_failed = 0
112
 
113
- # Запускаем все наборы тестов
114
  for test_name, test_set in (
115
  ("ТОПОНИМЫ (падежи и словоформы)", TESTS_TOPONIMS),
116
  ("ЛЕММАТИЗАЦИЯ (беглые гласные)", TESTS_LEMMATIZATION),
117
  ("ОБРАБОТКА Е/Ё", TESTS_LETTER_E),
118
  ):
119
- passed, failed = run_test_suite(test_name, test_set)
 
120
  total_passed += passed
121
  total_failed += failed
122
 
123
- # Финальный результат
124
  print(f"ИТОГО: {total_passed} пройдено, {total_failed} провалено из {total_passed + total_failed}")
125
  return total_failed == 0
126
 
127
-
128
- if __name__ == "__main__":
129
- test_lemmatization()
 
7
  from pathlib import Path
8
  from dataclasses import dataclass
9
 
 
10
  sys.path.insert(0, str(Path(__file__).parent.parent))
11
 
12
  from lemmatizer import RussianLemmatizer
 
48
 
49
 
50
  def lemmas_in_sentence(query: str, sentence: str) -> bool:
 
 
 
 
 
 
 
 
 
 
51
  query_lemmas = set(lemmatizer.tokenize_text(query))
52
  sentence_lemmas = set(lemmatizer.tokenize_text(sentence))
53
 
 
55
  return len(query_lemmas & sentence_lemmas) > 0
56
 
57
 
58
+ def run_test_suite(test_set: list[TestSearch]) -> tuple[int, int]:
59
+ """Запускает ОДИН набор тестов и возвращает (пройдено, провалено)"""
 
 
 
60
  passed = 0
61
  failed = 0
62
 
63
+ for test in test_set:
 
 
 
64
  # Проверяем, есть ли леммы слова в предложении
65
+ success = lemmas_in_sentence( test.word, test.sentence, lemmatizer)
66
 
67
+ status = "PASS" if success else "FAIL"
68
  passed += 1 if success else 0
69
  failed += 0 if success else 1
70
+ print(status)
71
+
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  print(f"РЕЗУЛЬТАТ: {passed} пройдено, {failed} провалено из {len(test_set)}")
 
73
  return passed, failed
74
 
75
 
76
  def test_lemmatization():
77
+ """Запускает ВСЕ наборы тестов"""
 
78
  total_passed = 0
79
  total_failed = 0
80
 
 
81
  for test_name, test_set in (
82
  ("ТОПОНИМЫ (падежи и словоформы)", TESTS_TOPONIMS),
83
  ("ЛЕММАТИЗАЦИЯ (беглые гласные)", TESTS_LEMMATIZATION),
84
  ("ОБРАБОТКА Е/Ё", TESTS_LETTER_E),
85
  ):
86
+ print(f"НАБОР ТЕСТОВ: {test_name}")
87
+ passed, failed = run_test_suite(test_set)
88
  total_passed += passed
89
  total_failed += failed
90
 
91
+
92
  print(f"ИТОГО: {total_passed} пройдено, {total_failed} провалено из {total_passed + total_failed}")
93
  return total_failed == 0
94
 
95
+ test_lemmatization()
 
 
tests/test_vocabular.py CHANGED
@@ -2,7 +2,9 @@
2
 
3
  import sys
4
  from pathlib import Path
 
5
  sys.path.insert(0, str(Path(__file__).parent.parent))
 
6
  from vocabulary.parse_vocabulary import VOCABULARY_MANAGER
7
 
8
  TESTS_CASES = {
 
2
 
3
  import sys
4
  from pathlib import Path
5
+
6
  sys.path.insert(0, str(Path(__file__).parent.parent))
7
+
8
  from vocabulary.parse_vocabulary import VOCABULARY_MANAGER
9
 
10
  TESTS_CASES = {