Wplotnikow commited on
Commit
1ea88b6
·
verified ·
1 Parent(s): 07aacc7

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +66 -0
app.py ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import os
3
+ from langchain_community.embeddings import HuggingFaceEmbeddings
4
+ from langchain_community.vectorstores import FAISS
5
+ from langchain.chains import RetrievalQA
6
+ from langchain_community.llms import HuggingFaceHub
7
+ from huggingface_hub import login
8
+ from langchain_community.document_loaders import UnstructuredWordDocumentLoader
9
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
10
+
11
+ # --- КОНФИГУРАЦИЯ ---
12
+ HF_TOKEN = os.environ.get("HUGGINGFACEHUB_API_TOKEN")
13
+ login(token=HF_TOKEN)
14
+
15
+ EMBEDDING_MODEL = "sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
16
+ LLM_REPO_ID = "mistralai/Mistral-7B-Instruct-v0.2"
17
+ FAISS_INDEX_PATH = "faiss_index"
18
+ SOURCE_DOCUMENT = "Правила подготовки ВКР_СУЛ_набор 2024.docx"
19
+
20
+ # --- АВТОМАТИЧЕСКАЯ ПОДГОТОВКА БАЗЫ ЗНАНИЙ (ПРИ ПЕРВОМ ЗАПУСКЕ) ---
21
+ def create_vector_db_if_not_exists():
22
+ if not os.path.exists(FAISS_INDEX_PATH):
23
+ print("База знаний не найдена. Запускаю процесс создания...")
24
+ if not os.path.exists(SOURCE_DOCUMENT):
25
+ raise FileNotFoundError(f"Ошибка: Файл '{SOURCE_DOCUMENT}' не найден.")
26
+
27
+ loader = UnstructuredWordDocumentLoader(SOURCE_DOCUMENT)
28
+ documents = loader.load()
29
+ text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
30
+ docs = text_splitter.split_documents(documents)
31
+ embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL)
32
+ db = FAISS.from_documents(docs, embeddings)
33
+ db.save_local(FAISS_INDEX_PATH)
34
+ print(f"База знаний успешно создана.")
35
+ else:
36
+ print(f"Обнаружена существующая база знаний. Загружаю ее.")
37
+
38
+ create_vector_db_if_not_exists()
39
+
40
+ # --- ЗАГРУЗКА КОМПОНЕНТОВ ДЛЯ ЧАТ-БОТА ---
41
+ embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL)
42
+ db = FAISS.load_local(FAISS_INDEX_PATH, embeddings, allow_dangerous_deserialization=True)
43
+ llm = HuggingFaceHub(repo_id=LLM_REPO_ID, model_kwargs={"temperature": 0.1, "max_new_tokens": 1024})
44
+ qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_ retriever(search_kwargs={"k": 3}), return_source_documents=True)
45
+
46
+ # --- ФУНКЦИЯ ДЛЯ ИНТЕРФЕЙСА ---
47
+ def get_response(message, history):
48
+ prompt = f"Инструкция: Ты — вежливый и точный ассистент для студентов. Отвечай на вопрос пользователя строго на основе предоставленного контекста. Если в контексте нет ответа, вежливо сообщи, что не можешь ответить. Отвечай на русском языке. Вопрос: {message}"
49
+ result = qa_chain({"query": prompt})
50
+ return result["result"].split("Ответ:")[-1].strip()
51
+
52
+ # --- СОЗДАНИЕ ИНТЕРФЕЙСА GRADIO ---
53
+ demo = gr.ChatInterface(
54
+ fn=get_response,
55
+ title="🎓 Ассистент по написанию ВКР",
56
+ description="Задайте свой вопрос по правилам оформления, срокам или структуре выпускной квалификационной работы.",
57
+ examples=[
58
+ "Какой должен быть объем работы в страницах?",
59
+ "Как правильно оформить ссылку на интернет-источник?",
60
+ "Что делать, если таблица не помещается на одну страницу?",
61
+ "Какие требования к оригинальности текста?"
62
+ ]
63
+ )
64
+
65
+ if __name__ == "__main__":
66
+ demo.launch()