Spaces:
Runtime error
Runtime error
| import os | |
| import re | |
| from datetime import datetime | |
| try: | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| except ImportError: | |
| pass | |
| _BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | |
| VECTOR_DB = os.getenv("VECTOR_DB", "pinecone").lower() | |
| EMBED_MODEL_PATH = os.path.join(_BASE_DIR, "models", "embed_finetuned") | |
| SUMMARY_MODEL_PATH = os.path.join(_BASE_DIR, "models", "summary_finetuned") | |
| CLASSIFY_MODEL_PATH = os.path.join(_BASE_DIR, "models", "classify_finetuned") | |
| BASE_MODEL_EMBED = os.getenv("BASE_MODEL_EMBED", "BAAI/bge-m3") | |
| EMBEDDER_BACKEND = os.getenv("EMBEDDER_BACKEND", "sentence-transformers").lower() | |
| EMBEDDING_DEVICE = os.getenv("EMBEDDING_DEVICE", "").strip().lower() | |
| SIMCSE_POOLING = os.getenv("SIMCSE_POOLING", "cls").lower() | |
| SEARCH_ALPHA = float(os.getenv("SEARCH_ALPHA", "0.5")) | |
| VECTOR_STATE_PATH = os.getenv( | |
| "VECTOR_STATE_PATH", | |
| os.path.join(_BASE_DIR, "pinecone_index"), | |
| ) | |
| INDEX_MANIFEST_PATH = os.path.join(VECTOR_STATE_PATH, "index_manifest.json") | |
| NOTICES_CACHE_PATH = os.path.join(_BASE_DIR, "data", "data_2026.json") | |
| PINECONE_API_KEY = os.getenv("PINECONE_API_KEY") | |
| PINECONE_INDEX_NAME = os.getenv("PINECONE_INDEX_NAME", "hansung-notices-bge-m3") | |
| PINECONE_CLOUD = os.getenv("PINECONE_CLOUD", "aws") | |
| PINECONE_REGION = os.getenv("PINECONE_REGION", "us-east-1") | |
| PINECONE_NAMESPACE = os.getenv("PINECONE_NAMESPACE", "prod") | |
| PINECONE_CACHE_PATH = os.getenv( | |
| "PINECONE_CACHE_PATH", | |
| os.path.join(VECTOR_STATE_PATH, "pinecone_chunks.json"), | |
| ) | |
| EMBEDDING_DIM = int(os.getenv("EMBEDDING_DIM", "1024")) | |
| GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") | |
| GEMINI_API_KEY_PAID_TIER = os.getenv("GEMINI_API_KEY_PAID_TIER") | |
| GEMINI_ROUTER_TIMEOUT_SECONDS = int(os.getenv("GEMINI_ROUTER_TIMEOUT_SECONDS", "5")) | |
| GEMINI_REPLY_TIMEOUT_SECONDS = int(os.getenv("GEMINI_REPLY_TIMEOUT_SECONDS", "15")) | |
| QUERY_ROUTING_ENABLED = os.getenv("QUERY_ROUTING_ENABLED", "false").lower() == "true" | |
| GEMINI_FEATURE_TIMEOUT_SECONDS = int(os.getenv("GEMINI_FEATURE_TIMEOUT_SECONDS", "10")) | |
| GEMINI_FEATURE_MODEL = os.getenv("GEMINI_FEATURE_MODEL", "gemini-2.5-flash-lite") | |
| GEMINI_FEATURE_BATCH_SIZE = int(os.getenv("GEMINI_FEATURE_BATCH_SIZE", "8")) | |
| GEMINI_FEATURE_EXTRACTION_ENABLED = os.getenv("GEMINI_FEATURE_EXTRACTION_ENABLED", "true").lower() == "true" | |
| NOTICE_FEATURE_CACHE_PATH = os.getenv( | |
| "NOTICE_FEATURE_CACHE_PATH", | |
| os.path.join(_BASE_DIR, "data", "notice_feature_cache.json"), | |
| ) | |
| BOARD_LIST_URL = "https://www.hansung.ac.kr/bbs/hansung/2127/artclList.do" | |
| HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"} | |
| TARGET_YEAR = str(datetime.now().year) | |
| CHUNK_SIZE = 500 | |
| CHUNK_OVERLAP = 80 | |
| CATEGORIES = [ | |
| "์ทจ์ /์ฑ์ฉ", "์ธํด์ญ", "์ฅํ๊ธ", "ํ์๊ธ/๊ทผ๋ก์ฅํ", "ํ์ฌํ์ ", | |
| "์ฐฝ์ ", "๊ตญ์ ๊ต๋ฅ", "๊ต์ก/ํน๊ฐ", "๋น๊ต๊ณผ", "๊ณต๋ชจ์ /๊ฒฝ์ง๋ํ", | |
| "๋ด์ฌ/์ํฌํฐ์ฆ", "๊ธฐ์์ฌ/์ํ๊ด", "ROTC", "๊ธฐํ", | |
| ] | |
| CATEGORY_PREFIX: dict[str, str] = { | |
| "์ฑ์ฉ์ ๋ณด": "์ทจ์ /์ฑ์ฉ", | |
| "๊ฐ์๊ธฐ์ ์ฑ์ฉ": "์ทจ์ /์ฑ์ฉ", | |
| "์ธํด์ฝ": "์ธํด์ญ", | |
| "๊ต์ธ์ฅํ๊ธ": "์ฅํ๊ธ", | |
| "๊ตญ๊ฐ์ฅํ๊ธ": "์ฅํ๊ธ", | |
| "ํ์๊ธ๋์ถ": "ํ์๊ธ/๊ทผ๋ก์ฅํ", | |
| "๊ตญ๊ฐ๊ทผ๋ก": "ํ์๊ธ/๊ทผ๋ก์ฅํ", | |
| "๋ฉดํ๊ทผ๋ก": "ํ์๊ธ/๊ทผ๋ก์ฅํ", | |
| "๊ณต๋ชจ์ ": "๊ณต๋ชจ์ /๊ฒฝ์ง๋ํ", | |
| "์ ๋ณด": "๊ณต๋ชจ์ /๊ฒฝ์ง๋ํ", | |
| } | |
| CATEGORY_KEYWORDS: dict[str, list[str]] = { | |
| "ROTC": ["ROTC", "ํ๊ตฐ์ฌ๊ด", "ํ๊ตฐ๋จ", "ํ์ญ๋ณ ๋ชจ์ง", "ํ์ญ๋ณ๋ชจ์ง", "์๋น๊ตฐ", "์ ๋ฌธ์ฌ๊ด", "์ฌ๋ณ์ญํ์ ๊ฒ์ฌ"], | |
| "๊ธฐ์์ฌ/์ํ๊ด": ["๊ธฐ์์ฌ", "์ํ๊ด", "์์๋น๋ฆฌ์ง", "์ฐ์ดํ์ฌ", "์๋๊ธฐ์์ฌ", "์ฌ๊ฐ", "์ ์ฌ์ ์ ๋ฐ", "๋ํ์์ฃผํ", "ํ์ฌ๊ด"], | |
| "๋น๊ต๊ณผ": ["๋น๊ต๊ณผ", "๋์๋ฆฌ", "D-School", "ํฌ๋ผ", "๋๋์ ", "์์์ ", "์ ํ์", | |
| "HS CREW", "์์ํํฌ", "๋ผ์ดํ ๋์์ธ", "๋ฌธํํ๋ฐฉ", "๋ง์ฐ์ ", "์ค์ฐฌ ์ํต", | |
| "Lunch with", "์ฒ์์ ์์นจ๋ฐฅ", "ESG", "์ง๋ก์ง๋จ์๋ด", "๋ฆฌ๋์ญ ํํ", | |
| "ํ์์ถ์ ", "๋ฌธํ์ ", "ํ์คํฐ๋ฒ", "์๋ชจ์", | |
| "๋์ฆ๋ ํ๋ก๊ทธ๋จ", "๋์ฆ๋ํ๋ก๊ทธ๋จ", "FSU-Disney", "Disney", | |
| "์๋ด๊ธฐ ์๋ก๋ฐฐ์ํฐ", "์๋ก๋ฐฐ์ํฐ", "์ดํ์ํ", "์ฌ์ง์ ", "์์ยท์ฌ์ง์ ", "์ง๋ก ์ค๋ช ํ", "ํธ๋ ์ง๋ก"], | |
| "์ทจ์ /์ฑ์ฉ": ["์ฑ์ฉ", "์ ์ ", "๊ณต์ฑ", "์ทจ์ ", "์ฑ์ฉ๋ฐ๋ํ", "์ทจ์ ๋ฐ๋ํ", "๋ชจ์ง๊ณต๊ณ ", "์ง๋ฌด", "์ฑ์ฉ์ฐ๊ณ", "์ผ๋ฐ์ฑ์ฉ", "์ถ์ฒ์ฑ์ฉ"], | |
| "์ธํด์ญ": ["์ธํด", "์ธํด์ญ", "์ผ๊ฒฝํ", "์ฒดํํ", "ํ์ฅ์ค์ต", "IPP"], | |
| "์ฅํ๊ธ": ["์ฅํ", "์ฅํ์", "์ฅํ์ฌ๋จ", "์ฅํ๊ธ", "๊ธฐ๋ถ์ฅํ", "์ฅํ์ฌ์ ", "์ค์นผ๋ผ์ญ", "์ฅํ์ง์"], | |
| "ํ์๊ธ/๊ทผ๋ก์ฅํ": ["ํ์๊ธ๋์ถ", "ํ์๊ธ", "์ด์์ง์", "๊ตญ๊ฐ๊ทผ๋ก", "๋ฉดํ๊ทผ๋ก", "๊ทผ๋ก์ฅํ", "๋์ถ์ด์", | |
| "๋ฑ๋ก๊ธ ๋ฉ๋ถ", "๋ฑ๋ก๊ธ ๋ถํ ", "ํ๊ธฐ์ด๊ณผ์ ๋ฑ๋ก๊ธ"], | |
| "ํ์ฌํ์ ": ["์๊ฐ์ ์ฒญ", "์๊ฐ์ ์ ", "์กธ์ ", "ํดํ", "๋ณตํ", "ํ์ ", "ํธ๋๋ณ๊ฒฝ", "์ฑ์ ", "ํ๊ฐ", "๋ณต์์ ๊ณต", "๋ถ์ ๊ณต", | |
| "์ฌ์ ํ", "์ฐ๊ณ์ ๊ณต", "Micro Degree", "MD๊ณผ์ ", "๊ต์์์ด", "์ด์์ ์ฒญ", | |
| "ํธ๋์ ํ", "๊ณ์ ํ๊ธฐ", "์์ ํ๊ฐ", "ํ์์ทจ๋์ ์", "์๊ฐํฌ๊ธฐ", "์๋ฉด์ ์ฒญ", "์๋ฉด ์ ์ฒญ", | |
| "๊ต์ฐจ์ ๋ถ", "ํธ์ ์", "์ ๋ถ(๊ณผ)", "ํ์์์ฌ์", "ํ์ฌํ์์ทจ๋", | |
| "์ค๋ฆฌ์ํ ์ด์ ", "๋ฐํธ์ฑ๊ณ ์ฌ", "ํฉ๊ฒฉ์ ๊ณต๊ณ ", "ํฉ๊ฒฉ์๋ฐํ", "์ ๋ฐ ๊ฒฐ๊ณผ", "์ด์ ๋ฉด์ ", | |
| "์ค๊ฐ๊ณ ์ฌ", "๊ธฐ๋ง๊ณ ์ฌ", "์ ๊ณต๊ณผ๋ชฉ ๋ณ๊ฒฝ", "๋ค์ ๊ณต ์ ์ฒญ", "ํ์์ฌ์ฐ๊ณ", | |
| "ํ์ฌ๊ฒฝ๊ณ ", "์๊ธฐ์ค๊ณ์ ๊ณต", "๊ต์ํ์", "์์๋ ฅ์ด๋ ธ๋ฒ ์ดํฐ"], | |
| "์ฐฝ์ ": ["์ฐฝ์ ", "์ฐฝ์ ๋์๋ฆฌ", "์ฐฝ์ ์ง์", "์ฐฝ์ ๋ฉํ ๋ง", "์คํํธ์ ", "์์ด๋์ดํค", "์ ์ฃผ๊ธฐ์ ", "์๋น์ฐฝ์ ", "ํ์ CEO", "CEO ๋ฐ๊ตด"], | |
| "๊ตญ์ ๊ต๋ฅ": ["๊ตํํ์", "์ดํ์ฐ์", "ํ๊ฒฌ", "๊ธ๋ก๋ฒ๋ฒ๋", "๊ตญ์ ๊ต๋ฅ", "ํด์ธ", "์ดํ", "๊ธ๋ก์ปฌ", | |
| "๊ธ๋ก๋ฒ ํํฐ๋ง", "๊ธ๋ก๋ฒ Conversation", "๊ธ๋ก๋ฒ ์ปจ๋ฒ์ธ์ด์ ", "๊ธ๋ก๋ฒ ๋ฌธํ ์ํต", | |
| "๋จ๊ธฐ์ฐ์", "K-Move", "WEST ์ฐ์", "ํยท๋ฏธ๋ํ์", "๊ธ๋ก๋ฒ ๋ํ"], | |
| "๊ต์ก/ํน๊ฐ": ["ํน๊ฐ", "๊ต์ก์", "์์นด๋ฐ๋ฏธ", "KDT", "K-๋์งํธ", "๊ฐ์ข", "๊ต์ก๊ณผ์ ", "์ญ๋๊ฐํ", | |
| "ํ์๊ต์ก", "RISE", "๋ง์ดํฌ๋ก๋๊ทธ๋ฆฌ", "TOPCIT", "์ฐ๊ตฌ๋ฐฉ๋ฒ๋ก ", | |
| "์ด์ฒญ๊ฐ์ฐ", "ํน๋ณ๊ฐ์ฐ", "ํต์ฌ์ญ๋์ง๋จ", "HS-CESA", "K-CESA", "UICA", "K-NSSE", | |
| "ํญ๋ ฅ์๋ฐฉ๊ต์ก", "ํ์๊ต์ก", "์ ๋ฌธ๊ณผ์ ", "SW๋ง์์คํธ๋ก", "์ฝ๋ฉ ์บ ํ", "์ฝ๋ฉ์บ ํ", | |
| "์ฐ๊ตฌ์ค๋ฆฌ", "์ํฌ์", "์ง๋ก ์บ ํ", "์ฌํ์์์ ", "์ ์๊ถ", "๊ธฐ์ด์ญ๋ ๊ฐ์ด๋"], | |
| "๊ณต๋ชจ์ /๊ฒฝ์ง๋ํ": ["๊ณต๋ชจ์ ", "๊ฒฝ์ง๋ํ", "์ฑ๋ฆฐ์ง", "ํด์ปคํค", "๋ํ", "๊ณต๋ชจ", "๋ฌธํ์"], | |
| "๋ด์ฌ/์ํฌํฐ์ฆ": ["์ํฌํฐ์ฆ", "์ํฌํฐ์ค", "๋ด์ฌ", "๋ฉํ ", "๋ด์ฌ์", "๊ธฐ์๋จ", "์์ํ๋", "๋ฉํ ๋จ", "๋ฉํ ๋ง", | |
| "ํ๋ณด๋์ฌ", "ํ๋", "์ํต-e", "์ฐ๋ฒ์๋", "๋ฐฉ์ก๊ตญ HBS", "ํ๋ณด๋จ", | |
| "์์ต๊ธฐ์", "์ด์์๋ฌธ์์", "๋ชจ๋ํฐ๋ง๋จ", "์๋ฌธ๋จ", | |
| "๋ฐ๋ก์๋ฆผ๋จ", "๊ธฐํ๋จ", "์ฒดํ๋จ", "๋ฐ๊ตด๋จ", "์์ฐฐ๋", "์ ์๋จ", | |
| "์์์ง๋์", "๋ณผ๋ฐํค", "์ฒญ๋ฐฑ๋ฆฌํฌํฐ", "Friends of Korea"], | |
| } | |
| CATEGORY_PATTERN = re.compile( | |
| r"^(ํ์ฑ๊ณต์ง|๊ตญ์ |ํ์ฌ|๋น๊ต๊ณผ|์ฅํ|์ทจ์ |์ง๋ก|์ฐฝ์ |๊ธฐํ|ํ์ฅ์ค์ต|๊ต์กํ๋ก๊ทธ๋จ|ํ์ฌ|์ผ๋ฐ๊ณต์ง)\s*" | |
| ) | |
| SUFFIX_PATTERN = re.compile(r"\s*(์๊ธ|hot|NEW)\s*$", re.IGNORECASE) | |