Spaces:
Build error
Build error
| # ________ .__ __ | |
| # \______ \ ____ ______ | | ____ ___.__. _____ ____ _____/ |_ | |
| # | | \_/ __ \\____ \| | / _ < | |/ \_/ __ \ / \ __\ | |
| # | ` \ ___/| |_> > |_( <_> )___ | Y Y \ ___/| | \ | | |
| # /_______ /\___ > __/|____/\____// ____|__|_| /\___ >___| /__| | |
| # \/ \/|__| \/ \/ \/ \/ | |
| # Load package | |
| import streamlit as st | |
| #from dotenv import load_dotenv | |
| from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter | |
| from langchain.embeddings import OpenAIEmbeddings | |
| from langchain.vectorstores import FAISS | |
| from langchain.chat_models import ChatOpenAI | |
| from langchain.memory import ConversationBufferMemory | |
| from langchain.chains import ConversationalRetrievalChain | |
| from langchain.prompts import PromptTemplate | |
| from langchain.document_loaders import PyPDFLoader, DataFrameLoader | |
| import pandas as pd | |
| import openai | |
| #import os | |
| import keyboard | |
| import time | |
| # Load .env | |
| #load_dotenv() | |
| # Inisialisasi api key | |
| #KEY = os.getenv("MY_KEY") | |
| # Masukan api key | |
| openai.api_key = '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' | |
| # Buat object embedding | |
| embedding = OpenAIEmbeddings(openai_api_key='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') | |
| # Model | |
| llm = ChatOpenAI(model="gpt-4", openai_api_key='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', temperature=0) | |
| # Load data csv used car | |
| df = pd.read_csv(r'clean_usedcar_data.csv') | |
| # Load data csv FAQ | |
| loader = PyPDFLoader(r"question-answer.pdf") | |
| data_faq = loader.load() | |
| # Buat page seperti pdf dari used car data | |
| loader = DataFrameLoader(df, page_content_column="combined_info") | |
| data_car = loader.load() | |
| # Memotong karakter pada pdf per 1000 karakter | |
| text_spliter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0, | |
| separators=[",","\n\n", "\n", "(?<=\. )", " "], | |
| length_function=len) | |
| # Proses chunk | |
| text_chunk_recom = text_spliter.split_documents(data_car) | |
| text_chunk_faq = text_spliter.split_documents(data_faq) | |
| # Vector DB data used car | |
| vectorStore_recom = FAISS.from_documents(text_chunk_recom, embedding) | |
| vectorStore_faq = FAISS.from_documents(text_chunk_faq, embedding) | |
| # Merge vectorestore | |
| vectorStore_recom.merge_from(vectorStore_faq) | |
| # Mmbuka file prompt | |
| with open(r'prompt_combined.txt', 'r') as file: | |
| prompt_template = file.read() | |
| # Membuat objek retriever | |
| retrieve = vectorStore_recom.as_retriever(search_type="similarity", search_kwargs={"k": 3}) | |
| # _________ __ .__ .__ __ | |
| # / _____// |________ ____ _____ _____ | | |__|/ |_ | |
| # \_____ \\ __\_ __ \_/ __ \\__ \ / \| | | \ __\ | |
| # / \| | | | \/\ ___/ / __ \| Y Y \ |_| || | | |
| # /_______ /|__| |__| \___ >____ /__|_| /____/__||__| | |
| # \/ \/ \/ \/ | |
| class BotCRC: | |
| def __init__(self): | |
| global prompt_template | |
| global retrieve | |
| self.prompt = PromptTemplate(input_variables=["context", "question", "chat_history"], template=prompt_template) | |
| self.memory = ConversationBufferMemory(memory_key="chat_history", input_key="question", return_messages=True) | |
| self.qa_chain = ConversationalRetrievalChain.from_llm(llm=llm, retriever=retrieve, memory=self.memory, | |
| combine_docs_chain_kwargs={'prompt': self.prompt}) | |
| # Fungsi untuk berinteraksi dengan bot recommendation | |
| def conversation(self, user_input): | |
| result = self.qa_chain({"question": user_input}) | |
| response = result["answer"] | |
| return response | |
| # Fungsi interface | |
| def chatbot_chain(self): | |
| USER = "user" | |
| ASSISTANT = "assistant" | |
| initial_context = "Anda adalah asisten dari Carsome, platform jual beli mobil bekas. Anda memiliki dua tugas utama: menjawab pertanyaan pelanggan dan memberikan rekomendasi mobil berdasarkan preferensi mereka." | |
| # self.memory.chat_memory.add_user_message(initial_context) | |
| self.memory.chat_memory.add_ai_message( | |
| "Halo! Saya adalah asisten dari Carsome. Bagaimana saya bisa membantu Anda hari ini?") | |
| exit_input = ['keluar', 'sampai jumpa lagi', 'sampai jumpa kembali', 'bye'] | |
| # Interface dengan streamlit | |
| st.title("AutoBuddy") | |
| st.write("Carsome Assistant Chatbot") | |
| # Initialize chat history | |
| if "messages" not in st.session_state: | |
| st.session_state.messages = [] | |
| if 'chat_history' not in st.session_state: | |
| st.session_state.chat_history = self.memory.chat_memory | |
| else: | |
| self.memory.chat_memory = st.session_state.chat_history | |
| user_input = st.chat_input("Masukkan pesan yang ingin kamu tulis.", key="chat_input") | |
| if user_input: | |
| st.session_state.messages.append({"role": "user", "content": user_input}) | |
| if any(word in user_input.lower() for word in exit_input): | |
| st.session_state.messages.append({"role": "user", "content": user_input}) | |
| st.chat_message(ASSISTANT).write("Sampai jumpa lagi..", key="chat_output") | |
| time.sleep(2.5) | |
| keyboard.press_and_release('ctrl+w') | |
| else: | |
| result = self.conversation(user_input) | |
| # st.session_state.messages.append({"role": "user", "content": user_input}) | |
| # output = st.chat_message(ASSISTANT).write(result, key="chat_output") | |
| st.session_state.messages.append({"role": "assistant", "content": result}) | |
| # Display chat messages from history on app rerun | |
| for message in st.session_state.messages: | |
| with st.chat_message(message["role"]): | |
| st.markdown(message["content"]) | |
| chat = BotCRC() | |
| chat.chatbot_chain() |