miniondenis commited on
Commit
e9947ad
1 Parent(s): e18d430

chore: restore lfs

Browse files
Files changed (7) hide show
  1. .env.example +3 -3
  2. .gitattributes +1 -2
  3. .gitignore +3 -3
  4. README.md +10 -3
  5. app.py +124 -3
  6. lib/embedding.py +10 -3
  7. lib/model_builder.py +12 -3
.env.example CHANGED
@@ -1,3 +1,3 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:707641c7ac139d1f0f8db0320a2368bea63b3d5ebd9d37c7a596ba092ebc2c7f
3
- size 79
 
1
+ VSEGPT_KEY=sk-
2
+ LLM_NAME=meta-llama/codellama-34b-instruct
3
+ OPENAI_BASE=https://
.gitattributes CHANGED
@@ -33,5 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
- .faiss filter=lfs diff=lfs merge=lfs -text
37
- *.txt filter=lfs diff=lfs merge=lfs -text
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.faiss filter=lfs diff=lfs merge=lfs -text
 
.gitignore CHANGED
@@ -1,3 +1,3 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:86b96044c2a4df69cbca929901ba6e653b179ea3a750d5b0733444417bd0ae92
3
- size 26
 
1
+ venv/
2
+ **/__pycache__/
3
+ .env
README.md CHANGED
@@ -1,3 +1,10 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:0a8c466b1ccb220e7443f02771a3404069c51c69c89e33503dbc1f78b0a7ef40
3
- size 129
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Doc Eater
3
+ emoji: 🚀
4
+ colorFrom: red
5
+ colorTo: green
6
+ sdk: gradio
7
+ sdk_version: 4.29.0
8
+ app_file: app.py
9
+ pinned: false
10
+ ---
app.py CHANGED
@@ -1,3 +1,124 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:55ec3fd8747ee304421c487bfdea048b7d1b7765ee788663c4292e9b96082ded
3
- size 4758
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+
3
+ from langchain_core.prompts import ChatPromptTemplate
4
+ from langchain_community.vectorstores import Clickhouse, ClickhouseSettings
5
+ from langchain_community.vectorstores import FAISS
6
+ from langchain_core.runnables import (
7
+ RunnableLambda,
8
+ RunnableParallel,
9
+ RunnablePassthrough,
10
+ )
11
+ from langchain_core.output_parsers import StrOutputParser
12
+ import warnings
13
+
14
+ from lib.embedding import build_embedding
15
+ from lib.model_builder import ModelBuilder
16
+ warnings.filterwarnings('ignore')
17
+ from dotenv import load_dotenv
18
+
19
+ load_dotenv()
20
+
21
+ def combine_vectors(vectors):
22
+ result = []
23
+ vec1_count = len(vectors["vector1"])
24
+ # vec2_count = len(vectors["vector2"])
25
+ for i in range(vec1_count):
26
+ if i < vec1_count:
27
+ result.append(vectors['vector1'][i])
28
+ # if i < vec2_count:
29
+ # result.append(vectors['vector2'][i])
30
+ return result
31
+
32
+
33
+ def deploy():
34
+ llm = ModelBuilder.createVseGptModel("openchat/openchat-7b", 0)
35
+ model_rag = ModelBuilder.createVseGptModel("cohere/command-r", 0)
36
+
37
+ # embedding = build_embedding(model_name="sentence-transformers/LaBSE")
38
+ rag_emb = build_embedding("intfloat/multilingual-e5-large")
39
+
40
+ # settings_13_04 = ClickhouseSettings(table="car_table_13_04")
41
+ # clickhouse = Clickhouse(embedding, config=settings_13_04)
42
+ faiss_db = FAISS.load_local("./data/faiss_nk_17_05", rag_emb, allow_dangerous_deserialization=True)
43
+ # clickh_retriever = clickhouse.as_retriever()
44
+ faiss_retriever = faiss_db.as_retriever()
45
+
46
+ retrievers = RunnableParallel(
47
+ vector1=faiss_retriever,
48
+ # vector2=clickh_retriever
49
+ )
50
+
51
+ chain_multivec = RunnableParallel({
52
+ "original": RunnablePassthrough(),
53
+ "context": retrievers | RunnableLambda(combine_vectors)
54
+ })
55
+
56
+ template = """Answer the question in Russian based only on the following context:
57
+ {context}
58
+
59
+ Question: {original}
60
+ """
61
+ prompt = ChatPromptTemplate.from_template(template)
62
+ output_parser = StrOutputParser()
63
+
64
+ chain_answer = prompt | model_rag | output_parser
65
+ rag_chain = chain_multivec | RunnableParallel({
66
+ "original": RunnableLambda(lambda ctx: ctx['original']),
67
+ "sources": RunnableLambda(lambda ctx: ctx['context']),
68
+ "answer": chain_answer
69
+ })
70
+
71
+
72
+
73
+ def print_source_documents(documents):
74
+ return "\n\n".join([f"Взято из файла: {doc.metadata['file_name']} \n Metadata: {doc.metadata}" for doc in documents])
75
+
76
+ with gr.Blocks(fill_height=True) as demo:
77
+ with gr.Row():
78
+ with gr.Column(scale=1):
79
+ chatbot_rag = gr.Chatbot(label="RAG: cohere/command-r + документы", height=600)
80
+ with gr.Column(scale=1):
81
+ chatbot_llm = gr.Chatbot(label="LLM standalone: openchat/openchat-7b", height=600)
82
+ chat_input = gr.MultimodalTextbox(interactive=True, file_types=None, placeholder="Введите сообщение...", show_label=False)
83
+ clear = gr.Button("Clear")
84
+
85
+ def user_rag(history, message):
86
+ if message["text"] is not None:
87
+ history.append((message["text"], None))
88
+ return history, gr.MultimodalTextbox(value=None, interactive=False)
89
+
90
+ def user_llm(history, message):
91
+ if message["text"] is not None:
92
+ history.append((message["text"], None))
93
+ return history, gr.MultimodalTextbox(value=None, interactive=False)
94
+
95
+ def bot_rag(history):
96
+ result = rag_chain.invoke(history[-1][0])
97
+ form_answer = result["answer"].strip()
98
+ history[-1][1] = form_answer
99
+ return history
100
+
101
+ def bot_llm(history):
102
+ result = llm.invoke(history[-1][0])
103
+ history[-1][1] = result.content.strip()
104
+ return history
105
+
106
+ chat_input.submit(user_rag, [chatbot_rag, chat_input], [chatbot_rag, chat_input], queue=False).then(
107
+ bot_rag, chatbot_rag, chatbot_rag
108
+ ).then(lambda: gr.MultimodalTextbox(interactive=True), None, [chat_input])
109
+
110
+ chat_input.submit(user_llm, [chatbot_llm, chat_input], [chatbot_llm, chat_input], queue=False).then(
111
+ bot_llm, chatbot_llm, chatbot_llm
112
+ ).then(lambda: gr.MultimodalTextbox(interactive=True), None, [chat_input])
113
+ clear.click(lambda: None, None, chatbot_rag, queue=False)
114
+ clear.click(lambda: None, None, chatbot_llm, queue=False)
115
+
116
+ demo.launch(share=True)
117
+
118
+
119
+ if __name__ == "__main__":
120
+ # parser = argparse.ArgumentParser(description='Deploy llm chat')
121
+ # parser.add_argument('--model_name', metavar='M', type=str,
122
+ # help='model name as: openai/gpt-3.5-turbo')
123
+
124
+ deploy()
lib/embedding.py CHANGED
@@ -1,3 +1,10 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:bbed70158a33431a0205b7bd969f652da3f3364a112b4b63f0322d75114d5e88
3
- size 429
 
 
 
 
 
 
 
 
1
+ from langchain_community.embeddings import HuggingFaceEmbeddings
2
+ from dotenv import load_dotenv
3
+
4
+ load_dotenv()
5
+ def build_embedding(model_name: str):
6
+ embedding = HuggingFaceEmbeddings(model_name=model_name, \
7
+ # model_kwargs={"device": "cuda"}, \
8
+ encode_kwargs={"normalize_embeddings": True})
9
+ embedding.show_progress = True
10
+ return embedding
lib/model_builder.py CHANGED
@@ -1,3 +1,12 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:11209717c09df9cbe99f6ffacc57daaab69f99cebb39738e7326fcff865c42f5
3
- size 380
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from langchain_openai import ChatOpenAI
3
+ from dotenv import load_dotenv
4
+
5
+ load_dotenv()
6
+ VSEGPT_KEY = os.getenv('VSEGPT_KEY')
7
+ OPENAI_BASE = os.getenv('OPENAI_BASE')
8
+
9
+ class ModelBuilder:
10
+ def createVseGptModel(model, temperature):
11
+ return ChatOpenAI(temperature=temperature, model_name=model, \
12
+ api_key=VSEGPT_KEY, base_url = OPENAI_BASE)