SergeyO7 commited on
Commit
2e4bd35
·
verified ·
1 Parent(s): fdcff15

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +23 -25
app.py CHANGED
@@ -8,14 +8,13 @@ from langchain_community.llms import HuggingFaceHub
8
  from langchain.prompts import ChatPromptTemplate
9
  from dotenv import load_dotenv
10
  import os
11
- import
12
- shutil
13
 
14
- # Load environment variables
15
  load_dotenv()
16
 
17
  CHROMA_PATH = "/tmp/chroma"
18
- DATA_PATH = "" # Укажите путь к вашим данным
19
  PROMPT_TEMPLATE = """
20
  Ответь на вопрос, используя только следующий контекст:
21
  {context}
@@ -23,11 +22,17 @@ PROMPT_TEMPLATE = """
23
  Ответь на вопрос на основе приведенного контекста: {question}
24
  """
25
 
26
- # Инициализация базы данных Chroma один раз при запуске
 
 
27
  def initialize_chroma():
28
-
29
  if not os.path.exists(CHROMA_PATH):
 
30
  generate_data_store()
 
 
 
31
  embeddings = HuggingFaceEmbeddings(
32
  model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
33
  cache_folder="/tmp/model_cache",
@@ -40,7 +45,6 @@ def initialize_chroma():
40
  )
41
  return db
42
 
43
-
44
  def generate_data_store():
45
  documents = load_documents()
46
  if documents:
@@ -50,7 +54,8 @@ def generate_data_store():
50
  def load_documents():
51
  file_path = os.path.join(DATA_PATH, "pl250320252.md")
52
  if not os.path.exists(file_path):
53
- print(f"Ошибка: Файл {file_path} не найден.")
 
54
  return []
55
  loader = UnstructuredMarkdownLoader(file_path)
56
  documents = loader.load()
@@ -64,36 +69,28 @@ def split_text(documents: list[Document]):
64
  add_start_index=True,
65
  )
66
  chunks = text_splitter.split_documents(documents)
67
- print(f"Разделено {len(documents)} документов на {len(chunks)} частей.")
 
68
  return chunks
69
 
70
-
71
  def save_to_chroma(chunks: list[Document]):
72
- # Очищаем базу данных перед сохранением
73
  if os.path.exists(CHROMA_PATH):
74
  shutil.rmtree(CHROMA_PATH)
75
-
76
- # Инициализация эмбеддингов
77
  embeddings = HuggingFaceEmbeddings(
78
  model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
79
- # cache_folder="/tmp/model_cache",
80
  model_kwargs={'device': 'cpu'},
81
  encode_kwargs={'normalize_embeddings': True}
82
  )
83
-
84
- # Создание Chroma DB
85
- db = Chroma.from_documents(
86
  chunks,
87
  embeddings,
88
  persist_directory=CHROMA_PATH
89
  )
90
- print(f"Сохранено {len(chunks)} частей в {CHROMA_PATH}.")
91
-
92
-
93
 
94
- # Обработка запроса пользователя
95
  def process_query(query_text: str, db):
96
  results = db.similarity_search_with_relevance_scores(query_text, k=3)
 
 
97
  if not results or results[0][1] < 0.7:
98
  return "Не найдено подходящих результатов.", []
99
  context_text = "\n\n---\n\n".join([doc.page_content for doc, _ in results])
@@ -107,17 +104,18 @@ def process_query(query_text: str, db):
107
  sources = [doc.metadata.get("source", None) for doc, _ in results]
108
  return response_text, sources
109
 
110
- # Функция для интерфейса Gradio
111
  def chat_interface(query_text):
 
112
  db = initialize_chroma()
113
  response, sources = process_query(query_text, db)
114
- return f"Ответ: {response}\n\nИсточники: {', '.join(sources) if sources else 'Нет источников'}"
 
115
 
116
- # Создаем папки при необходимости
117
  os.makedirs("/tmp/model_cache", exist_ok=True)
118
  os.makedirs("/tmp/chroma", exist_ok=True)
119
 
120
- # Создание и запуск интерфейса Gradio
121
  interface = gr.Interface(
122
  fn=chat_interface,
123
  inputs=gr.Textbox(lines=2, placeholder="Введите ваш вопрос здесь..."),
 
8
  from langchain.prompts import ChatPromptTemplate
9
  from dotenv import load_dotenv
10
  import os
11
+ import shutil
 
12
 
13
+ # Загрузка переменных окружения
14
  load_dotenv()
15
 
16
  CHROMA_PATH = "/tmp/chroma"
17
+ DATA_PATH = "" # Укажите путь к вашим данным, например "data", если файл не в корне
18
  PROMPT_TEMPLATE = """
19
  Ответь на вопрос, используя только следующий контекст:
20
  {context}
 
22
  Ответь на вопрос на основе приведенного контекста: {question}
23
  """
24
 
25
+ # Глобальная переменная для статуса
26
+ status_message = "Инициализация..."
27
+
28
  def initialize_chroma():
29
+ global status_message
30
  if not os.path.exists(CHROMA_PATH):
31
+ status_message = "Создание базы данных Chroma..."
32
  generate_data_store()
33
+ status_message = "База данных Chroma создана и подготовлена."
34
+ else:
35
+ status_message = "База данных Chroma уже существует."
36
  embeddings = HuggingFaceEmbeddings(
37
  model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
38
  cache_folder="/tmp/model_cache",
 
45
  )
46
  return db
47
 
 
48
  def generate_data_store():
49
  documents = load_documents()
50
  if documents:
 
54
  def load_documents():
55
  file_path = os.path.join(DATA_PATH, "pl250320252.md")
56
  if not os.path.exists(file_path):
57
+ global status_message
58
+ status_message = f"Ошибка: Файл {file_path} не найден."
59
  return []
60
  loader = UnstructuredMarkdownLoader(file_path)
61
  documents = loader.load()
 
69
  add_start_index=True,
70
  )
71
  chunks = text_splitter.split_documents(documents)
72
+ global status_message
73
+ status_message += f"\nРазделено {len(documents)} документов на {len(chunks)} частей."
74
  return chunks
75
 
 
76
  def save_to_chroma(chunks: list[Document]):
 
77
  if os.path.exists(CHROMA_PATH):
78
  shutil.rmtree(CHROMA_PATH)
 
 
79
  embeddings = HuggingFaceEmbeddings(
80
  model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
 
81
  model_kwargs={'device': 'cpu'},
82
  encode_kwargs={'normalize_embeddings': True}
83
  )
84
+ Chroma.from_documents(
 
 
85
  chunks,
86
  embeddings,
87
  persist_directory=CHROMA_PATH
88
  )
 
 
 
89
 
 
90
  def process_query(query_text: str, db):
91
  results = db.similarity_search_with_relevance_scores(query_text, k=3)
92
+ global status_message
93
+ status_message += f"\nНайдено {len(results)} результатов с релевантностью: {[round(score, 2) for _, score in results]}"
94
  if not results or results[0][1] < 0.7:
95
  return "Не найдено подходящих результатов.", []
96
  context_text = "\n\n---\n\n".join([doc.page_content for doc, _ in results])
 
104
  sources = [doc.metadata.get("source", None) for doc, _ in results]
105
  return response_text, sources
106
 
 
107
  def chat_interface(query_text):
108
+ global status_message
109
  db = initialize_chroma()
110
  response, sources = process_query(query_text, db)
111
+ full_response = f"{status_message}\n\nОтвет: {response}\n\nИсточники: {', '.join(sources) if sources else 'Нет источников'}"
112
+ return full_response
113
 
114
+ # Создание папок
115
  os.makedirs("/tmp/model_cache", exist_ok=True)
116
  os.makedirs("/tmp/chroma", exist_ok=True)
117
 
118
+ # Интерфейс Gradio
119
  interface = gr.Interface(
120
  fn=chat_interface,
121
  inputs=gr.Textbox(lines=2, placeholder="Введите ваш вопрос здесь..."),