import os import logging from pathlib import Path from dotenv import load_dotenv from langchain_community.vectorstores import FAISS from langchain_community.document_loaders import PyPDFLoader from langchain_community.embeddings import OpenAIEmbeddings from langchain_openai import ChatOpenAI from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_core.prompts import ChatPromptTemplate logger = logging.getLogger(__name__) BASE_DIR = Path(__file__).resolve().parent ENV_PATH = BASE_DIR / ".env" if ENV_PATH.exists(): load_dotenv(dotenv_path=ENV_PATH, override=False) # --- Konstanta global --- OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") PDF_DIR = "documents" VECTOR_DIR = "vector_store" VECTOR_INDEX_PATH = os.path.join(VECTOR_DIR, "faiss_index") _CHAT_KW = {"model": "gpt-4o-mini", "api_key": OPENAI_API_KEY} MASKOT_NAME = "Hadmin AI" SYSTEM_INSTRUCTION = f""" Kamu adalah maskot chat AI bernama {MASKOT_NAME}, mewakili perusahaan. Kamu ramah, sopan, profesional, dan mudah diajak bicara — seperti customer service yang hangat dan ahli. Tugas: 1. Pahami konteks dan kebutuhan pengguna dengan cermat. 2. Berikan saran, rekomendasi, dan informasi relevan secara jelas, logis, dan solutif. 3. Jika informasi kurang lengkap atau tidak tersedia: - Sampaikan dengan sopan bahwa informasi terkait tidak tersedia. - Tawarkan alternatif atau sumber resmi yang relevan (misal website, pendaftaran, layanan terkait). - Jelaskan mengapa alternatif tersebut bisa menjadi opsi yang cocok. 4. Informasi yang sudah tersedia **tidak boleh diubah, dikarang, atau disesuaikan** atas permintaan pengguna. 5. Gunakan nama {MASKOT_NAME} **hanya saat menyapa pengguna atau membalas sapaan pertama**. 6. Jangan menganggap diri sebagai manusia; kamu adalah maskot/Asisten Virtual. 7. Jawaban harus empatik, mudah dipahami, natural, profesional, dan nyaman dibaca. Format HTML: - Gunakan

untuk paragraf. - Gunakan