SergeyO7 commited on
Commit
ac1079c
·
verified ·
1 Parent(s): fecdf12

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -31
app.py CHANGED
@@ -1,3 +1,4 @@
 
1
  from langchain_community.document_loaders import UnstructuredMarkdownLoader
2
  from langchain.text_splitter import RecursiveCharacterTextSplitter
3
  from langchain_core.documents import Document
@@ -12,7 +13,7 @@ import shutil
12
  # Load environment variables
13
  load_dotenv()
14
 
15
- CHROMA_PATH = "chroma"
16
  DATA_PATH = "" # Укажите путь к вашим данным
17
  PROMPT_TEMPLATE = """
18
  Ответь на вопрос, используя только следующий контекст:
@@ -21,10 +22,26 @@ PROMPT_TEMPLATE = """
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):
@@ -52,33 +69,6 @@ def main():
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}")
81
- print(f"Источники: {sources}")
82
 
83
  def generate_data_store():
84
  documents = load_documents()
@@ -114,7 +104,7 @@ def save_to_chroma(chunks: list[Document]):
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
  )
@@ -127,5 +117,36 @@ def save_to_chroma(chunks: list[Document]):
127
  )
128
  print(f"Сохранено {len(chunks)} частей в {CHROMA_PATH}.")
129
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  if __name__ == "__main__":
131
  main()
 
1
+ import gradio as gr
2
  from langchain_community.document_loaders import UnstructuredMarkdownLoader
3
  from langchain.text_splitter import RecursiveCharacterTextSplitter
4
  from langchain_core.documents import Document
 
13
  # Load environment variables
14
  load_dotenv()
15
 
16
+ CHROMA_PATH = "/tmp/chroma"
17
  DATA_PATH = "" # Укажите путь к вашим данным
18
  PROMPT_TEMPLATE = """
19
  Ответь на вопрос, используя только следующий контекст:
 
22
  Ответь на вопрос на основе приведенного контекста: {question}
23
  """
24
 
25
+ # Инициализация базы данных Chroma один раз при запуске
26
+ def initialize_chroma():
27
+ if not os.path.exists(CHROMA_PATH):
28
+ generate_data_store()
29
+ embeddings = HuggingFaceEmbeddings(
30
+ model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
31
+ cache_folder="/tmp/model_cache",
32
+ model_kwargs={'device': 'cpu'},
33
+ encode_kwargs={'normalize_embeddings': True}
34
+ )
35
+ db = Chroma(
36
+ persist_directory=CHROMA_PATH,
37
+ embedding_function=embeddings
38
+ )
39
+ return db
40
+
41
  def main():
42
  # Создаем папки при необходимости
43
+ os.makedirs("/tmp/model_cache", exist_ok=True)
44
+ os.makedirs("/tmp/chroma", exist_ok=True)
45
 
46
  # Генерируем или загружаем базу данных Chroma один раз
47
  if not os.path.exists(CHROMA_PATH):
 
69
  break
70
  process_query(query_text, db)
71
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
 
73
  def generate_data_store():
74
  documents = load_documents()
 
104
  # Инициализация эмбеддингов
105
  embeddings = HuggingFaceEmbeddings(
106
  model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
107
+ cache_folder="/tmp/model_cache",
108
  model_kwargs={'device': 'cpu'},
109
  encode_kwargs={'normalize_embeddings': True}
110
  )
 
117
  )
118
  print(f"Сохранено {len(chunks)} частей в {CHROMA_PATH}.")
119
 
120
+ # Обработка запроса пользователя
121
+ def process_query(query_text: str, db):
122
+ results = db.similarity_search_with_relevance_scores(query_text, k=3)
123
+ if not results or results[0][1] < 0.7:
124
+ return "Не найдено подходящих результатов.", []
125
+ context_text = "\n\n---\n\n".join([doc.page_content for doc, _ in results])
126
+ prompt_template = ChatPromptTemplate.from_template(PROMPT_TEMPLATE)
127
+ prompt = prompt_template.format(context=context_text, question=query_text)
128
+ model = HuggingFaceHub(
129
+ repo_id="google/flan-t5-small",
130
+ model_kwargs={"temperature": 0.5, "max_length": 512}
131
+ )
132
+ response_text = model.predict(prompt)
133
+ sources = [doc.metadata.get("source", None) for doc, _ in results]
134
+ return response_text, sources
135
+
136
+ # Функция для интерфейса Gradio
137
+ def chat_interface(query_text):
138
+ db = initialize_chroma()
139
+ response, sources = process_query(query_text, db)
140
+ return f"Ответ: {response}\n\nИсточники: {', '.join(sources) if sources else 'Нет источников'}"
141
+
142
+ # Создание и запуск интерфейса Gradio
143
+ interface = gr.Interface(
144
+ fn=chat_interface,
145
+ inputs=gr.Textbox(lines=2, placeholder="Введите ваш вопрос здесь..."),
146
+ outputs="text",
147
+ title="Чат с документами",
148
+ description="Задайте вопрос, и я отвечу на основе загруженных документов."
149
+ )
150
+
151
  if __name__ == "__main__":
152
  main()