Wplotnikow commited on
Commit
192643b
·
verified ·
1 Parent(s): f60d0cc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +10 -24
app.py CHANGED
@@ -5,7 +5,6 @@ from huggingface_hub import login
5
  import gradio as gr
6
 
7
  # ШАГ 1: Гарантированная загрузка необходимого компонента NLTK
8
- # Эта команда выполняется в самом начале и решает ошибку 'LookupError'.
9
  try:
10
  print("Проверяем наличие NLTK компонента 'punkt'...")
11
  nltk.data.find('tokenizers/punkt')
@@ -15,7 +14,6 @@ except LookupError:
15
  nltk.download('punkt', quiet=False)
16
  print("Загрузка 'punkt' завершена.")
17
 
18
-
19
  from langchain_community.document_loaders import UnstructuredWordDocumentLoader
20
  from langchain.text_splitter import RecursiveCharacterTextSplitter
21
  from langchain_community.embeddings import HuggingFaceEmbeddings
@@ -30,25 +28,25 @@ MODEL_NAME = "sentence-transformers/all-MiniLM-L6-v2"
30
  REPO_ID = "mistralai/Mistral-7B-Instruct-v0.2"
31
 
32
  # --- ШАГ 2: Автоматическое создание базы знаний ---
33
-
34
  def create_vector_db_if_not_exists():
35
- """Создает векторную базу данных, если она еще не создана."""
36
  if os.path.exists(FAISS_INDEX_PATH):
37
  print(f"База знаний найдена в '{FAISS_INDEX_PATH}'. Пропускаю создание.")
 
 
 
 
 
38
  return
39
 
40
  print("База знаний не найдена. Запускаю процесс создания...")
41
 
42
- # Автоматически находим первый .docx файл в репозитории
43
  docx_files = glob.glob("*.docx")
44
  if not docx_files:
45
  raise FileNotFoundError("Ошибка: Не найден .docx файл в репозитории. Пожалуйста, загрузите ваш документ.")
46
 
47
- global DOCX_FILE_PATH
48
  DOCX_FILE_PATH = docx_files[0]
49
  print(f"Найден документ для обработки: {DOCX_FILE_PATH}")
50
 
51
- # Загрузка и обработка документа
52
  loader = UnstructuredWordDocumentLoader(DOCX_FILE_PATH)
53
  documents = loader.load()
54
 
@@ -57,7 +55,6 @@ def create_vector_db_if_not_exists():
57
 
58
  print(f"Документ разделен на {len(docs)} частей.")
59
 
60
- # Создание эмбеддингов и сохранение базы
61
  embeddings = HuggingFaceEmbeddings(model_name=MODEL_NAME)
62
  db = FAISS.from_documents(docs, embeddings)
63
  db.save_local(FAISS_INDEX_PATH)
@@ -65,10 +62,7 @@ def create_vector_db_if_not_exists():
65
  print(f"База знаний успешно создана и сохранена в '{FAISS_INDEX_PATH}'.")
66
 
67
  # --- ШАГ 3: Загрузка AI и настройка логики чат-бота ---
68
-
69
  def initialize_qa_chain():
70
- """Инициализирует и возвращает готовую к работе цепочку QA."""
71
- # Проверка наличия токена
72
  HF_TOKEN = os.environ.get("HUGGINGFACEHUB_API_TOKEN")
73
  if not HF_TOKEN:
74
  raise ValueError("Секрет 'HUGGINGFACEHUB_API_TOKEN' не найден. Пожалуйста, добавьте его в настройках Space.")
@@ -76,11 +70,9 @@ def initialize_qa_chain():
76
  login(token=HF_TOKEN)
77
  print("Успешная аутентификация по токену.")
78
 
79
- # Загрузка векторной базы
80
  embeddings = HuggingFaceEmbeddings(model_name=MODEL_NAME)
81
  db = FAISS.load_local(FAISS_INDEX_PATH, embeddings, allow_dangerous_deserialization=True)
82
 
83
- # Настройка языковой модели (LLM) через новый класс HuggingFaceEndpoint
84
  llm = HuggingFaceEndpoint(
85
  repo_id=REPO_ID,
86
  temperature=0.3,
@@ -89,7 +81,6 @@ def initialize_qa_chain():
89
  huggingfacehub_api_token=HF_TOKEN
90
  )
91
 
92
- # Создание цепочки Вопрос-Ответ
93
  qa_chain = RetrievalQA.from_chain_type(
94
  llm=llm,
95
  chain_type="stuff",
@@ -104,20 +95,18 @@ create_vector_db_if_not_exists()
104
  qa_chain = initialize_qa_chain()
105
 
106
  def chatbot_response(message, history):
107
- """Основная функция для генерации ответа чат-бота."""
108
  response = qa_chain.invoke({"query": message})
109
  return response["result"]
110
 
111
- # --- ШАГ 4: Создание веб-интерфейса ---
112
-
113
  with gr.Blocks(theme='gradio/soft', title="AI-Ассистент по ВКР") as demo:
114
  gr.Markdown("# 🤖 AI-Ассистент по вопросам ВКР")
115
  gr.Markdown(f"Этот бот отвечает на вопросы на основе документа: **{os.path.basename(DOCX_FILE_PATH)}**.")
116
 
117
- chatbot = gr.ChatInterface(
 
 
118
  fn=chatbot_response,
119
- chatbot=gr.Chatbot(height=400),
120
- textbox=gr.Textbox(placeholder="Задайте свой вопрос о правилах оформления, сроках или структуре ВКР...", container=False, scale=7),
121
  title=None,
122
  examples=[
123
  "Какие требования к объему магистерской диссертации?",
@@ -125,10 +114,7 @@ with gr.Blocks(theme='gradio/soft', title="AI-Ассистент по ВКР") a
125
  "Какие сроки сдачи и защиты ВКР в этом году?",
126
  "Что должно быть во введении?",
127
  "Какой процент оригинальности требуется?"
128
- ],
129
- clear_btn="🗑️ Очистить диалог",
130
- retry_btn=None,
131
- undo_btn=None,
132
  )
133
 
134
  # Запуск приложения
 
5
  import gradio as gr
6
 
7
  # ШАГ 1: Гарантированная загрузка необходимого компонента NLTK
 
8
  try:
9
  print("Проверяем наличие NLTK компонента 'punkt'...")
10
  nltk.data.find('tokenizers/punkt')
 
14
  nltk.download('punkt', quiet=False)
15
  print("Загрузка 'punkt' завершена.")
16
 
 
17
  from langchain_community.document_loaders import UnstructuredWordDocumentLoader
18
  from langchain.text_splitter import RecursiveCharacterTextSplitter
19
  from langchain_community.embeddings import HuggingFaceEmbeddings
 
28
  REPO_ID = "mistralai/Mistral-7B-Instruct-v0.2"
29
 
30
  # --- ШАГ 2: Автоматическое создание базы знаний ---
 
31
  def create_vector_db_if_not_exists():
 
32
  if os.path.exists(FAISS_INDEX_PATH):
33
  print(f"База знаний найдена в '{FAISS_INDEX_PATH}'. Пропускаю создание.")
34
+ global DOCX_FILE_PATH
35
+ # Если база есть, все равно найдем имя файла для отображения в интерфейсе
36
+ docx_files = glob.glob("*.docx")
37
+ if docx_files:
38
+ DOCX_FILE_PATH = docx_files[0]
39
  return
40
 
41
  print("База знаний не найдена. Запускаю процесс создания...")
42
 
 
43
  docx_files = glob.glob("*.docx")
44
  if not docx_files:
45
  raise FileNotFoundError("Ошибка: Не найден .docx файл в репозитории. Пожалуйста, загрузите ваш документ.")
46
 
 
47
  DOCX_FILE_PATH = docx_files[0]
48
  print(f"Найден документ для обработки: {DOCX_FILE_PATH}")
49
 
 
50
  loader = UnstructuredWordDocumentLoader(DOCX_FILE_PATH)
51
  documents = loader.load()
52
 
 
55
 
56
  print(f"Документ разделен на {len(docs)} частей.")
57
 
 
58
  embeddings = HuggingFaceEmbeddings(model_name=MODEL_NAME)
59
  db = FAISS.from_documents(docs, embeddings)
60
  db.save_local(FAISS_INDEX_PATH)
 
62
  print(f"База знаний успешно создана и сохранена в '{FAISS_INDEX_PATH}'.")
63
 
64
  # --- ШАГ 3: Загрузка AI и настройка логики чат-бота ---
 
65
  def initialize_qa_chain():
 
 
66
  HF_TOKEN = os.environ.get("HUGGINGFACEHUB_API_TOKEN")
67
  if not HF_TOKEN:
68
  raise ValueError("Секрет 'HUGGINGFACEHUB_API_TOKEN' не найден. Пожалуйста, добавьте его в настройках Space.")
 
70
  login(token=HF_TOKEN)
71
  print("Успешная аутентификация по токену.")
72
 
 
73
  embeddings = HuggingFaceEmbeddings(model_name=MODEL_NAME)
74
  db = FAISS.load_local(FAISS_INDEX_PATH, embeddings, allow_dangerous_deserialization=True)
75
 
 
76
  llm = HuggingFaceEndpoint(
77
  repo_id=REPO_ID,
78
  temperature=0.3,
 
81
  huggingfacehub_api_token=HF_TOKEN
82
  )
83
 
 
84
  qa_chain = RetrievalQA.from_chain_type(
85
  llm=llm,
86
  chain_type="stuff",
 
95
  qa_chain = initialize_qa_chain()
96
 
97
  def chatbot_response(message, history):
 
98
  response = qa_chain.invoke({"query": message})
99
  return response["result"]
100
 
101
+ # --- ШАГ 4: Создание веб-интерфейса (ИСПРАВЛЕННАЯ ВЕРСИЯ) ---
 
102
  with gr.Blocks(theme='gradio/soft', title="AI-Ассистент по ВКР") as demo:
103
  gr.Markdown("# 🤖 AI-Ассистент по вопросам ВКР")
104
  gr.Markdown(f"Этот бот отвечает на вопросы на основе документа: **{os.path.basename(DOCX_FILE_PATH)}**.")
105
 
106
+ # В новой версии Gradio параметры кнопок встроены по умолчанию.
107
+ # Просто убираем лишние аргументы, и все заработает.
108
+ gr.ChatInterface(
109
  fn=chatbot_response,
 
 
110
  title=None,
111
  examples=[
112
  "Какие требования к объему магистерской диссертации?",
 
114
  "Какие сроки сдачи и защиты ВКР в этом году?",
115
  "Что должно быть во введении?",
116
  "Какой процент оригинальности требуется?"
117
+ ]
 
 
 
118
  )
119
 
120
  # Запуск приложения