마지막 한 단계 — 기존 노트 3건 백필
재색인 엔드포인트는 로그인(본인 세션)이 필요해서 제가 대신 호출할 수
없습니다. 앱에 로그인한 상태에서 브라우저 콘솔에 한 줄 실행하면 끝입니다:
fetch("https://hive-note-worker.variouscafe.workers.dev/api/search/reinde
x", {method:"POST",
credentials:"include"}).then(r=>r.json()).then(console.log)
→ {total: 3, indexed: 3, skipped: 0} 비슷하게 나오면 완료입니다. (쿠키는
워커 도메인 기반이라 credentials:"include"로 전송됩니다.)
참고
토큰을 더 쓰고 응답이 1~수초 걸립니다(품질은 좋습니다). 속도/비용
우선이면 glm-4-flash나 glm-4.6-air로 바꾸는 것도 좋습니다 —
wrangler.toml의 GLM_MODEL만 바꾸고 재배포하면 됩니다. 원하시면 제가
교체+재배포해드릴게요.
한 번이면 충분합니다.
⏺ 완료했습니다. Cloudflare Vectorize + Workers AI(bge-m3) + GLM RAG로 노트 기반 AI 검색
전체 파이프라인을 구현했고, 모든 타입체크와 wrangler 설정 검증을 통과했습니다.
구현된 아키텍처
질문 (Cmd/Ctrl+K 또는 헤더 검색 버튼)
→ POST /api/search/ai
① Workers AI(bge-m3, 1024차원)로 질문 임베딩
② Vectorize(cosine)에서 { authorUserId } 필터로 본인 노트 topK 검색
③ D1에서 본문 보강 + 권한/삭제 재확인 (snippet 생성)
④ 검색 결과를 컨텍스트로 GLM RAG 답변+출처 생성
→ UI: AI 답변 + 관련 노트 목록(클릭 시 페이지 이동)
저장소 분리: D1 = 원본(진실), Vectorize = 임베딩(검색용)
인덱싱 시점: 명시적 저장(발행) 시만 갱신 / 자동저장은 D1만 / 삭제 시 벡터 제거
우아한 저하: GLM_API_KEY 미설정·실패 시 답변 생략, 의미 검색 결과만 반환
변경/추가 파일
Worker (백엔드)
wrangler.toml · src/env.ts — VECTORIZE, AI 바인딩 + GLM_*/ADMIN_EMAIL 추가
migrations/0002_vectorize.sql — pages.embedded_at 컬럼(백필 멱등성)
src/util/text.ts — 마크다운→평문 정제, 임베딩 텍스트/스니펫 생성
src/ai/embeddings.ts — embed/indexPage/unindexPage/semanticSearch (bge-m3)
src/ai/rag.ts — GLM OpenAI 호환 RAG 답변 생성
src/routes/search.ts — POST /ai(AI검색), POST /reindex(admin 백필)
src/routes/pages.ts · src/db/pages.ts — 생명주기 임베딩 훅 + setEmbeddedAt
Pages (프론트)
src/api/search.ts — aiSearch() 클라이언트
src/components/search/AiSearchDialog.tsx — AI 검색 다이얼로그
src/pages/Workspace.tsx — 검색 버튼 + Cmd/Ctrl+K 단축키
공유/문서
packages/shared/src/schemas.ts — AiSearch* 스키마
docs/VECTORIZE.md — 설정/운영 가이드
⚠️ 직접 실행하셔야 할 설정 (제가 대신할 수 없는 부분)
cd apps/worker
wrangler vectorize create hive-note-vector --dimensions 1024 --metric cosine
pnpm db:apply:remote # embedded_at 마이그레이션
wrangler secret put GLM_API_KEY # z.ai 키 (생략 시 검색 결과만 동작)
pnpm deploy
자세한 절차와 비고(긴 노트 한계, 재색인 등)는 docs/VECTORIZE.md에 정리했습니다.
GLM 기본값을 glm-4.6 / https://api.z.ai/api/paas/v4로 잡아뒀습니다. 사용 중인 키가
BigModel CN이거나 다른 모델명이면 wrangler.toml의 GLM_BASE_URL/GLM_MODEL만 바꾸시면
됩니다.