Loversofdeath commited on
Commit
84c49b0
·
verified ·
1 Parent(s): 2782135

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -49
app.py CHANGED
@@ -4,13 +4,12 @@ from langdetect import detect
4
  from sentence_transformers import SentenceTransformer
5
  import numpy as np
6
  import re
 
7
 
8
  # Загрузка и предварительная обработка текстовых файлов
9
  def load_and_preprocess_files():
10
  files = {
11
- "vampires": "vampires.txt",
12
- "werewolves": "werewolves.txt",
13
- "humans": "humans.txt"
14
  }
15
 
16
  knowledge_base = {}
@@ -31,9 +30,8 @@ def load_and_preprocess_files():
31
  def initialize_search_model():
32
  return SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2')
33
 
34
- # Поиск релевантной информации с улучшенным ранжированием
35
  def find_relevant_info(question, knowledge_base, model, top_k=3):
36
- # Собираем все текстовые фрагменты с их категориями
37
  all_fragments = []
38
  for category, paragraphs in knowledge_base.items():
39
  for para in paragraphs:
@@ -42,12 +40,10 @@ def find_relevant_info(question, knowledge_base, model, top_k=3):
42
  if not all_fragments:
43
  return []
44
 
45
- # Эмбеддинги для всех фрагментов
46
  texts = [f[0] for f in all_fragments]
47
  embeddings = model.encode(texts)
48
  question_embedding = model.encode([question])
49
 
50
- # Вычисляем сходство и выбираем топ фрагментов
51
  similarities = np.dot(embeddings, question_embedding.T).flatten()
52
  top_indices = similarities.argsort()[-top_k:][::-1]
53
 
@@ -58,7 +54,6 @@ def generate_natural_response(question, relevant_info):
58
  if not relevant_info:
59
  return "Извините, не нашел информации по вашему вопросу. Попробуйте переформулировать."
60
 
61
- # Определяем тему вопроса
62
  question_type = "о них"
63
  if "вампир" in question.lower():
64
  question_type = "о вампирах"
@@ -67,7 +62,6 @@ def generate_natural_response(question, relevant_info):
67
  elif "человек" in question.lower() or "люди" in question.lower():
68
  question_type = "о людях"
69
 
70
- # Собираем уникальную информацию
71
  unique_info = []
72
  seen = set()
73
  for para, category in relevant_info:
@@ -75,21 +69,17 @@ def generate_natural_response(question, relevant_info):
75
  unique_info.append((para, category))
76
  seen.add(para)
77
 
78
- # Формируем ответ
79
  response = f"Вот что мне известно {question_type}:\n\n"
80
 
81
  for i, (para, category) in enumerate(unique_info, 1):
82
- # Упрощаем маркированные списки
83
  if para.startswith("- "):
84
  para = para.replace("\n- ", "\n• ").replace("- ", "• ")
85
 
86
- # Добавляем источник только если есть несколько категорий
87
  if len(set(c for _, c in unique_info)) > 1:
88
  response += f"{i}. ({category.capitalize()}) {para}\n\n"
89
  else:
90
  response += f"{i}. {para}\n\n"
91
 
92
- # Добавляем естественное завершение
93
  endings = [
94
  "Надеюсь, эта информация была полезной!",
95
  "Если хотите узнать больше деталей, уточните вопрос.",
@@ -97,71 +87,59 @@ def generate_natural_response(question, relevant_info):
97
  "Это основные сведения, которые у меня есть."
98
  ]
99
 
100
- response += np.random.choice(endings)
101
 
102
  return response
103
 
104
- # Обработка вопроса с улучшенной логикой
105
  def process_question(question, history):
106
- # Проверка языка
107
  try:
108
  if detect(question) != 'ru':
109
  return "Пожалуйста, задавайте вопросы на русском языке.", history
110
  except:
111
  pass
112
 
113
- # Ленивая загрузка данных и модели
114
  if not hasattr(process_question, 'knowledge_base'):
115
  process_question.knowledge_base = load_and_preprocess_files()
116
 
117
  if not hasattr(process_question, 'search_model'):
118
  process_question.search_model = initialize_search_model()
119
 
120
- # Поиск релевантной информации
121
  relevant_info = find_relevant_info(question, process_question.knowledge_base, process_question.search_model)
122
-
123
- # Генерация ответа
124
  answer = generate_natural_response(question, relevant_info)
125
-
126
- # Обновление истории
127
  history.append((question, answer))
128
-
129
  return "", history
130
 
131
- # Создание интерфейса с улучшенным дизайном
132
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
133
  gr.Markdown("""<h1 style='text-align: center'>🧛‍♂️ Мир сверхъестественного 🐺</h1>""")
134
  gr.Markdown("""<div style='text-align: center'>Задавайте вопросы о вампирах, оборотнях и людях на русском языке</div>""")
135
 
136
- with gr.Row():
137
- with gr.Column(scale=2):
138
- chatbot = gr.Chatbot(
139
- label="Диалог",
140
- bubble_full_width=False,
141
- avatar_images=(
142
- "https://i.imgur.com/7WqjWaz.png", # User avatar
143
- "https://i.imgur.com/7uQWsZg.png" # Bot avatar
144
- ),
145
- height=500
146
- )
147
- with gr.Column(scale=1):
148
- gr.Markdown("**Примеры вопросов:**")
149
- gr.Examples(
150
- examples=[
151
- "Какие слабости у вампиров?",
152
- "Как защититься от оборотней?",
153
- "Чем люди отличаются от других существ?",
154
- "Расскажи подробнее о вампирах"
155
- ],
156
- inputs=[msg]
157
- )
158
-
159
  msg = gr.Textbox(
160
  label="Ваш вопрос",
161
  placeholder="Введите вопрос и нажмите Enter...",
162
  container=False
163
  )
164
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  with gr.Row():
166
  submit = gr.Button("Отправить", variant="primary")
167
  clear = gr.Button("Очистить историю")
@@ -170,5 +148,4 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
170
  msg.submit(process_question, [msg, chatbot], [msg, chatbot])
171
  clear.click(lambda: None, None, chatbot, queue=False)
172
 
173
- # Запуск приложения
174
- demo.launch(server_name="0.0.0.0", server_port=7860)
 
4
  from sentence_transformers import SentenceTransformer
5
  import numpy as np
6
  import re
7
+ import random
8
 
9
  # Загрузка и предварительная обработка текстовых файлов
10
  def load_and_preprocess_files():
11
  files = {
12
+ "vampires": "vampires.txt"
 
 
13
  }
14
 
15
  knowledge_base = {}
 
30
  def initialize_search_model():
31
  return SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2')
32
 
33
+ # Поиск релевантной информации
34
  def find_relevant_info(question, knowledge_base, model, top_k=3):
 
35
  all_fragments = []
36
  for category, paragraphs in knowledge_base.items():
37
  for para in paragraphs:
 
40
  if not all_fragments:
41
  return []
42
 
 
43
  texts = [f[0] for f in all_fragments]
44
  embeddings = model.encode(texts)
45
  question_embedding = model.encode([question])
46
 
 
47
  similarities = np.dot(embeddings, question_embedding.T).flatten()
48
  top_indices = similarities.argsort()[-top_k:][::-1]
49
 
 
54
  if not relevant_info:
55
  return "Извините, не нашел информации по вашему вопросу. Попробуйте переформулировать."
56
 
 
57
  question_type = "о них"
58
  if "вампир" in question.lower():
59
  question_type = "о вампирах"
 
62
  elif "человек" in question.lower() or "люди" in question.lower():
63
  question_type = "о людях"
64
 
 
65
  unique_info = []
66
  seen = set()
67
  for para, category in relevant_info:
 
69
  unique_info.append((para, category))
70
  seen.add(para)
71
 
 
72
  response = f"Вот что мне известно {question_type}:\n\n"
73
 
74
  for i, (para, category) in enumerate(unique_info, 1):
 
75
  if para.startswith("- "):
76
  para = para.replace("\n- ", "\n• ").replace("- ", "• ")
77
 
 
78
  if len(set(c for _, c in unique_info)) > 1:
79
  response += f"{i}. ({category.capitalize()}) {para}\n\n"
80
  else:
81
  response += f"{i}. {para}\n\n"
82
 
 
83
  endings = [
84
  "Надеюсь, эта информация была полезной!",
85
  "Если хотите узнать больше деталей, уточните вопрос.",
 
87
  "Это основные сведения, которые у меня есть."
88
  ]
89
 
90
+ response += random.choice(endings)
91
 
92
  return response
93
 
94
+ # Обработка вопроса
95
  def process_question(question, history):
 
96
  try:
97
  if detect(question) != 'ru':
98
  return "Пожалуйста, задавайте вопросы на русском языке.", history
99
  except:
100
  pass
101
 
 
102
  if not hasattr(process_question, 'knowledge_base'):
103
  process_question.knowledge_base = load_and_preprocess_files()
104
 
105
  if not hasattr(process_question, 'search_model'):
106
  process_question.search_model = initialize_search_model()
107
 
 
108
  relevant_info = find_relevant_info(question, process_question.knowledge_base, process_question.search_model)
 
 
109
  answer = generate_natural_response(question, relevant_info)
 
 
110
  history.append((question, answer))
 
111
  return "", history
112
 
113
+ # Создание интерфейса
114
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
115
  gr.Markdown("""<h1 style='text-align: center'>🧛‍♂️ Мир сверхъестественного 🐺</h1>""")
116
  gr.Markdown("""<div style='text-align: center'>Задавайте вопросы о вампирах, оборотнях и людях на русском языке</div>""")
117
 
118
+ # Сначала определяем элементы ввода
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  msg = gr.Textbox(
120
  label="Ваш вопрос",
121
  placeholder="Введите вопрос и нажмите Enter...",
122
  container=False
123
  )
124
 
125
+ # Затем определяем примеры, которые используют msg
126
+ examples = gr.Examples(
127
+ examples=[
128
+ "Какие слабости у вампиров?",
129
+ "Как защититься от оборотней?",
130
+ "Чем люди отличаются от других существ?",
131
+ "Расскажи подробнее о вампирах"
132
+ ],
133
+ inputs=[msg],
134
+ label="Примеры вопросов:"
135
+ )
136
+
137
+ # Затем определяем чат
138
+ chatbot = gr.Chatbot(
139
+ label="Диалог",
140
+ height=500
141
+ )
142
+
143
  with gr.Row():
144
  submit = gr.Button("Отправить", variant="primary")
145
  clear = gr.Button("Очистить историю")
 
148
  msg.submit(process_question, [msg, chatbot], [msg, chatbot])
149
  clear.click(lambda: None, None, chatbot, queue=False)
150
 
151
+ demo.launch()