SergeyO7 commited on
Commit
babb405
·
verified ·
1 Parent(s): 06424fd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -46
app.py CHANGED
@@ -1,81 +1,80 @@
1
  from langchain_community.document_loaders import UnstructuredMarkdownLoader
2
  from langchain.text_splitter import RecursiveCharacterTextSplitter
3
- from langchain_core.documents import Document # Updated import
4
- # from langchain_openai import OpenAIEmbeddings
5
- from langchain_huggingface import HuggingFaceEmbeddings # Updated import
6
- from langchain.evaluation import load_evaluator
7
  from langchain_community.vectorstores import Chroma
8
  from langchain_community.llms import HuggingFaceHub
9
  from langchain.prompts import ChatPromptTemplate
10
- from langchain_chroma import Chroma
11
  from dotenv import load_dotenv
12
- import argparse
13
  import os
14
- import shutil # Added import
15
- import numpy as np
16
-
17
 
18
  # Load environment variables
19
  load_dotenv()
20
- # Assumes OPENAI_API_KEY is set in .env
21
 
22
  CHROMA_PATH = "chroma"
23
- DATA_PATH = "" # Update this to your actual data path
24
  PROMPT_TEMPLATE = """
25
  Ответь на вопрос, используя только следующий контекст:
26
-
27
  {context}
28
-
29
  ---
30
-
31
  Ответь на вопрос на основе приведенного контекста: {question}
32
  """
33
 
34
  def main():
35
  # Создаем папки при необходимости
36
  os.makedirs("model_cache", exist_ok=True)
37
- os.makedirs("chroma", exist_ok=True)
38
-
39
- generate_data_store()
40
 
41
- help="Что означает Солнце на третьей ступени лестницы?"
42
- process_query(help)
 
43
 
44
- def process_query(query_text: str):
45
  # Инициализация эмбеддингов
46
  embeddings = HuggingFaceEmbeddings(
47
  model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
48
  cache_folder="model_cache"
49
  )
50
-
51
  # Загрузка векторной БД
52
  db = Chroma(
53
- persist_directory=CHROMA_PATH,
54
  embedding_function=embeddings
55
  )
56
-
 
 
 
 
 
 
 
 
 
 
 
57
  # Поиск по схожести
58
  results = db.similarity_search_with_relevance_scores(query_text, k=3)
59
  if not results or results[0][1] < 0.7:
60
  print("Не найдено подходящих результатов.")
61
  return
62
-
63
  # Формирование контекста
64
  context_text = "\n\n---\n\n".join([doc.page_content for doc, _ in results])
65
-
66
  # Создание промпта
67
  prompt_template = ChatPromptTemplate.from_template(PROMPT_TEMPLATE)
68
  prompt = prompt_template.format(context=context_text, question=query_text)
69
-
70
  # Инициализация модели для генерации
71
  model = HuggingFaceHub(
72
  repo_id="google/flan-t5-small",
73
  model_kwargs={"temperature": 0.5, "max_length": 512}
74
  )
75
-
76
  # Генерация ответа
77
  response_text = model.predict(prompt)
78
-
79
  # Форматирование вывода
80
  sources = [doc.metadata.get("source", None) for doc, _ in results]
81
  print(f"Ответ: {response_text}")
@@ -90,7 +89,7 @@ def generate_data_store():
90
  def load_documents():
91
  file_path = os.path.join(DATA_PATH, "pl250320251.md")
92
  if not os.path.exists(file_path):
93
- print(f"Error: File {file_path} not found.")
94
  return []
95
  loader = UnstructuredMarkdownLoader(file_path)
96
  documents = loader.load()
@@ -104,36 +103,29 @@ def split_text(documents: list[Document]):
104
  add_start_index=True,
105
  )
106
  chunks = text_splitter.split_documents(documents)
107
- print(f"Split {len(documents)} documents into {len(chunks)} chunks.")
108
-
109
- document = chunks[10]
110
- print(document.page_content)
111
- print(document.metadata)
112
-
113
  return chunks
114
 
115
-
116
  def save_to_chroma(chunks: list[Document]):
117
- # Clear out the database first
118
  if os.path.exists(CHROMA_PATH):
119
  shutil.rmtree(CHROMA_PATH)
120
 
121
- # Initialize embeddings with cache
122
  embeddings = HuggingFaceEmbeddings(
123
- # model_name="BAAI/bge-m3", # 2.27Gb
124
- model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2", #133Mb
125
- cache_folder="model_cache", # Правильное место для кэша
126
- model_kwargs={'device': 'cpu'}, # Форсируем использование CPU
127
  encode_kwargs={'normalize_embeddings': True}
128
  )
129
 
130
- # Create Chroma DB
131
  db = Chroma.from_documents(
132
- chunks,
133
- embeddings, # Используем предварительно созданный объект
134
  persist_directory=CHROMA_PATH
135
  )
136
- print(f"Saved {len(chunks)} chunks to {CHROMA_PATH}.")
137
 
138
  if __name__ == "__main__":
139
  main()
 
1
  from langchain_community.document_loaders import UnstructuredMarkdownLoader
2
  from langchain.text_splitter import RecursiveCharacterTextSplitter
3
+ from langchain_core.documents import Document
4
+ from langchain_huggingface import HuggingFaceEmbeddings
 
 
5
  from langchain_community.vectorstores import Chroma
6
  from langchain_community.llms import HuggingFaceHub
7
  from langchain.prompts import ChatPromptTemplate
 
8
  from dotenv import load_dotenv
 
9
  import os
10
+ import shutil
 
 
11
 
12
  # Load environment variables
13
  load_dotenv()
 
14
 
15
  CHROMA_PATH = "chroma"
16
+ DATA_PATH = "" # Укажите путь к вашим данным
17
  PROMPT_TEMPLATE = """
18
  Ответь на вопрос, используя только следующий контекст:
 
19
  {context}
 
20
  ---
 
21
  Ответь на вопрос на основе приведенного контекста: {question}
22
  """
23
 
24
  def main():
25
  # Создаем папки при необходимости
26
  os.makedirs("model_cache", exist_ok=True)
27
+ os.makedirs("chroma", exist_ok=True)
 
 
28
 
29
+ # Генерируем или загружаем базу данных Chroma один раз
30
+ if not os.path.exists(CHROMA_PATH):
31
+ generate_data_store()
32
 
 
33
  # Инициализация эмбеддингов
34
  embeddings = HuggingFaceEmbeddings(
35
  model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
36
  cache_folder="model_cache"
37
  )
38
+
39
  # Загрузка векторной БД
40
  db = Chroma(
41
+ persist_directory=CHROMA_PATH,
42
  embedding_function=embeddings
43
  )
44
+
45
+ print("Чат готов. Введите ваш вопрос или 'exit' для выхода.")
46
+
47
+ # Интерактивный цикл чата
48
+ while True:
49
+ query_text = input("Вы: ")
50
+ if query_text.lower() in ["exit", "quit"]:
51
+ print("Выход из чата.")
52
+ break
53
+ process_query(query_text, db)
54
+
55
+ def process_query(query_text: str, db):
56
  # Поиск по схожести
57
  results = db.similarity_search_with_relevance_scores(query_text, k=3)
58
  if not results or results[0][1] < 0.7:
59
  print("Не найдено подходящих результатов.")
60
  return
61
+
62
  # Формирование контекста
63
  context_text = "\n\n---\n\n".join([doc.page_content for doc, _ in results])
64
+
65
  # Создание промпта
66
  prompt_template = ChatPromptTemplate.from_template(PROMPT_TEMPLATE)
67
  prompt = prompt_template.format(context=context_text, question=query_text)
68
+
69
  # Инициализация модели для генерации
70
  model = HuggingFaceHub(
71
  repo_id="google/flan-t5-small",
72
  model_kwargs={"temperature": 0.5, "max_length": 512}
73
  )
74
+
75
  # Генерация ответа
76
  response_text = model.predict(prompt)
77
+
78
  # Форматирование вывода
79
  sources = [doc.metadata.get("source", None) for doc, _ in results]
80
  print(f"Ответ: {response_text}")
 
89
  def load_documents():
90
  file_path = os.path.join(DATA_PATH, "pl250320251.md")
91
  if not os.path.exists(file_path):
92
+ print(f"Ошибка: Файл {file_path} не найден.")
93
  return []
94
  loader = UnstructuredMarkdownLoader(file_path)
95
  documents = loader.load()
 
103
  add_start_index=True,
104
  )
105
  chunks = text_splitter.split_documents(documents)
106
+ print(f"Разделено {len(documents)} документов на {len(chunks)} частей.")
 
 
 
 
 
107
  return chunks
108
 
 
109
  def save_to_chroma(chunks: list[Document]):
110
+ # Очищаем базу данных перед сохранением
111
  if os.path.exists(CHROMA_PATH):
112
  shutil.rmtree(CHROMA_PATH)
113
 
114
+ # Инициализация эмбеддингов
115
  embeddings = HuggingFaceEmbeddings(
116
+ model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
117
+ cache_folder="model_cache",
118
+ model_kwargs={'device': 'cpu'},
 
119
  encode_kwargs={'normalize_embeddings': True}
120
  )
121
 
122
+ # Создание Chroma DB
123
  db = Chroma.from_documents(
124
+ chunks,
125
+ embeddings,
126
  persist_directory=CHROMA_PATH
127
  )
128
+ print(f"Сохранено {len(chunks)} частей в {CHROMA_PATH}.")
129
 
130
  if __name__ == "__main__":
131
  main()