정책 변경: 주기 수집 없이 고정 데이터셋을 1회 적재한다. - data/gunsan-pension-keywords.json — "군산 펜션" 키워드·태그 1,000건 실제 군산 지명·관광지·숙박 시설 어휘 × 로컬 검색 패턴으로 작성 - 임베딩을 LlmProvider 에서 EmbeddingProvider 로 분리 (mock | local:multilingual-e5-small | openai), e5 의 query/passage 비대칭 반영 - vector(1536) → vector(384) 마이그레이션, keyword 에 source/kind/category 추가 - scripts/ingest-dataset.ts — 어휘 중복만 자동 병합, 벡터 근접쌍은 검토 목록만 출력 - POST /v1/match — 업체명(띄어쓰기 무관) 또는 문장 → 사전에서 매칭 업체는 프로필 전체를 질의문으로 조립해 임베딩 - GET /demo — 매칭 콘솔 (public/demo.html) 실측으로 코사인 자동 병합 임계값을 0.92 → 0.99 로 정정. 짧은 한글 키워드는 같은 도메인이면 0.93+ 가 기본이라 0.92 는 오병합을 부른다. 적재 결과: 1,000건 → 어휘 중복 27 병합, 금칙어 2 차단 → 971건. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
38 lines
1.3 KiB
Plaintext
38 lines
1.3 KiB
Plaintext
# --- server ---
|
|
PORT=3100
|
|
|
|
# --- postgres (docker-compose 기본값) ---
|
|
DATABASE_URL=postgres://ontology:ontology@localhost:55432/ontology
|
|
|
|
# --- redis (BullMQ) ---
|
|
REDIS_HOST=localhost
|
|
REDIS_PORT=56379
|
|
|
|
# --- 임베딩 ---
|
|
# local : 로컬 multilingual-e5-small (384차원, 최초 1회 모델 다운로드 후 오프라인)
|
|
# mock : 문자 bigram 해싱 — 의미는 못 잡음
|
|
# openai : text-embedding-3-small (dimensions=384 로 요청)
|
|
EMBEDDING_PROVIDER=local
|
|
EMBEDDING_LOCAL_MODEL=Xenova/multilingual-e5-small
|
|
|
|
# --- LLM ---
|
|
# mock : API 키 없이 로컬에서 전체 파이프라인 동작 (기본값)
|
|
# openai : 실제 OpenAI 호출
|
|
LLM_PROVIDER=mock
|
|
OPENAI_API_KEY=
|
|
OPENAI_MODEL=gpt-4.1-mini
|
|
OPENAI_EMBEDDING_MODEL=text-embedding-3-small
|
|
|
|
# --- 생성/중복제거 튜닝 ---
|
|
# 코사인 자동 병합 임계값. 짧은 한글 키워드는 같은 도메인이면 0.93+ 가 기본으로 나오므로
|
|
# 0.92 는 오병합을 부른다. 실측상 어순 변형만 0.999 대에 모이므로 0.99 로 둔다.
|
|
DEDUP_COSINE_THRESHOLD=0.99
|
|
# trigram 유사도 사전 필터
|
|
DEDUP_TRIGRAM_THRESHOLD=0.6
|
|
# 벡터 비교 대상 상위 후보 수
|
|
DEDUP_CANDIDATE_LIMIT=20
|
|
# 1회 생성 요청당 키워드 목표 개수
|
|
GENERATION_TARGET_KEYWORDS=15
|
|
# 주기 리프레시 간격(일)
|
|
REFRESH_INTERVAL_DAYS=30
|