forked from Professional-Cipher/ZeetFlask
-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
117 lines (87 loc) · 3.53 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
from flask import Flask, jsonify, request
import requests
from bs4 import BeautifulSoup
from flask_cors import CORS
# from flask_ngrok import run_with_ngrok
import pickle
import faiss
from langchain.vectorstores import FAISS
import os
# InstructorEmbedding
from InstructorEmbedding import INSTRUCTOR
from langchain.embeddings import HuggingFaceInstructEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# from pyngrok import ngrok
# Set your ngrok authtoken here
# ngrok.set_auth_token("2UdEoJp3eYipl5jphZzH0bwS3lJ_5RPAeCVfBmfCTjxVKHgBk")
app = Flask(__name__)
CORS(app)
@app.route("/", methods=["GET"])
def home():
return "Hello, world!"
embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-xl",
model_kwargs={"device": "cuda"})
db_instructEmbedd = FAISS.load_local("faiss_index", embeddings)
@app.route("/qa", methods=["POST"])
def qa():
query = request.json["query"]
# Load the embeddings
# embeddings_path = os.path.join(os.getcwd(), "index.pkl")
# with open(embeddings_path, "rb") as f:
# embeddings = pickle.load(f)
# embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-xl",
# model_kwargs={"device": "cuda"})
# db_instructEmbedd = FAISS.load_local("faiss_index", embeddings)
retriever = db_instructEmbedd.as_retriever(search_kwargs={"k": 3})
retriever.search_type
retriever.search_kwargs
docs = retriever.get_relevant_documents("tell me am I infertility. How can I check it ")
print(docs[0],docs[1],docs[2])
print(len(docs[0].page_content),len(docs[1].page_content),len(docs[2].page_content))
# create the chain to answer questions
import os
from langchain.chains import RetrievalQA
os.environ["OPENAI_API_KEY"] = process.env.OPENAI_API_KEY
qa_chain_instrucEmbed = RetrievalQA.from_chain_type(llm=OpenAI(temperature=0, ),
chain_type="stuff",
retriever=retriever,
return_source_documents=True)
## Cite sources
import textwrap
def wrap_text_preserve_newlines(text, width=110):
# Split the input text into lines based on newline characters
lines = text.split('\n')
# Wrap each line individually
wrapped_lines = [textwrap.fill(line, width=width) for line in lines]
# Join the wrapped lines back together using newline characters
wrapped_text = '\n'.join(wrapped_lines)
return wrapped_text
def process_llm_response(llm_response):
text=wrap_text_preserve_newlines(llm_response['result'])
print(text)
print('\nSources:')
sources=[]
for source in llm_response["source_documents"]:
sources.append(source.metadata['source'])
print(sources)
result =text + '\nSources:' + '\n'.join(sources)
# texts = result.split('\n')
# {% for para in texts %}
# <p>{{para}}</p>
# {% endfor %}
# text = texts.replace('\n', '<br>')
# {% autoescape false %}
# {{text}}
# {% endautoescape %}
print("result",result)
return text
query = query
print('-------------------Instructor Embeddings------------------\n')
llm_response = qa_chain_instrucEmbed(query)
result=process_llm_response(llm_response)
print("result",result)
return jsonify(result)
if __name__ == "__main__":
run_with_ngrok(app)
app.run()