voicechat__ / main.py
Gopikanth123's picture
Update main.py
00383dc verified
raw
history blame
6.17 kB
from flask import Flask, render_template, request, jsonify
import os
import shutil
from llama_index.core import StorageContext, load_index_from_storage, VectorStoreIndex, SimpleDirectoryReader, ChatPromptTemplate, Settings
from llama_index.llms.huggingface import HuggingFaceInferenceAPI
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from huggingface_hub import InferenceClient
from transformers import AutoTokenizer, AutoModel
# Ensure HF_TOKEN is set
HF_TOKEN = os.getenv("HF_TOKEN")
if not HF_TOKEN:
raise ValueError("HF_TOKEN environment variable not set.")
repo_id = "meta-llama/Meta-Llama-3-8B-Instruct"
llm_client = InferenceClient(
model=repo_id,
token=HF_TOKEN,
)
# Configure Llama index settings
Settings.llm = HuggingFaceInferenceAPI(
model_name=repo_id,
tokenizer_name=repo_id,
context_window=3000,
token=HF_TOKEN,
max_new_tokens=512,
generate_kwargs={"temperature": 0.1},
)
# Configure embedding model (XLM-RoBERTa model for multilingual support)
Settings.embed_model = HuggingFaceEmbedding(
model_name="xlm-roberta-base" # Multilingual support
)
# Configure tokenizer and model for multilingual responses
tokenizer = AutoTokenizer.from_pretrained("xlm-roberta-base")
model = AutoModel.from_pretrained("xlm-roberta-base")
PERSIST_DIR = "db"
PDF_DIRECTORY = 'data'
# Ensure directories exist
os.makedirs(PDF_DIRECTORY, exist_ok=True)
os.makedirs(PERSIST_DIR, exist_ok=True)
chat_history = []
current_chat_history = []
# Data ingestion function
def data_ingestion_from_directory():
if os.path.exists(PERSIST_DIR):
shutil.rmtree(PERSIST_DIR) # Remove the persist directory and its contents
os.makedirs(PERSIST_DIR, exist_ok=True)
new_documents = SimpleDirectoryReader(PDF_DIRECTORY).load_data()
index = VectorStoreIndex.from_documents(new_documents)
index.storage_context.persist(persist_dir=PERSIST_DIR)
# Function to handle the query and provide a response
def handle_query(query, selected_language):
context_str = ""
# Build context from current chat history
for past_query, response in reversed(current_chat_history):
if past_query.strip():
context_str += f"User asked: '{past_query}'\nBot answered: '{response}'\n"
# Define the response template based on selected language
if selected_language == 'telugu':
language_prompt = "మీరు తాజ్ హోటల్ చాట్‌బాట్, తాజ్ హోటల్ సహాయకుడు."
elif selected_language == 'hindi':
language_prompt = "आप ताज होटल चैटबोट हैं, ताज होटल सहायक।"
else:
language_prompt = "You are the Taj Hotel chatbot, Taj Hotel Helper."
chat_text_qa_msgs = [
(
"user",
f"""
{language_prompt}
**Your Role:**
- Respond accurately and concisely in the user's preferred language (English, Telugu, or Hindi).
- Provide information about the hotel’s services, amenities, and policies.
**Instructions:**
- **Context:**
{context_str}
- **User's Question:**
{query}
**Response Guidelines:**
1. **Language Adaptation:** Respond in the language of the question (English, Telugu, or Hindi).
2. **Tone:** Maintain politeness, professionalism, and the luxury branding of the Taj Hotel.
3. **Clarity:** Limit responses to 10-15 words for direct and clear communication.
4. **Knowledge Boundaries:** If unsure of an answer, respond with:
_"I’m not sure. Please contact our staff for accurate information."_
5. **Actionable Help:** Offer suggestions or alternative steps to guide the user where applicable.
**Response:** [Your concise response here]
"""
)
]
text_qa_template = ChatPromptTemplate.from_messages(chat_text_qa_msgs)
# Load the index for querying
storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)
index = load_index_from_storage(storage_context)
query_engine = index.as_query_engine(text_qa_template=text_qa_template, context_str=context_str)
print(f"Querying: {query}")
answer = query_engine.query(query)
# Extracting the response
if hasattr(answer, 'response'):
response = answer.response
elif isinstance(answer, dict) and 'response' in answer:
response = answer['response']
else:
response = "I'm sorry, I couldn't find an answer to that."
# Append to chat history
current_chat_history.append((query, response))
return response
app = Flask(__name__)
# Data ingestion
data_ingestion_from_directory()
# Generate Response
def generate_response(query, language):
try:
# Call the handle_query function to get the response
bot_response = handle_query(query, language)
return bot_response
except Exception as e:
return f"Error fetching the response: {str(e)}"
# Route for the homepage
@app.route('/')
def index():
return render_template('index.html')
# Route to handle chatbot messages
@app.route('/chat', methods=['POST'])
def chat():
try:
user_message = request.json.get("message")
selected_language = request.json.get("language") # Get selected language from the request
if not user_message:
return jsonify({"response": "Please say something!"})
if selected_language not in ['english', 'telugu', 'hindi']:
return jsonify({"response": "Invalid language selected."})
bot_response = generate_response(user_message, selected_language)
return jsonify({"response": bot_response})
except Exception as e:
return jsonify({"response": f"An error occurred: {str(e)}"})
if __name__ == '__main__':
app.run(debug=True)