정책 변경: 주기 수집 없이 고정 데이터셋을 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>
발행된 사이트에 업체별 SEO/AEO 키워드를 제공하는 서비스.
- PostgreSQL 16 + pgvector/ltree/pg_trgm 단일 스토어
(정확·의미·계층 조회를 한 엔진에서 처리)
- 키워드는 전역 사전 + merchant_keyword 연결 테이블 구조
- 4단계 계단식 중복제거: 금칙어 → normalized 완전일치 →
pg_trgm → 코사인 유사도, 걸린 표기는 aliases[] 로 흡수
- BullMQ 생성 큐 (발행 즉시 / 일 1회 크론 / 성과 기반)
- OpenAI Structured Outputs + mock provider
(API 키 없이 로컬 전 구간 동작)
- 서빙 API: /v1/sites/:id/seo, /aeo, /performance, /keywords/search
- docs/architecture.html 설계 도식
JSON-LD 조립과 o2o-site-AEO 연동은 후속 작업.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>