antimoda1 commited on
Commit
0c818cc
·
1 Parent(s): d061e47

more refactor

Browse files
Files changed (3) hide show
  1. app.py +1 -2
  2. generation.py +0 -65
  3. vocabulary/parse_vocabulary.py +44 -0
app.py CHANGED
@@ -1,7 +1,6 @@
1
  import gradio as gr
2
  import numpy as np
3
 
4
- from generation import wrap_prompt
5
  from llm import get_llm_answer
6
  from retrieval import Retrieval
7
  from _2_splitting import _parse_single_year
@@ -95,7 +94,7 @@ def ask_llm(query, filtered_indices_state):
95
  return
96
 
97
  # Формируем промпт и отправляем в LLM
98
- prompt = wrap_prompt(context, query, VOCABULARY_MANAGER.vocabulary)
99
 
100
  # Потоковая выдача ответа
101
  full_answer = ""
 
1
  import gradio as gr
2
  import numpy as np
3
 
 
4
  from llm import get_llm_answer
5
  from retrieval import Retrieval
6
  from _2_splitting import _parse_single_year
 
94
  return
95
 
96
  # Формируем промпт и отправляем в LLM
97
+ prompt = VOCABULARY_MANAGER.wrap_prompt(context, query)
98
 
99
  # Потоковая выдача ответа
100
  full_answer = ""
generation.py DELETED
@@ -1,65 +0,0 @@
1
- import warnings
2
- import re
3
- warnings.filterwarnings('ignore')
4
-
5
-
6
- def lemmatize(text: str, vocabulary: dict[str, str]) -> list[str]:
7
- """
8
- Лемматизирует текст и возвращает список терминов из словаря.
9
- Поддерживает поиск полных термин и частичный поиск по словам.
10
- Также ищет словоформы (например, "икарусы" для "икарус").
11
-
12
- Args:
13
- text (str): Текст для анализа
14
- vocabulary (dict): Словарь терминов {термин: определение}
15
-
16
- Returns:
17
- list: Список найденных терминов из vocabulary в порядке их появления
18
- """
19
- found_terms = []
20
- found_terms_set = set() # Для отслеживания дубликатов
21
-
22
- # Приводим текст в нижний регистр для поиска
23
- text_lower = text.lower()
24
-
25
- # Сначала - поиск полных терминов
26
- for term in vocabulary.keys():
27
- term_lower = term.lower()
28
- # Ищем термин как целое слово
29
- pattern = r'\b' + re.escape(term_lower) + r'\b'
30
-
31
- if re.search(pattern, text_lower) and term not in found_terms_set:
32
- found_terms.append(term)
33
- found_terms_set.add(term)
34
-
35
- return found_terms
36
-
37
-
38
- def wrap_prompt(retrieved_text: str, query_text: str, inp_vocabula: dict[str, str]):
39
- vocabula = inp_vocabula.copy() # Создаем копию словаря, чтобы не изменять оригинал
40
- tokens_from_query = lemmatize(query_text, vocabula)
41
- tokens_from_retrieved = lemmatize(retrieved_text, vocabula)
42
- info_for_llm = ''
43
- for token in tokens_from_query + tokens_from_retrieved:
44
- if token in vocabula:
45
- info_for_llm += f'{token}: {vocabula[token]}\n'
46
- del vocabula[token] # удаляем, чтобы не повторять
47
- if info_for_llm:
48
- info_for_llm = f"\nСправка по терминам (пользователю эти термины очевидны)\n{info_for_llm}\n" + info_for_llm
49
- return f"""Ты - эксперт по истории общественного транспорта в городе Рязань, отвечающий на вопросы на основе предоставленных архивных данных.
50
-
51
- ВОПРОС ПОЛЬЗОВАТЕЛЯ:
52
- {query_text}
53
- {info_for_llm}
54
-
55
- КОНТЕКСТ ИЗ АРХИВОВ:
56
- {retrieved_text}
57
-
58
- ИНСТРУКЦИИ:
59
- 1. Отвечай ТОЛЬКО на основе предоставленного контекста
60
- 2. Если в контексте нет информации для ответа, скажи об этом честно
61
- 3. Сохраняй историческую точность, упоминай даты, если они есть
62
- 4. Будь кратким и информативным
63
- 5. Цитируй конкретные факты из контекста
64
-
65
- ОТВЕТ:"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vocabulary/parse_vocabulary.py CHANGED
@@ -103,6 +103,50 @@ class ParserVocabulary:
103
  return info['canonical']
104
  return None
105
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
 
107
  import os
108
  current_dir = os.path.dirname(os.path.abspath(__file__))
 
103
  return info['canonical']
104
  return None
105
 
106
+ def find_terms(self, text: str) -> set[str]:
107
+ """Возвращает список терминов в тексте (учитывая словоформы)
108
+
109
+ Args:
110
+ text (str): Текст для анализа
111
+
112
+ Returns:
113
+ set: Множество найденных терминов из vocabulary в порядке их появления
114
+ """
115
+ found_terms = set() # Для отслеживания дубликатов
116
+
117
+ text_lower = text.lower()
118
+
119
+ for word in text_lower:
120
+ res = self.extract_stem(word)
121
+ if res:
122
+ found_terms.add(word)
123
+ return found_terms
124
+
125
+ def wrap_prompt(self, retrieved_text: str, query_text: str):
126
+ tokens_from_query = self.find_terms(query_text)
127
+ tokens_from_retrieved = self.find_terms(retrieved_text)
128
+ info_for_llm = ''
129
+ for token in tokens_from_query + tokens_from_retrieved:
130
+ info_for_llm += f'{token}: {self.vocabulary[token]}\n'
131
+ if info_for_llm:
132
+ info_for_llm = f"\nСправка по терминам (пользователю эти термины очевидны)\n{info_for_llm}\n" + info_for_llm
133
+ return f"""Ты - эксперт по истории общественного транспорта в городе Рязань, отвечающий на вопросы на основе предоставленных архивных данных.
134
+
135
+ ВОПРОС ПОЛЬЗОВАТЕЛЯ:
136
+ {query_text}
137
+ {info_for_llm}
138
+
139
+ КОНТЕКСТ ИЗ АРХИВОВ:
140
+ {retrieved_text}
141
+
142
+ ИНСТРУКЦИИ:
143
+ 1. Отвечай ТОЛЬКО на основе предоставленного контекста
144
+ 2. Если в контексте нет информации для ответа, скажи об этом честно
145
+ 3. Сохраняй историческую точность, упоминай даты, если они есть
146
+ 4. Цитируй конкретные факты из контекста
147
+
148
+ ОТВЕТ:"""
149
+
150
 
151
  import os
152
  current_dir = os.path.dirname(os.path.abspath(__file__))