Loversofdeath commited on
Commit
9faaee5
·
verified ·
1 Parent(s): 5124c37

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -45
app.py CHANGED
@@ -2,10 +2,14 @@ import os
2
  import gradio as gr
3
  from langchain.document_loaders import TextLoader
4
  from langchain.text_splitter import RecursiveCharacterTextSplitter
5
- from langchain.embeddings import HuggingFaceEmbeddings
6
  from langchain.vectorstores import FAISS
7
  from langchain.chains import RetrievalQA
8
  from langchain.llms import HuggingFaceHub
 
 
 
 
 
9
 
10
  # Конфигурация
11
  DOCS_DIR = "lore"
@@ -13,79 +17,101 @@ EMBEDDINGS_MODEL = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
13
  LLM_REPO = "IlyaGusev/saiga_mistral_7b"
14
  HF_TOKEN = os.getenv("HF_TOKEN") # Добавьте в Secrets Space
15
 
16
- # 1. Загрузка документов с обработкой ошибок
17
- def load_documents():
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  docs = []
19
- for filename in os.listdir(DOCS_DIR):
20
- if filename.endswith(".txt"):
 
 
 
21
  try:
22
- loader = TextLoader(
23
- os.path.join(DOCS_DIR, filename),
24
- encoding="utf-8"
25
- )
26
  docs.extend(loader.load())
 
27
  except Exception as e:
28
- print(f"Ошибка загрузки {filename}: {str(e)}")
29
  return docs
30
 
31
- # 2. Инициализация эмбеддингов с проверкой
32
  def get_embeddings():
33
  try:
34
  return HuggingFaceEmbeddings(model_name=EMBEDDINGS_MODEL)
35
- except ImportError:
36
- raise ImportError(
37
- "Требуемые пакеты не установлены. "
38
- "Добавьте в requirements.txt:\n"
39
- "sentence-transformers\n"
40
- "torch\n"
41
- "transformers"
42
- )
43
 
44
- # 3. Подготовка базы знаний
45
- def prepare_knowledge_base():
46
- documents = load_documents()
 
 
 
 
 
 
47
  text_splitter = RecursiveCharacterTextSplitter(
48
- chunk_size=500,
49
- chunk_overlap=50,
50
  separators=["\n\n", "\n", " ", ""]
51
  )
52
  splits = text_splitter.split_documents(documents)
 
 
53
  embeddings = get_embeddings()
54
- return FAISS.from_documents(splits, embeddings)
55
-
56
- # 4. Создание цепочки QA
57
- def create_qa_chain():
58
  llm = HuggingFaceHub(
59
  repo_id=LLM_REPO,
60
  huggingfacehub_api_token=HF_TOKEN,
61
  model_kwargs={
62
- "temperature": 0.3,
63
- "max_new_tokens": 200
64
  }
65
  )
 
66
  return RetrievalQA.from_chain_type(
67
  llm=llm,
68
  chain_type="stuff",
69
- retriever=prepare_knowledge_base().as_retriever(
70
- search_kwargs={"k": 2}
71
- )
72
  )
73
 
74
- # 5. Интерфейс с обработкой ошибок
75
- def get_answer(question):
76
  try:
77
- qa = create_qa_chain()
78
- result = qa.run(question)
79
- return result[:500] # Обрезаем слишком длинные ответы
 
 
 
 
80
  except Exception as e:
81
- return f"⚠️ Ошибка: {str(e)}"
82
 
83
- # Запуск приложения
84
  with gr.Blocks(title="📚 Лор-бот") as app:
85
- gr.Markdown("## 🧛 Вопрос-ответ по лору")
86
- question = gr.Textbox(label="Ваш вопрос", placeholder="Какие слабости у вампиров?")
87
- output = gr.Textbox(label="Ответ", interactive=False)
88
- btn = gr.Button("Спросить")
89
- btn.click(get_answer, inputs=question, outputs=output)
 
 
90
 
91
  app.launch(server_name="0.0.0.0", server_port=7860)
 
2
  import gradio as gr
3
  from langchain.document_loaders import TextLoader
4
  from langchain.text_splitter import RecursiveCharacterTextSplitter
 
5
  from langchain.vectorstores import FAISS
6
  from langchain.chains import RetrievalQA
7
  from langchain.llms import HuggingFaceHub
8
+ from langchain.embeddings import HuggingFaceEmbeddings
9
+ import warnings
10
+
11
+ # Фикс для предупреждений
12
+ warnings.filterwarnings("ignore")
13
 
14
  # Конфигурация
15
  DOCS_DIR = "lore"
 
17
  LLM_REPO = "IlyaGusev/saiga_mistral_7b"
18
  HF_TOKEN = os.getenv("HF_TOKEN") # Добавьте в Secrets Space
19
 
20
+ # 1. Проверка зависимостей
21
+ def check_dependencies():
22
+ try:
23
+ from sentence_transformers import SentenceTransformer
24
+ import torch
25
+ from transformers import pipeline
26
+ print("✔ Все зависимости установлены")
27
+ except ImportError as e:
28
+ raise ImportError(
29
+ f"❌ Не хватает пакетов. Убедитесь, что requirements.txt содержит:\n"
30
+ f"- sentence-transformers\n- torch\n- transformers\n\n"
31
+ f"Ошибка: {str(e)}"
32
+ )
33
+
34
+ # 2. Загрузка документов
35
+ def load_docs():
36
  docs = []
37
+ if not os.path.exists(DOCS_DIR):
38
+ raise FileNotFoundError(f"Папка {DOCS_DIR} не найдена!")
39
+
40
+ for file in os.listdir(DOCS_DIR):
41
+ if file.endswith(".txt"):
42
  try:
43
+ loader = TextLoader(os.path.join(DOCS_DIR, file), encoding="utf-8")
 
 
 
44
  docs.extend(loader.load())
45
+ print(f"✓ Загружен файл: {file}")
46
  except Exception as e:
47
+ print(f"Ошибка в файле {file}: {str(e)}")
48
  return docs
49
 
50
+ # 3. Инициализация модели эмбеддингов
51
  def get_embeddings():
52
  try:
53
  return HuggingFaceEmbeddings(model_name=EMBEDDINGS_MODEL)
54
+ except Exception as e:
55
+ raise RuntimeError(f"Ошибка инициализации эмбеддингов: {str(e)}")
 
 
 
 
 
 
56
 
57
+ # 4. Основная логика
58
+ def setup_qa_system():
59
+ check_dependencies()
60
+
61
+ # Загрузка и обработка документов
62
+ documents = load_docs()
63
+ if not documents:
64
+ raise ValueError("Нет документов для обработки!")
65
+
66
  text_splitter = RecursiveCharacterTextSplitter(
67
+ chunk_size=300,
68
+ chunk_overlap=30,
69
  separators=["\n\n", "\n", " ", ""]
70
  )
71
  splits = text_splitter.split_documents(documents)
72
+
73
+ # Создание векторного хранилища
74
  embeddings = get_embeddings()
75
+ db = FAISS.from_documents(splits, embeddings)
76
+
77
+ # Инициализация языковой модели
 
78
  llm = HuggingFaceHub(
79
  repo_id=LLM_REPO,
80
  huggingfacehub_api_token=HF_TOKEN,
81
  model_kwargs={
82
+ "temperature": 0.2,
83
+ "max_length": 300
84
  }
85
  )
86
+
87
  return RetrievalQA.from_chain_type(
88
  llm=llm,
89
  chain_type="stuff",
90
+ retriever=db.as_retriever(search_kwargs={"k": 2}),
91
+ return_source_documents=True
 
92
  )
93
 
94
+ # 5. Функция для интерфейса
95
+ def answer_question(question):
96
  try:
97
+ qa = setup_qa_system()
98
+ result = qa({"query": question})
99
+ answer = result["result"]
100
+
101
+ # Форматирование ответа
102
+ sources = list({os.path.basename(doc.metadata["source"]) for doc in result["source_documents"]})
103
+ return f"{answer}\n\n(Источники: {', '.join(sources)})"
104
  except Exception as e:
105
+ return f" Произошла ошибка: {str(e)}"
106
 
107
+ # Интерфейс
108
  with gr.Blocks(title="📚 Лор-бот") as app:
109
+ gr.Markdown("## 🧛 Справочник по сверхъестественному")
110
+ with gr.Row():
111
+ question = gr.Textbox(label="Ваш вопрос", placeholder="Какие слабости у вампиров?")
112
+ submit = gr.Button("Спросить")
113
+ answer = gr.Textbox(label="Ответ", interactive=False)
114
+
115
+ submit.click(answer_question, inputs=question, outputs=answer)
116
 
117
  app.launch(server_name="0.0.0.0", server_port=7860)