Spaces:
Sleeping
Sleeping
File size: 5,171 Bytes
0b37f80 |
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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
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() |