Spaces:
Running
Running
| from sentence_transformers import SentenceTransformer | |
| from config import EMBEDDING_MODEL_NAME | |
| class MenuEmbedder: | |
| """ | |
| 한국어 특화 임베딩 모델 래퍼. | |
| 첫 실행 시 모델 자동 다운로드 (~500MB), 이후 로컬 캐시 사용. | |
| """ | |
| def __init__(self): | |
| print(f"임베딩 모델 로드 중: {EMBEDDING_MODEL_NAME}") | |
| self.model = SentenceTransformer(EMBEDDING_MODEL_NAME) | |
| print("모델 로드 완료") | |
| def embed_text(self, text: str) -> list: | |
| """단일 텍스트 임베딩""" | |
| vector = self.model.encode(text, normalize_embeddings=True) | |
| return vector.tolist() | |
| def embed_batch(self, texts: list, batch_size: int = 32) -> list: | |
| """배치 임베딩""" | |
| vectors = self.model.encode( | |
| texts, | |
| batch_size=batch_size, | |
| normalize_embeddings=True, | |
| show_progress_bar=True | |
| ) | |
| return vectors.tolist() | |
| def build_embedding_text(self, desc: dict) -> str: | |
| """ | |
| Description의 여러 필드를 하나의 임베딩용 텍스트로 결합. | |
| embedding_text 필드를 우선 사용하되, 없으면 주요 필드 조합. | |
| """ | |
| if desc.get("embedding_text"): | |
| return desc["embedding_text"] | |
| parts = [ | |
| desc.get("menu_name", ""), | |
| desc.get("function_desc", ""), | |
| " ".join(desc.get("keywords", [])), | |
| " ".join(desc.get("user_verbs", [])), | |
| " ".join(desc.get("sample_queries", [])), | |
| ] | |
| return " ".join(filter(None, parts)) | |