Hung Bui zhtet commited on
Commit
e18671c
·
0 Parent(s):

Duplicate from zhtet/RegBotBeta

Browse files

Co-authored-by: zwea htet <zhtet@users.noreply.huggingface.co>

Files changed (10) hide show
  1. .gitattributes +34 -0
  2. .gitignore +7 -0
  3. Dockerfile +35 -0
  4. README.md +13 -0
  5. app.py +87 -0
  6. assets/regItems.json +0 -0
  7. models/bloom.py +107 -0
  8. requirements.txt +12 -0
  9. utils/customLLM.py +38 -0
  10. utils/util.py +27 -0
.gitattributes ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tflite filter=lfs diff=lfs merge=lfs -text
29
+ *.tgz filter=lfs diff=lfs merge=lfs -text
30
+ *.wasm filter=lfs diff=lfs merge=lfs -text
31
+ *.xz filter=lfs diff=lfs merge=lfs -text
32
+ *.zip filter=lfs diff=lfs merge=lfs -text
33
+ *.zst filter=lfs diff=lfs merge=lfs -text
34
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ venv
2
+ data/__pycache__
3
+ models/__pycache__
4
+ .env
5
+ __pycache__
6
+ vectorStores
7
+ .vscode
Dockerfile ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.9
2
+
3
+ WORKDIR /docker
4
+
5
+ ADD . /docker
6
+
7
+ COPY requirements.txt requirements.txt
8
+ RUN pip install --upgrade pip
9
+ RUN pip install --no-cache-dir -r requirements.txt
10
+
11
+ COPY . .
12
+
13
+ # Set up a new user named "user" with user ID 1000
14
+ RUN useradd -m -u 1000 user
15
+
16
+ # Switch to the "user" user
17
+ USER user
18
+
19
+ # Set home to the user's home directory
20
+ ENV HOME=/home/user \
21
+ PATH=/home/user/.local/bin:$PATH
22
+
23
+ # Set the working directory to the user's home directory
24
+ WORKDIR $HOME/app
25
+
26
+ # Set the working directory to the user's home directory
27
+ COPY --chown=user . $HOME/app
28
+
29
+ EXPOSE 8501
30
+
31
+ HEALTHCHECK CMD --fail http://localhost:8501/_stcore/health
32
+
33
+ ENTRYPOINT ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
34
+ # CMD [ "streamlit" , "run", "app.py"]
35
+ # CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: RegBotBeta
3
+ emoji: 😻
4
+ colorFrom: green
5
+ colorTo: red
6
+ sdk: docker
7
+ app_file: app.py
8
+ app_port: 8501
9
+ pinned: false
10
+ duplicated_from: zhtet/RegBotBeta
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # https://docs.streamlit.io/knowledge-base/tutorials/build-conversational-apps
2
+
3
+ import os
4
+ import time
5
+
6
+ import openai
7
+ import requests
8
+ import streamlit as st
9
+
10
+ from models import bloom
11
+ from utils.util import *
12
+
13
+ # from streamlit_chat import message
14
+
15
+
16
+ st.title("Welcome to RegBotBeta")
17
+ st.header("Powered by `LlamaIndex🦙` and `OpenAI API`")
18
+
19
+ if "messages" not in st.session_state:
20
+ st.session_state.messages = []
21
+
22
+ index = None
23
+
24
+ api_key = st.text_input("Enter your OpenAI API key here:", type="password")
25
+
26
+ if api_key:
27
+ resp = validate(api_key)
28
+ if "error" in resp.json():
29
+ st.info("Invalid Token! Try again.")
30
+ else:
31
+ st.info("Success")
32
+ os.environ["OPENAI_API_KEY"] = api_key
33
+ openai.api_key = api_key
34
+ with st.spinner("Initializing vector index ..."):
35
+ index = create_index(bloom)
36
+
37
+ st.write("---")
38
+ if index:
39
+ # Display chat messages from history on app rerun
40
+ for message in st.session_state.messages:
41
+ with st.chat_message(message["role"]):
42
+ st.markdown(message["content"])
43
+
44
+ if prompt := st.chat_input("Say something"):
45
+ # Display user message in chat message container
46
+ st.chat_message("user").markdown(prompt)
47
+
48
+ # Add user message to chat history
49
+ st.session_state.messages.append({"role": "user", "content": prompt})
50
+
51
+ with st.spinner("Processing your query..."):
52
+ bot_response = get_response(index, prompt)
53
+
54
+ print("bot: ", bot_response)
55
+
56
+ # Display assistant response in chat message container
57
+ with st.chat_message("assistant"):
58
+ message_placeholder = st.empty()
59
+ full_response = ""
60
+
61
+ # simulate the chatbot "thinking" before responding
62
+ # (or stream its response)
63
+ for chunk in bot_response.split():
64
+ full_response += chunk + " "
65
+ time.sleep(0.05)
66
+
67
+ # add a blinking cursor to simulate typing
68
+ message_placeholder.markdown(full_response + "▌")
69
+
70
+ message_placeholder.markdown(full_response)
71
+ # st.markdown(response)
72
+
73
+ # Add assistant response to chat history
74
+ st.session_state.messages.append(
75
+ {"role": "assistant", "content": full_response}
76
+ )
77
+
78
+ # Scroll to the bottom of the chat container
79
+ # st.markdown(
80
+ # """
81
+ # <script>
82
+ # const chatContainer = document.getElementsByClassName("css-1n76uvr")[0];
83
+ # chatContainer.scrollTop = chatContainer.scrollHeight;
84
+ # </script>
85
+ # """,
86
+ # unsafe_allow_html=True,
87
+ # )
assets/regItems.json ADDED
The diff for this file is too large to render. See raw diff
 
models/bloom.py ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pickle
3
+ from json import dumps, loads
4
+
5
+ import numpy as np
6
+ import openai
7
+ import pandas as pd
8
+ from dotenv import load_dotenv
9
+ from huggingface_hub import HfFileSystem
10
+ from llama_index import (
11
+ Document,
12
+ GPTVectorStoreIndex,
13
+ LLMPredictor,
14
+ PromptHelper,
15
+ ServiceContext,
16
+ StorageContext,
17
+ load_index_from_storage,
18
+ )
19
+ from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
20
+
21
+ from utils.customLLM import CustomLLM
22
+
23
+ load_dotenv()
24
+ openai.api_key = os.getenv("OPENAI_API_KEY")
25
+ fs = HfFileSystem()
26
+
27
+ # get model
28
+ # model_name = "bigscience/bloom-560m"
29
+ # tokenizer = AutoTokenizer.from_pretrained(model_name)
30
+ # model = AutoModelForCausalLM.from_pretrained(model_name, config='T5Config')
31
+
32
+ # define prompt helper
33
+ # set maximum input size
34
+ context_window = 2048
35
+ # set number of output tokens
36
+ num_output = 525
37
+ # set maximum chunk overlap
38
+ chunk_overlap_ratio = 0.2
39
+ prompt_helper = PromptHelper(context_window, num_output, chunk_overlap_ratio)
40
+
41
+ # create a pipeline
42
+ # pl = pipeline(
43
+ # model=model,
44
+ # tokenizer=tokenizer,
45
+ # task="text-generation",
46
+ # # device=0, # GPU device number
47
+ # # max_length=512,
48
+ # do_sample=True,
49
+ # top_p=0.95,
50
+ # top_k=50,
51
+ # temperature=0.7
52
+ # )
53
+
54
+ # define llm
55
+ llm_predictor = LLMPredictor(llm=CustomLLM())
56
+ service_context = ServiceContext.from_defaults(
57
+ llm_predictor=llm_predictor, prompt_helper=prompt_helper
58
+ )
59
+
60
+
61
+ def prepare_data(file_path: str):
62
+ df = pd.read_json(file_path)
63
+ df = df.replace(to_replace="", value=np.nan).dropna(axis=0) # remove null values
64
+
65
+ parsed = loads(df.to_json(orient="records"))
66
+
67
+ documents = []
68
+ for item in parsed:
69
+ document = Document(
70
+ text=item["paragraphText"],
71
+ doc_id=item["_id"]["$oid"],
72
+ extra_info={
73
+ "chapter": item["chapter"],
74
+ "article": item["article"],
75
+ "title": item["title"],
76
+ },
77
+ )
78
+ documents.append(document)
79
+
80
+ return documents
81
+
82
+
83
+ def initialize_index(index_name):
84
+ file_path = f"./vectorStores/{index_name}"
85
+ if os.path.exists(file_path):
86
+ # rebuild storage context
87
+ storage_context = StorageContext.from_defaults(persist_dir=file_path)
88
+
89
+ # local load index access
90
+ index = load_index_from_storage(storage_context)
91
+
92
+ # huggingface repo load access
93
+ # with fs.open(file_path, "r") as file:
94
+ # index = pickle.loads(file.readlines())
95
+ return index
96
+ else:
97
+ documents = prepare_data(r"./assets/regItems.json")
98
+ index = GPTVectorStoreIndex.from_documents(
99
+ documents, service_context=service_context
100
+ )
101
+ # local write access
102
+ index.storage_context.persist(file_path)
103
+
104
+ # huggingface repo write access
105
+ # with fs.open(file_path, "w") as file:
106
+ # file.write(pickle.dumps(index))
107
+ return index
requirements.txt ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ llama_index
2
+ torch
3
+ transformers
4
+ panda
5
+ numpy
6
+ langchain
7
+ openai
8
+ faiss-cpu
9
+ python-dotenv
10
+ streamlit>=1.24.0
11
+ huggingface_hub
12
+ xformers
utils/customLLM.py ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Any, List, Mapping, Optional
2
+
3
+ from langchain.llms.base import LLM
4
+ from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
5
+
6
+ model_name = "bigscience/bloom-560m"
7
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
8
+ model = AutoModelForCausalLM.from_pretrained(model_name, config='T5Config')
9
+
10
+ pl = pipeline(
11
+ model=model,
12
+ tokenizer=tokenizer,
13
+ task="text-generation",
14
+ # device=0, # GPU device number
15
+ # max_length=512,
16
+ do_sample=True,
17
+ top_p=0.95,
18
+ top_k=50,
19
+ temperature=0.7
20
+ )
21
+
22
+ class CustomLLM(LLM):
23
+ pipeline = pl
24
+
25
+ def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
26
+ prompt_length = len(prompt)
27
+ response = self.pipeline(prompt, max_new_tokens=525)[0]["generated_text"]
28
+
29
+ # only return newly generated tokens
30
+ return response[prompt_length:]
31
+
32
+ @property
33
+ def _identifying_params(self) -> Mapping[str, Any]:
34
+ return {"name_of_model": self.model_name}
35
+
36
+ @property
37
+ def _llm_type(self) -> str:
38
+ return "custom"
utils/util.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+
3
+
4
+ def validate(token: str):
5
+ api_endpoint = "https://api.openai.com/v1/chat/completions"
6
+ api_key = token
7
+
8
+ headers = {"Content-Type": "application/json", "Authorization": f"Bearer {api_key}"}
9
+
10
+ messages = [{"role": "user", "content": "Say this is a test!"}]
11
+
12
+ data = {"model": "gpt-3.5-turbo", "messages": messages}
13
+
14
+ response = requests.post(api_endpoint, json=data, headers=headers)
15
+ return response
16
+
17
+
18
+ def create_index(model):
19
+ index = model.initialize_index("bloomLlama")
20
+ return index
21
+
22
+
23
+ def get_response(vector_index, query_str):
24
+ print("query_str: ", query_str)
25
+ query_engine = vector_index.as_query_engine()
26
+ response = query_engine.query(query_str)
27
+ return str(response)