123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- import langchain
- from langchain.document_loaders import PyPDFLoader, DirectoryLoader
- from langchain.prompts import PromptTemplate
- from langchain.embeddings import HuggingFaceEmbeddings
- from langchain.vectorstores import FAISS
- from langchain.llms import CTransformers
- from langchain.chains import RetrievalQA
- from flask import Flask, request, render_template
- from datetime import datetime
- from flask import Flask, render_template, request, jsonify, session
-
-
- app = Flask(__name__)
-
-
- @app.route('/')
- def home():
-
- return render_template('index.html')
-
-
-
- DB_FAISS_PATH = 'vectorstore/db_faiss'
-
- custom_prompt_template = """Given the following context and a question, generate an answer based on this context only.
- In the answer try to provide as much text as possible from "response" section in the source document context without making much changes.
- If the answer is not found in the context, kindly state "I don't know." Don't try to make up an answer.
-
- CONTEXT: {context}
-
- QUESTION: {question}
-
-
- """
-
- def set_custom_prompt():
- """
- Prompt template for QA retrieval for each vectorstore
- """
- prompt = PromptTemplate(template=custom_prompt_template,
- input_variables=['context', 'question'])
- return prompt
-
- #Retrieval QA Chain
- def retrieval_qa_chain(llm, prompt, db):
- qa_chain = RetrievalQA.from_chain_type(llm=llm,
- chain_type='stuff',
- retriever=db.as_retriever(search_kwargs={'k': 2}),
- return_source_documents=True,
- chain_type_kwargs={'prompt': prompt}
- )
- return qa_chain
-
- #Loading the model
- def load_llm():
- # Load the locally downloaded model here
- # llm = CTransformers(
- # model = r"C:\Aiproject\Llama-2-7B-Chat-GGML\Llama-2-7B-Chat-GGML\llama-30b.ggmlv3.q8_0.bin",
- # model_type="llama",
- # max_new_tokens = 512,
- # temperature = 0.5
- # )
- llm = CTransformers(model=r"TheBloke/Mistral-7B-Instruct-v0.1-GGUF",gpu_layers=100,config={'max_new_tokens': 128, 'temperature': 0.01})
- return llm
-
- #QA Model Function
- def qa_bot():
- embeddings = HuggingFaceEmbeddings(model_name=r"sentence-transformers/all-MiniLM-L6-v2",
- model_kwargs={'device': 'cpu'})
- db = FAISS.load_local(DB_FAISS_PATH, embeddings)
- llm = load_llm()
- qa_prompt = set_custom_prompt()
- qa = retrieval_qa_chain(llm, qa_prompt, db)
-
- return qa
-
- #output function
- def final_result(query):
- qa_result = qa_bot()
- response = qa_result({'query': query})
- return response
-
- # Streamlit application
- # st.title("Medical Bot")
-
- # if "query" not in st.session_state:
- # st.text("Hi, Welcome to Medical Bot. What is your query?")
- # query = st.text_input("Enter your question")
- # st.button("Ask")
-
- # if query:
- # st.text("Searching for relevant documents...")
- # response = final_result(query)
- # st.text(f"Sources: {response['source_documents']}")
- # st.text(f"Answer: {response['result']}")
- # else:
- # st.text("No query")
-
-
-
-
- @app.route('/user_input', methods=['GET', 'POST'])
- def index():
- if request.method == 'POST':
- query = request.form.get('user_input')
- session_id= request.form.get('session_id')
- #query = request.form['query']
- start=datetime.now()
- frmtstart=start.strftime('%Y-%m-%d %H:%M:%S')
- print('started',frmtstart)
- user_input=query.lower()
- print(user_input)
- if query:
- #result = chain(question)['result']
- response = final_result(user_input)
- result=response['result']
- print(result)
- end=datetime.now()
- endtime=end.strftime('%Y-%m-%d %H:%M:%S')
- print('Ended',endtime)
-
-
- else:
- result = None
- #return render_template('index.html', output=result)
- return jsonify({'output': result})
- return render_template('index.html', result=None)
-
-
-
- if __name__ == '__main__':
- app.run(host="0.0.0.0",port=8000,debug=False)
|