Loversofdeath commited on
Commit
0024582
·
verified ·
1 Parent(s): fd90c49

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -67
app.py CHANGED
@@ -1,7 +1,7 @@
1
  import gradio as gr
2
  import os
3
  from langdetect import detect
4
- from sentence_transformers import SentenceTransformer
5
  import numpy as np
6
  import re
7
  import random
@@ -28,70 +28,28 @@ def load_and_preprocess_files():
28
 
29
  return knowledge_base
30
 
31
- # Инициализация модели для семантического поиска
32
- def initialize_search_model():
33
- return SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2')
 
 
 
34
 
35
  # Поиск релевантной информации
36
- def find_relevant_info(question, knowledge_base, model, top_k=3):
37
- all_fragments = []
38
  for category, paragraphs in knowledge_base.items():
39
- for para in paragraphs:
40
- all_fragments.append((para, category))
41
 
42
- if not all_fragments:
43
- return []
44
-
45
- texts = [f[0] for f in all_fragments]
46
- embeddings = model.encode(texts)
47
- question_embedding = model.encode([question])
48
-
49
- similarities = np.dot(embeddings, question_embedding.T).flatten()
50
- top_indices = similarities.argsort()[-top_k:][::-1]
51
-
52
- return [all_fragments[i] for i in top_indices]
53
 
54
- # Генерация естественного ответа
55
- def generate_natural_response(question, relevant_info):
56
- if not relevant_info:
57
- return "Извините, не нашел информации по вашему вопросу. Попробуйте переформулировать."
58
-
59
- question_type = "о них"
60
- if "вампир" in question.lower():
61
- question_type = "о вампирах"
62
- elif "оборотн" in question.lower() or "волколак" in question.lower():
63
- question_type = "об оборотнях"
64
- elif "человек" in question.lower() or "люди" in question.lower():
65
- question_type = "о людях"
66
-
67
- unique_info = []
68
- seen = set()
69
- for para, category in relevant_info:
70
- if para not in seen:
71
- unique_info.append((para, category))
72
- seen.add(para)
73
-
74
- response = f"Вот что мне известно {question_type}:\n\n"
75
-
76
- for i, (para, category) in enumerate(unique_info, 1):
77
- if para.startswith("- "):
78
- para = para.replace("\n- ", "\n• ").replace("- ", "• ")
79
-
80
- if len(set(c for _, c in unique_info)) > 1:
81
- response += f"{i}. ({category.capitalize()}) {para}\n\n"
82
- else:
83
- response += f"{i}. {para}\n\n"
84
-
85
- endings = [
86
- "Надеюсь, эта информация была полезной!",
87
- "Если хотите узнать больше деталей, уточните вопрос.",
88
- "Могу уточнить какие-то моменты, если нужно.",
89
- "Это основные сведения, которые у меня есть."
90
- ]
91
-
92
- response += random.choice(endings)
93
-
94
- return response
95
 
96
  # Обработка вопроса
97
  def process_question(question, history):
@@ -104,11 +62,15 @@ def process_question(question, history):
104
  if not hasattr(process_question, 'knowledge_base'):
105
  process_question.knowledge_base = load_and_preprocess_files()
106
 
107
- if not hasattr(process_question, 'search_model'):
108
- process_question.search_model = initialize_search_model()
 
 
 
109
 
110
- relevant_info = find_relevant_info(question, process_question.knowledge_base, process_question.search_model)
111
- answer = generate_natural_response(question, relevant_info)
 
112
  history.append((question, answer))
113
  return "", history
114
 
@@ -117,14 +79,12 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
117
  gr.Markdown("""<h1 style='text-align: center'>🧛‍♂️ Мир сверхъестественного 🐺</h1>""")
118
  gr.Markdown("""<div style='text-align: center'>Задавайте вопросы о вампирах, оборотнях и людях на русском языке</div>""")
119
 
120
- # Сначала определяем элементы ввода
121
  msg = gr.Textbox(
122
  label="Ваш вопрос",
123
  placeholder="Введите вопрос и нажмите Enter...",
124
  container=False
125
  )
126
 
127
- # Затем определяем примеры, которые используют msg
128
  examples = gr.Examples(
129
  examples=[
130
  "Какие слабости у вампиров?",
@@ -136,7 +96,6 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
136
  label="Примеры вопросов:"
137
  )
138
 
139
- # Затем определяем чат
140
  chatbot = gr.Chatbot(
141
  label="Диалог",
142
  height=500
 
1
  import gradio as gr
2
  import os
3
  from langdetect import detect
4
+ from transformers import pipeline, AutoTokenizer, AutoModelForQuestionAnswering
5
  import numpy as np
6
  import re
7
  import random
 
28
 
29
  return knowledge_base
30
 
31
+ # Инициализация модели вопрос-ответ
32
+ def initialize_qa_model():
33
+ tokenizer = AutoTokenizer.from_pretrained('DeepPavlov/rubert-base-cased')
34
+ model = AutoModelForQuestionAnswering.from_pretrained('DeepPavlov/rubert-base-cased')
35
+ qa_pipeline = pipeline('question-answering', model=model, tokenizer=tokenizer)
36
+ return qa_pipeline
37
 
38
  # Поиск релевантной информации
39
+ def find_relevant_context(question, knowledge_base):
40
+ all_paragraphs = []
41
  for category, paragraphs in knowledge_base.items():
42
+ all_paragraphs.extend(paragraphs)
 
43
 
44
+ # Чтобы не работать по всей базе, берём случайные 10 абзацев (упрощённый вариант, можно сделать лучше)
45
+ sample_paragraphs = random.sample(all_paragraphs, min(10, len(all_paragraphs)))
46
+ context = " ".join(sample_paragraphs)
47
+ return context
 
 
 
 
 
 
 
48
 
49
+ # Генерация ответа через модель
50
+ def generate_answer(question, context, qa_pipeline):
51
+ result = qa_pipeline(question=question, context=context)
52
+ return result['answer']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
 
54
  # Обработка вопроса
55
  def process_question(question, history):
 
62
  if not hasattr(process_question, 'knowledge_base'):
63
  process_question.knowledge_base = load_and_preprocess_files()
64
 
65
+ if not hasattr(process_question, 'qa_pipeline'):
66
+ process_question.qa_pipeline = initialize_qa_model()
67
+
68
+ context = find_relevant_context(question, process_question.knowledge_base)
69
+ answer = generate_answer(question, context, process_question.qa_pipeline)
70
 
71
+ if not answer.strip():
72
+ answer = "Извините, я не смог найти точный ответ. Попробуйте перефо��мулировать вопрос."
73
+
74
  history.append((question, answer))
75
  return "", history
76
 
 
79
  gr.Markdown("""<h1 style='text-align: center'>🧛‍♂️ Мир сверхъестественного 🐺</h1>""")
80
  gr.Markdown("""<div style='text-align: center'>Задавайте вопросы о вампирах, оборотнях и людях на русском языке</div>""")
81
 
 
82
  msg = gr.Textbox(
83
  label="Ваш вопрос",
84
  placeholder="Введите вопрос и нажмите Enter...",
85
  container=False
86
  )
87
 
 
88
  examples = gr.Examples(
89
  examples=[
90
  "Какие слабости у вампиров?",
 
96
  label="Примеры вопросов:"
97
  )
98
 
 
99
  chatbot = gr.Chatbot(
100
  label="Диалог",
101
  height=500