Spaces:
Running
Running
from langchain_community.vectorstores import FAISS | |
from langchain_community.embeddings import HuggingFaceEmbeddings | |
from langchain.prompts import PromptTemplate | |
import os | |
from langchain.memory import ConversationBufferWindowMemory | |
from langchain.chains import ConversationalRetrievalChain | |
import time | |
import streamlit as st | |
import os | |
import subprocess | |
from langchain.chat_models import ChatOpenAI | |
st.set_page_config(page_title="MBAL CHATBOT") | |
col1, col2, col3 = st.columns([1,2,1]) | |
OPENAI_API_KEY = os.getenv("OPENAI_API") | |
TOKEN=os.getenv('HF_TOKEN') | |
subprocess.run(["huggingface-cli", "login", "--token", TOKEN, "--add-to-git-credential"]) | |
st.sidebar.title("Welcome to MBAL Chatbot") | |
st.markdown( | |
""" | |
<style> | |
div.stButton > button:first-child { | |
background-color: #ffd0d0; | |
} | |
div.stButton > button:active { | |
background-color: #ff6262; | |
} | |
.st-emotion-cache-6qob1r { | |
position: relative; | |
height: 100%; | |
width: 100%; | |
background-color: black; | |
overflow: overlay; | |
} | |
div[data-testid="stStatusWidget"] div button { | |
display: none; | |
} | |
.reportview-container { | |
margin-top: -2em; | |
} | |
#MainMenu {visibility: hidden;} | |
.stDeployButton {display:none;} | |
footer {visibility: hidden;} | |
#stDecoration {display:none;} | |
button[title="View fullscreen"]{ | |
visibility: hidden;} | |
</style> | |
""", | |
unsafe_allow_html=True, | |
) | |
def reset_conversation(): | |
st.session_state.messages = [] | |
st.session_state.memory.clear() | |
if "messages" not in st.session_state: | |
st.session_state.messages = [] | |
if "memory" not in st.session_state: | |
st.session_state.memory = ConversationBufferWindowMemory(k=2, memory_key="chat_history",return_messages=True) | |
embeddings = HuggingFaceEmbeddings(model_name="bkai-foundation-models/vietnamese-bi-encoder", model_kwargs={"trust_remote_code": True}) | |
db = FAISS.load_local("mbal_faiss_db", embeddings,allow_dangerous_deserialization= True) | |
db_retriever = db.as_retriever(search_type="similarity",search_kwargs={"k": 4}) | |
prompt_template = """<s>[INST] Bạn là một chuyên viên tư vấn cho khách hàng về sản phẩm bảo hiểm của công ty MB Ageas Life tại Việt Nam. Hãy trả lời chuyên nghiệp, chính xác, cung cấp thông tin trước rồi hỏi câu tiếp theo. Tất cả các thông tin cung cấp đều trong phạm vi MBAL. Khi có đủ thông tin khách hàng thì mới mời khách hàng đăng ký để nhận tư vấn trên https://www.mbageas.life/ | |
{context} | |
QUESTION: {question} | |
CHAT HISTORY: {chat_history}[/INST] | |
ASSISTANT: | |
</s> | |
""" | |
prompt = PromptTemplate(template=prompt_template, | |
input_variables=['question', 'context', 'chat_history']) | |
llm = ChatOpenAI(model="gpt-4o") | |
# Create a conversational chain using only your database retriever | |
qa = ConversationalRetrievalChain.from_llm( | |
llm=llm, | |
memory=st.session_state.memory, | |
retriever=db_retriever, | |
combine_docs_chain_kwargs={'prompt': prompt} | |
) | |
for message in st.session_state.messages: | |
with st.chat_message(message.get("role")): | |
st.write(message.get("content")) | |
input_prompt = st.chat_input("Say something") | |
if input_prompt: | |
with st.chat_message("user"): | |
st.write(input_prompt) | |
st.session_state.messages.append({"role":"user","content":input_prompt}) | |
with st.chat_message("assistant"): | |
with st.status("Lifting data, one bit at a time 💡...",expanded=True): | |
result = qa.invoke(input=input_prompt) | |
message_placeholder = st.empty() | |
full_response = "⚠️ **_Note: Information provided may be inaccurate._** \n\n\n" | |
for chunk in result["answer"]: | |
full_response+=chunk | |
time.sleep(0.02) | |
message_placeholder.markdown(full_response+" ▌") | |
st.button('Reset All Chat 🗑️', on_click=reset_conversation) | |
st.session_state.messages.append({"role":"assistant","content":result["answer"]}) |