Siddartha10's picture
Update app.py
7fcef14 verified
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()