nitinacap commited on
Commit
e385a9a
1 Parent(s): 268ebd5

Upload 4 files

Browse files
Files changed (4) hide show
  1. Dockerfile +25 -0
  2. app.py +32 -0
  3. module_q.py +88 -0
  4. requirements.txt +6 -0
Dockerfile ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # For more information, please refer to https://aka.ms/vscode-docker-python
2
+ FROM python:3.10-slim
3
+
4
+ EXPOSE 8000
5
+
6
+ # Keeps Python from generating .pyc files in the container
7
+ ENV PYTHONDONTWRITEBYTECODE=1
8
+
9
+ # Turns off buffering for easier container logging
10
+ ENV PYTHONUNBUFFERED=1
11
+
12
+ # Install pip requirements
13
+ COPY requirements.txt .
14
+ RUN python -m pip install -r requirements.txt
15
+
16
+ WORKDIR /app
17
+ COPY . /app
18
+
19
+ # Creates a non-root user with an explicit UID and adds permission to access the /app folder
20
+ # For more info, please refer to https://aka.ms/vscode-docker-python-configure-containers
21
+ RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
22
+ USER appuser
23
+
24
+ # During debugging, this entry point will be overridden. For more information, please refer to https://aka.ms/vscode-docker-python-debug
25
+ CMD ["gunicorn", "--bind", "0.0.0.0:8000", "-k", "uvicorn.workers.UvicornWorker", "app:app"]
app.py ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import json
3
+ import module_q
4
+ import datetime
5
+ from fastapi import FastAPI
6
+ from typing import Union
7
+ from fastapi.responses import FileResponse
8
+ from fastapi import APIRouter
9
+
10
+
11
+ app = FastAPI()
12
+ favicon_path = 'favicon.ico'
13
+
14
+
15
+
16
+ @app.get("/")
17
+ def read_root():
18
+ return {"query": "/query/your_query"}
19
+
20
+
21
+ @app.get("/query/{ask}")
22
+ def read_query( ask: Union[str, None]):
23
+ now = datetime.datetime.now()
24
+ print("Request time :",now)
25
+ res=module_q.search_query_data(ask)
26
+ now = datetime.datetime.now()
27
+ print("Response time :",now)
28
+ print("res :",res)
29
+ return res
30
+
31
+
32
+
module_q.py ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pathlib import Path
2
+ from typing import List, Tuple
3
+ from langchain import PromptTemplate, LLMChain
4
+ from langchain.document_loaders import TextLoader
5
+ from langchain.embeddings import LlamaCppEmbeddings
6
+ from langchain.llms import GPT4All
7
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
8
+ from langchain.vectorstores.faiss import FAISS
9
+ from pydantic import BaseModel, Field
10
+ from langchain.chains import ConversationalRetrievalChain
11
+ from langchain.embeddings import HuggingFaceEmbeddings
12
+ from langchain.llms import LlamaCpp
13
+ import os.path
14
+
15
+
16
+ import langchain
17
+ from langchain.cache import InMemoryCache
18
+ langchain.llm_cache = InMemoryCache()
19
+
20
+ # Constants
21
+ local_path = "./models/gpt4all-converted.bin" #GPT4 module 1
22
+ #local_path = "./models/ggml-gpt4all-l13b-snoozy.bin"
23
+
24
+
25
+ model_path = "./models/ggml-model-q4_0.bin" #1st Embeddings
26
+ #model_path = './models/ggjt-model.bin' #2st Embedding
27
+ text_path = "./docs/acapglobal.txt"
28
+ index_path = "./acapglobal_index"
29
+
30
+
31
+ # Functions
32
+ def initialize_embeddings() -> LlamaCppEmbeddings:
33
+ return LlamaCppEmbeddings(model_path=model_path)
34
+
35
+ def load_documents() -> List:
36
+ loader = TextLoader(text_path,encoding="utf-8")
37
+ return loader.load()
38
+
39
+ def split_chunks(sources: List) -> List:
40
+ chunks = []
41
+ splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=32)
42
+ for chunk in splitter.split_documents(sources):
43
+ chunks.append(chunk)
44
+ return chunks
45
+
46
+ def generate_index(chunks: List, embeddings: LlamaCppEmbeddings) -> FAISS:
47
+ texts = [doc.page_content for doc in chunks]
48
+ metadatas = [doc.metadata for doc in chunks]
49
+ return FAISS.from_texts(texts, embeddings, metadatas=metadatas)
50
+
51
+
52
+ # Main execution
53
+ llm = GPT4All(model=local_path, n_ctx=512, verbose=True,cache=True,embedding=True)
54
+ print('llm GPT4All set.')
55
+ embeddings = initialize_embeddings()
56
+
57
+
58
+ # when refresh document
59
+ #
60
+
61
+ # print('initialize_embeddings.')
62
+ # sources = load_documents()
63
+ # print('load_documents.')
64
+ # chunks = split_chunks(sources)
65
+ # print('split_chunks')
66
+ # vectorstore = generate_index(chunks, embeddings)
67
+ # print('generate_index')
68
+ # vectorstore.save_local("acapglobal_index")
69
+ # print('vectorstore: save_local')
70
+
71
+ #
72
+ # End When refresh document
73
+
74
+
75
+ chat_history = []
76
+ #index = FAISS.load_local(index_path, embeddings)
77
+ index = FAISS.load_local(index_path, embeddings)
78
+
79
+ qa = ConversationalRetrievalChain.from_llm(llm, index.as_retriever(), max_tokens_limit=400)
80
+
81
+ def search_query_data(s_query):
82
+ print("search_query:")
83
+ print( s_query)
84
+ retrieval=qa({"question": s_query, "chat_history": chat_history})
85
+ return retrieval
86
+
87
+
88
+
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ fastapi==0.74.*
2
+ requests==2.27.*
3
+ uvicorn[standard]==0.17.*
4
+ sentencepiece==0.1.*
5
+ torch==1.11.*
6
+ transformers==4.*