Loversofdeath commited on
Commit
ab35c47
·
verified ·
1 Parent(s): b99265e

Update app.py

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