Loversofdeath commited on
Commit
4b347f0
·
verified ·
1 Parent(s): 20f6cf2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -36
app.py CHANGED
@@ -1,57 +1,90 @@
1
  import os
2
- import torch
3
- from langchain.embeddings import HuggingFaceEmbeddings
4
- from langchain.vectorstores import Chroma
 
 
 
 
5
  from langchain.chains import RetrievalQA
6
- from langchain.llms import HuggingFacePipeline
7
  from transformers import pipeline
 
8
 
9
- # Убедись, что все нужные модели и данные сохранены в этой папке
10
- PERSIST_DIRECTORY = "db"
 
 
 
 
 
 
11
 
12
- # Создание эмбеддингов
 
 
 
 
13
  def create_embeddings():
14
- return HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
 
 
15
 
16
- # Загрузка векторного хранилища
17
- def load_vectorstore():
18
- embeddings = create_embeddings()
19
- return Chroma(persist_directory=PERSIST_DIRECTORY, embedding_function=embeddings)
 
 
 
20
 
21
- # Создание пайплайна LLM (используем GPU, если доступен)
22
  def create_llm_pipeline():
23
  return pipeline(
24
  "text-generation",
25
  model="IlyaGusev/saiga2_7b_lora",
26
- device=0 if torch.cuda.is_available() else -1,
27
- max_new_tokens=512,
28
- do_sample=True,
29
- top_k=50,
30
- top_p=0.95,
31
- temperature=0.7
32
  )
33
 
34
- # Обёртка LLM для использования с LangChain
35
- def create_llm():
36
- pipe = create_llm_pipeline()
37
- return HuggingFacePipeline(pipeline=pipe)
38
-
39
- # Сборка цепочки QA
40
  def build_chain():
41
- vectorstore = load_vectorstore()
42
- retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
43
- llm = create_llm()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  return RetrievalQA.from_chain_type(
45
- llm=llm,
46
  retriever=retriever,
47
- return_source_documents=True
48
  )
49
 
50
- # Создаём QA цепочку
51
  qa_chain = build_chain()
52
 
53
- # Пример запроса (можешь удалить или адаптировать)
54
- if __name__ == "__main__":
55
- question = "Кто такой Виктор Цой?"
56
- result = qa_chain(question)
57
- print("\nОтвет:\n", result["result"])
 
 
 
 
 
1
  import os
2
+ import re
3
+ import torch # Добавлен импорт torch
4
+ from langchain_community.document_loaders import TextLoader
5
+ from langchain.text_splitter import CharacterTextSplitter
6
+ from langchain_community.vectorstores import FAISS
7
+ from langchain_community.embeddings import HuggingFaceEmbeddings
8
+ from langchain_core.prompts import PromptTemplate
9
  from langchain.chains import RetrievalQA
 
10
  from transformers import pipeline
11
+ import gradio as gr
12
 
13
+ # 1. Загрузка всех файлов из папки lore/
14
+ def load_all_lore_files():
15
+ docs = []
16
+ for filename in os.listdir("lore"):
17
+ if filename.endswith(".txt"):
18
+ loader = TextLoader(os.path.join("lore", filename), encoding="utf-8")
19
+ docs.extend(loader.load())
20
+ return docs
21
 
22
+ # 2. Очистка от спецсимволов
23
+ def clean_text(text):
24
+ return re.sub(r"\[=.*?\/?]", "", text)
25
+
26
+ # 3. Настройка эмбеддингов
27
  def create_embeddings():
28
+ return HuggingFaceEmbeddings(
29
+ model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
30
+ )
31
 
32
+ # 4. Создание векторной базы
33
+ def create_vectorstore(docs, embeddings):
34
+ text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
35
+ split_docs = text_splitter.split_documents(docs)
36
+ for doc in split_docs:
37
+ doc.page_content = clean_text(doc.page_content)
38
+ return FAISS.from_documents(split_docs, embeddings)
39
 
40
+ # 5. Загрузка модели ответа (с проверкой доступности GPU)
41
  def create_llm_pipeline():
42
  return pipeline(
43
  "text-generation",
44
  model="IlyaGusev/saiga2_7b_lora",
45
+ torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
46
+ device="cuda:0" if torch.cuda.is_available() else "cpu"
 
 
 
 
47
  )
48
 
49
+ # 6. Объединение в цепочку
 
 
 
 
 
50
  def build_chain():
51
+ docs = load_all_lore_files()
52
+ embeddings = create_embeddings()
53
+ vectorstore = create_vectorstore(docs, embeddings)
54
+
55
+ retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 3})
56
+
57
+ prompt = PromptTemplate(
58
+ template="""
59
+ Ты — помощник, который отвечает на вопросы по вымышленному лору. Отвечай кратко, точно и на русском языке.
60
+ Если в лоре нет нужной информации, честно скажи, что не знаешь.
61
+
62
+ Контекст:
63
+ {context}
64
+
65
+ Вопрос:
66
+ {question}
67
+
68
+ Ответ:
69
+ """,
70
+ input_variables=["context", "question"]
71
+ )
72
+
73
  return RetrievalQA.from_chain_type(
74
+ llm=create_llm_pipeline(),
75
  retriever=retriever,
76
+ chain_type_kwargs={"prompt": prompt}
77
  )
78
 
79
+ # 7. Интерфейс
80
  qa_chain = build_chain()
81
 
82
+ def ask_question(question):
83
+ return qa_chain.run(question)
84
+
85
+ gr.Interface(
86
+ fn=ask_question,
87
+ inputs=gr.Textbox(label="Спроси что-нибудь по лору"),
88
+ outputs=gr.Textbox(label="Ответ"),
89
+ title="Лор-бот"
90
+ ).launch()