from dotenv import load_dotenv from langchain_openai import AzureChatOpenAI import os load_dotenv() import streamlit as st import pandas as pd from langchain_community.document_loaders import JSONLoader import requests from langchain_openai import OpenAIEmbeddings from langchain.vectorstores import FAISS from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate from langchain.memory import ConversationSummaryMemory llm = AzureChatOpenAI(openai_api_version=os.environ.get("AZURE_OPENAI_VERSION", "2023-07-01-preview"), azure_deployment=os.environ.get("AZURE_OPENAI_DEPLOYMENT", "gpt4chat"), azure_endpoint=os.environ.get("AZURE_OPENAI_ENDPOINT", "https://gpt-4-trails.openai.azure.com/"), api_key=os.environ.get("AZURE_OPENAI_KEY")) def metadata_func(record: str, metadata: dict) -> dict: lines = record.split('\n') locality_line = lines[10] price_range_line = lines[12] locality = locality_line.split(': ')[1] price_range = price_range_line.split(': ')[1] metadata["location"] = locality metadata["price_range"] = price_range return metadata # Instantiate the JSONLoader with the metadata_func jq_schema = '.parser[] | to_entries | map("\(.key): \(.value)") | join("\n")' loader = JSONLoader( jq_schema=jq_schema, file_path='data.json', metadata_func=metadata_func, ) # Load the JSON file and extract metadata documents = loader.load() def get_vectorstore(text_chunks): embeddings = OpenAIEmbeddings() # Check if the FAISS index file already exists if os.path.exists("faiss_index"): # Load the existing FAISS index vectorstore = FAISS.load_local("faiss_index", embeddings=embeddings) print("Loaded existing FAISS index.") else: # Create a new FAISS index embeddings = OpenAIEmbeddings() vectorstore = FAISS.from_documents(documents=text_chunks, embedding=embeddings) # Save the new FAISS index locally vectorstore.save_local("faiss_index") print("Created and saved new FAISS index.") return vectorstore #docs = new_db.similarity_search(query) vector = get_vectorstore(documents) def api_call(text): url = "https://api-ares.traversaal.ai/live/predict" payload = { "query": [text]} headers = { "x-api-key": "ares_a0866ad7d71d2e895c5e05dce656704a9e29ad37860912ad6a45a4e3e6c399b5", "content-type": "application/json" } response = requests.post(url, json=payload, headers=headers) # here we will use the llm to summarize the response received from the ares api response_data = response.json() #print(response_data) try: response_text = response_data['data']['response_text'] web_urls = response_data['data']['web_url'] # Continue processing the data... except KeyError: print("Error: Unexpected response from the API. Please try again or contact the api owner.") # Optionally, you can log the error or perform other error handling actions. if len(response_text) > 10000: response_text = response_text[:8000] prompt = f"Summarize the following text in 500-100 0 words and jsut summarize what you see and do not add anythhing else: {response_text}" summary = llm.invoke(prompt) print(summary) else: summary = response_text result = "{} My list is: {}".format(response_text, web_urls) # Convert the result to a string result_str = str(result) return result_str template = """ context:- I have low budget what is the best hotel in Instanbul? anser:- The other hotels in instanbul are costly and are not in your budget. so the best hotel in instanbul for you is hotel is xyz." Don’t give information not mentioned in the CONTEXT INFORMATION. The system should take into account various factors such as location, amenities, user reviews, and other relevant criteria to generate informative and personalized explanations. {context} Question: {question} Answer:""" prompt = PromptTemplate(template=template, input_variables=["context","question"]) chain_type_kwargs = {"prompt": prompt} chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=vector.as_retriever(), chain_type_kwargs=chain_type_kwargs, ) prompt = """Please write the response to the user query: using the final_response and api_resource and make sure you are The system should take into account various factors such as location, amenities, user reviews, and other relevant criteria to generate informative and personalized explanations. Do not add any information that is not mentioned in the context. and make sure the answer is up to the point and not too long. """ def main(): st.title("Travel Assistant Chatbot JR") st.write("Welcome to the Travel Assistant Chatbot!") user_input = st.text_input("User Input:") if st.button("Submit"): response = chain.run(user_input) api_response = api_call(user_input) response = llm.invoke(prompt+user_input+response + api_response) st.text_area("Chatbot Response:", value=response.content) if st.button("Exit"): st.stop() if __name__ == "__main__": main()