정책 변경: 주기 수집 없이 고정 데이터셋을 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>
docs/architecture.html 내용을 발표용 11장 덱으로 재구성.
전체 흐름·중복제거 4단계·데이터 모델 도식을 이미지가 아니라
네이티브 도형으로 그려 PowerPoint 에서 그대로 편집 가능하다.
- scripts/build-deck.py (python-pptx) 로 재생성 가능
- 슬라이드 경계 이탈 0건, 텍스트 가로 넘침 0건 검증
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- stay.pension 업종, kr.jeonbuk.gunsan 지역 계층 추가
- 스테이머뭄 업체 시드 (services/features/audiences/nearby/seasons 프로필)
- mock provider 를 프로필 배열 조합 기반으로 확장해
실제 로컬 검색 패턴(동반자·시설·인근 관광지·시즌·질문형) 전개
- POST /v1/merchants/:id/generate?count=N 으로 생성 개수 오버라이드
- tsconfig.build.json 추가 — scripts/ 가 dist 루트를 바꾸던 문제 수정
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>