| import streamlit as st |
| from langchain.llms import HuggingFacePipeline |
| from langchain.memory import ConversationBufferMemory |
| from langchain.chains import ConversationalRetrievalChain |
| from langchain.prompts.prompt import PromptTemplate |
| from langchain.embeddings import HuggingFaceEmbeddings, OpenAIEmbeddings |
| from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline |
| from langchain.schema import Document |
| from langchain_community.llms import HuggingFaceEndpoint |
| from langchain.vectorstores import Chroma |
| from transformers import TextStreamer |
| from langchain.llms import HuggingFacePipeline |
| from langchain.prompts import ChatPromptTemplate |
| from langchain.llms import HuggingFaceHub |
| import os |
| import pandas as pd |
| from langchain.vectorstores import FAISS |
| import subprocess |
| from langchain_community.llms import HuggingFaceHub |
| from langchain_core.runnables import RunnablePassthrough |
| from langchain_core.output_parsers import StrOutputParser |
| import pandas as pd |
|
|
| |
| MODEL_NAME = "mistralai/Mixtral-8x7B-Instruct-v0.1" |
| model_name = "google/gemma-2-2b" |
| TOKEN=os.getenv('gemma2') |
| subprocess.run(["huggingface-cli", "login", "--token", TOKEN, "--add-to-git-credential"]) |
| |
| |
| os.environ["HUGGINGFACEHUB_API_TOKEN"] = st.secrets['gemma2'] |
|
|
|
|
| |
| @st.cache_resource |
| def load_model(): |
| |
| |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| local_llm = HuggingFaceHub( |
| repo_id="mistralai/Mixtral-8x7B-Instruct-v0.1", |
| |
| model_kwargs={"temperature": 0.5, "max_length": 1048}) |
| return local_llm |
|
|
| |
| @st.cache_resource |
| def load_embeddings(): |
| embeddings = HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L6-v2') |
| |
| return embeddings |
|
|
| |
|
|
|
|
| |
| def setup_conversation_chain(): |
| llm = load_model() |
| chunks = [] |
|
|
| df = pd.read_excel(r"chunk_metadata_template.xlsx") |
| for _, row in df.iterrows(): |
| chunk_with_metadata = Document( |
| page_content=row['page_content'], |
| metadata={ |
| 'chunk_id': row['chunk_id'], |
| 'document_title': row['document_title'], |
| 'topic': row['topic'], |
| 'access': row['access'] |
| } |
| ) |
| chunks.append(chunk_with_metadata) |
| embeddings = HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L6-v2') |
| vector = Chroma.from_documents(chunks, embedding=embeddings) |
| |
|
|
| template = """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} |
| Câu hỏi: {question} |
| Trả lời:""" |
| parser = StrOutputParser() |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| def format_docs(docs= chunks): |
| return "\n\n".join(doc.page_content for doc in docs) |
| chain = ( |
| {"context": vector.as_retriever(search_kwargs={'k': 5}) | format_docs, "question": RunnablePassthrough()} |
| | template |
| | llm |
| | parser |
| ) |
| |
| return chain |
|
|
| |
| def main(): |
| st.title("🛡️ MBAL Chatbot 🛡️") |
|
|
| |
| if 'conversation_chain' not in st.session_state: |
| st.session_state.conversation_chain = setup_conversation_chain() |
|
|
| |
| if 'messages' not in st.session_state: |
| st.session_state.messages = [] |
|
|
| for message in st.session_state.messages: |
| with st.chat_message(message["role"]): |
| st.markdown(message["content"]) |
|
|
| |
| if prompt := st.chat_input("Bạn cần tư vấn về điều gì? Hãy chia sẻ nhu cầu và thông tin của bạn nhé!"): |
| st.session_state.messages.append({"role": "user", "content": prompt}) |
| with st.chat_message("user"): |
| st.markdown(prompt) |
|
|
| with st.chat_message("assistant"): |
| message_placeholder = st.empty() |
| full_response = "" |
| |
| |
| response = st.session_state.conversation_chain({"question": prompt, "chat_history": []}) |
| full_response = response['answer'] |
| |
| |
| message_placeholder.markdown(full_response) |
| |
| st.session_state.messages.append({"role": "assistant", "content": full_response}) |
|
|
| |
| main() |